1 # Copyright (C) 2018 and later: Unicode, Inc. and others.
2 # License & terms of use: http://www.unicode.org/copyright.html
4 # Python 2/3 Compatibility (ICU-20299)
5 # TODO(ICU-20301): Remove this.
6 from __future__
import print_function
14 if isinstance(file, LocalFile
):
15 return get_local_dirname(file.dirname
)
16 if isinstance(file, SrcFile
):
18 if isinstance(file, InFile
):
20 if isinstance(file, TmpFile
):
22 if isinstance(file, OutFile
):
24 if isinstance(file, PkgFile
):
29 LOCAL_DIRNAME_SUBSTITUTIONS
= {
31 "FILTERS": "{FILTERS_DIR}",
36 def get_local_dirname(dirname
):
37 if dirname
.startswith("/"):
39 elif dirname
.startswith("$"):
40 # Note: directory separator substitution happens later
41 sep_idx
= dirname
.find("/")
43 sep_idx
= len(dirname
)
44 variable
= dirname
[1:sep_idx
]
45 if variable
in LOCAL_DIRNAME_SUBSTITUTIONS
:
46 return LOCAL_DIRNAME_SUBSTITUTIONS
[variable
] + dirname
[sep_idx
:]
48 "Error: Local directory must be absolute, or relative to one of: " +
49 (", ".join("$%s" % v
for v
in LOCAL_DIRNAME_SUBSTITUTIONS
.keys())),
68 def concat_dicts(*dicts
):
69 # There is not a super great way to do this in Python:
76 def repeated_execution_request_looper(request
):
77 # dictionary of lists to list of dictionaries:
79 dict(zip(request
.repeat_with
, t
))
80 for t
in zip(*request
.repeat_with
.values())
83 # No special options given in repeat_with
84 ld
= [{} for _
in range(len(request
.input_files
))]
85 return zip(ld
, request
.specific_dep_files
, request
.input_files
, request
.output_files
)
88 def format_single_request_command(request
, cmd_template
, common_vars
):
89 return cmd_template
.format(
90 ARGS
= request
.args
.format(
91 INPUT_FILES
= [file.filename
for file in request
.input_files
],
92 OUTPUT_FILES
= [file.filename
for file in request
.output_files
],
93 **concat_dicts(common_vars
, request
.format_with
)
98 def format_repeated_request_command(request
, cmd_template
, loop_vars
, common_vars
):
99 (iter_vars
, _
, input_file
, output_file
) = loop_vars
100 return cmd_template
.format(
101 ARGS
= request
.args
.format(
102 INPUT_FILE
= input_file
.filename
,
103 OUTPUT_FILE
= output_file
.filename
,
104 **concat_dicts(common_vars
, request
.format_with
, iter_vars
)
109 def flatten_requests(requests
, config
, common_vars
):
111 for request
in requests
:
112 result
+= request
.flatten(config
, requests
, common_vars
)
116 def get_all_output_files(requests
, include_tmp
=False):
118 for request
in requests
:
119 files
+= request
.all_output_files()
121 # Filter out all files but those in OUT_DIR if necessary.
122 # It is also easy to filter for uniqueness; do it right now and return.
124 files
= (file for file in files
if isinstance(file, OutFile
))
125 return list(set(files
))
127 # Filter for unique values. NOTE: Cannot use set() because we need to accept same filename as
128 # OutFile and TmpFile as different, and by default they evaluate as equal.
129 return [f
for _
, f
in set((type(f
), f
) for f
in files
)]
132 def compute_directories(requests
):
134 for file in get_all_output_files(requests
, include_tmp
=True):
135 path
= "%s/%s" % (dir_for(file), file.filename
)
136 dirs
.add(path
[:path
.rfind("/")])
137 return list(sorted(dirs
))
140 class SpaceSeparatedList(list):
141 """A list that joins itself with spaces when converted to a string."""
143 return " ".join(self
)