Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 # Copyright 2013 The Chromium Authors. All rights reserved. | 1 # Copyright 2013 The Chromium Authors. All rights reserved. |
| 2 # Use of this source code is governed by a BSD-style license that can be | 2 # Use of this source code is governed by a BSD-style license that can be |
| 3 # found in the LICENSE file. | 3 # found in the LICENSE file. |
| 4 | 4 |
| 5 import ast | 5 import ast |
| 6 import contextlib | 6 import contextlib |
| 7 import fnmatch | 7 import fnmatch |
| 8 import json | 8 import json |
| 9 import os | 9 import os |
| 10 import pipes | 10 import pipes |
| (...skipping 180 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 191 | 191 |
| 192 | 192 |
| 193 def ExtractAll(zip_path, path=None, no_clobber=True): | 193 def ExtractAll(zip_path, path=None, no_clobber=True): |
| 194 if path is None: | 194 if path is None: |
| 195 path = os.getcwd() | 195 path = os.getcwd() |
| 196 elif not os.path.exists(path): | 196 elif not os.path.exists(path): |
| 197 MakeDirectory(path) | 197 MakeDirectory(path) |
| 198 | 198 |
| 199 with zipfile.ZipFile(zip_path) as z: | 199 with zipfile.ZipFile(zip_path) as z: |
| 200 for name in z.namelist(): | 200 for name in z.namelist(): |
| 201 if name.endswith('/'): | |
| 202 continue | |
| 201 CheckZipPath(name) | 203 CheckZipPath(name) |
| 202 if no_clobber: | 204 if no_clobber: |
| 203 output_path = os.path.join(path, name) | 205 output_path = os.path.join(path, name) |
| 204 if os.path.exists(output_path): | 206 if os.path.exists(output_path): |
| 205 raise Exception( | 207 raise Exception( |
| 206 'Path already exists from zip: %s %s %s' | 208 'Path already exists from zip: %s %s %s' |
| 207 % (zip_path, name, output_path)) | 209 % (zip_path, name, output_path)) |
| 208 | 210 |
| 209 z.extractall(path=path) | 211 z.extractall(path=path) |
| 210 | 212 |
| 211 | 213 |
| 212 def DoZip(inputs, output, base_dir): | 214 def DoZip(inputs, output, base_dir): |
| 213 with zipfile.ZipFile(output, 'w') as outfile: | 215 with zipfile.ZipFile(output, 'w') as outfile: |
| 214 for f in inputs: | 216 for f in inputs: |
| 215 CheckZipPath(os.path.relpath(f, base_dir)) | 217 CheckZipPath(os.path.relpath(f, base_dir)) |
| 216 outfile.write(f, os.path.relpath(f, base_dir)) | 218 outfile.write(f, os.path.relpath(f, base_dir)) |
| 217 | 219 |
| 218 | 220 |
| 221 def ZipDir(output, base_dir): | |
| 222 with zipfile.ZipFile(output, 'w') as outfile: | |
| 223 for root, _, files in os.walk(base_dir): | |
| 224 for f in files: | |
| 225 path = os.path.join(root, f) | |
| 226 archive_path = os.path.relpath(path, base_dir) | |
| 227 CheckZipPath(archive_path) | |
| 228 outfile.write(path, archive_path) | |
| 229 | |
| 230 | |
| 219 def PrintWarning(message): | 231 def PrintWarning(message): |
| 220 print 'WARNING: ' + message | 232 print 'WARNING: ' + message |
| 221 | 233 |
| 222 | 234 |
| 223 def PrintBigWarning(message): | 235 def PrintBigWarning(message): |
| 224 print '***** ' * 8 | 236 print '***** ' * 8 |
| 225 PrintWarning(message) | 237 PrintWarning(message) |
| 226 print '***** ' * 8 | 238 print '***** ' * 8 |
| 227 | 239 |
| 228 | 240 |
| 241 def GetSortedTransitiveDependencies(top, deps_func): | |
| 242 """Gets the list of all transitive dependencies in sorted order. | |
| 243 | |
| 244 There should be no cycles in the dependency graph. | |
| 245 | |
| 246 Args: | |
| 247 top: a list of the top level nodes | |
| 248 deps_func: A function that takes a node and returns its direct dependencies. | |
| 249 Returns: | |
| 250 A list of all transitve dependencies of nodes in top, in order (a node will | |
|
newt (away)
2014/07/09 00:25:49
"transitive"
cjhopman
2014/07/09 23:42:18
Done.
| |
| 251 appear in the list at a higher index than all of its dependencies). | |
| 252 """ | |
| 253 def Node(dep): | |
| 254 return (dep, deps_func(dep)) | |
| 255 | |
| 256 # First: find all deps | |
| 257 unchecked_deps = list(top) | |
| 258 all_deps = set(top) | |
| 259 while unchecked_deps: | |
| 260 dep = unchecked_deps.pop() | |
| 261 new_deps = deps_func(dep).difference(all_deps) | |
| 262 unchecked_deps.extend(new_deps) | |
| 263 all_deps = all_deps.union(new_deps) | |
| 264 | |
| 265 # Then: simple, slow topological sort. | |
| 266 sorted_deps = [] | |
| 267 unsorted_deps = dict(map(Node, all_deps)) | |
| 268 while unsorted_deps: | |
| 269 for library, dependencies in unsorted_deps.items(): | |
| 270 if not dependencies.intersection(unsorted_deps.keys()): | |
| 271 sorted_deps.append(library) | |
| 272 del unsorted_deps[library] | |
| 273 | |
| 274 return sorted_deps | |
| 275 | |
| 276 | |
| 229 def GetPythonDependencies(): | 277 def GetPythonDependencies(): |
| 230 """Gets the paths of imported non-system python modules. | 278 """Gets the paths of imported non-system python modules. |
| 231 | 279 |
| 232 A path is assumed to be a "system" import if it is outside of chromium's | 280 A path is assumed to be a "system" import if it is outside of chromium's |
| 233 src/. The paths will be relative to the current directory. | 281 src/. The paths will be relative to the current directory. |
| 234 """ | 282 """ |
| 235 module_paths = (m.__file__ for m in sys.modules.itervalues() | 283 module_paths = (m.__file__ for m in sys.modules.itervalues() |
| 236 if m is not None and hasattr(m, '__file__')) | 284 if m is not None and hasattr(m, '__file__')) |
| 237 | 285 |
| 238 abs_module_paths = map(os.path.abspath, module_paths) | 286 abs_module_paths = map(os.path.abspath, module_paths) |
| (...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 296 if not file_path in file_jsons: | 344 if not file_path in file_jsons: |
| 297 file_jsons[file_path] = ReadJson(file_path) | 345 file_jsons[file_path] = ReadJson(file_path) |
| 298 | 346 |
| 299 expansion = file_jsons[file_path] | 347 expansion = file_jsons[file_path] |
| 300 for k in lookup_path[1:]: | 348 for k in lookup_path[1:]: |
| 301 expansion = expansion[k] | 349 expansion = expansion[k] |
| 302 | 350 |
| 303 new_args[i] = arg[:start] + str(expansion) + arg[end + 1:] | 351 new_args[i] = arg[:start] + str(expansion) + arg[end + 1:] |
| 304 return new_args | 352 return new_args |
| 305 | 353 |
| OLD | NEW |