Index: build/android/gyp/util/build_utils.py |
diff --git a/build/android/gyp/util/build_utils.py b/build/android/gyp/util/build_utils.py |
index 9b74f689d6db875dc132fd92a729165ff3dfbf85..9ceb3fff18381fc3d87f2524bb9d593399fa5a29 100644 |
--- a/build/android/gyp/util/build_utils.py |
+++ b/build/android/gyp/util/build_utils.py |
@@ -198,6 +198,8 @@ def ExtractAll(zip_path, path=None, no_clobber=True): |
with zipfile.ZipFile(zip_path) as z: |
for name in z.namelist(): |
+ if name.endswith('/'): |
+ continue |
CheckZipPath(name) |
if no_clobber: |
output_path = os.path.join(path, name) |
@@ -216,6 +218,16 @@ def DoZip(inputs, output, base_dir): |
outfile.write(f, os.path.relpath(f, base_dir)) |
+def ZipDir(output, base_dir): |
+ with zipfile.ZipFile(output, 'w') as outfile: |
+ for root, _, files in os.walk(base_dir): |
+ for f in files: |
+ path = os.path.join(root, f) |
+ archive_path = os.path.relpath(path, base_dir) |
+ CheckZipPath(archive_path) |
+ outfile.write(path, archive_path) |
+ |
+ |
def PrintWarning(message): |
print 'WARNING: ' + message |
@@ -226,6 +238,42 @@ def PrintBigWarning(message): |
print '***** ' * 8 |
+def GetSortedTransitiveDependencies(top, deps_func): |
+ """Gets the list of all transitive dependencies in sorted order. |
+ |
+ There should be no cycles in the dependency graph. |
+ |
+ Args: |
+ top: a list of the top level nodes |
+ deps_func: A function that takes a node and returns its direct dependencies. |
+ Returns: |
+ A list of all transitive dependencies of nodes in top, in order (a node will |
+ appear in the list at a higher index than all of its dependencies). |
+ """ |
+ def Node(dep): |
+ return (dep, deps_func(dep)) |
+ |
+ # First: find all deps |
+ unchecked_deps = list(top) |
+ all_deps = set(top) |
+ while unchecked_deps: |
+ dep = unchecked_deps.pop() |
+ new_deps = deps_func(dep).difference(all_deps) |
+ unchecked_deps.extend(new_deps) |
+ all_deps = all_deps.union(new_deps) |
+ |
+ # Then: simple, slow topological sort. |
+ sorted_deps = [] |
+ unsorted_deps = dict(map(Node, all_deps)) |
+ while unsorted_deps: |
+ for library, dependencies in unsorted_deps.items(): |
+ if not dependencies.intersection(unsorted_deps.keys()): |
+ sorted_deps.append(library) |
+ del unsorted_deps[library] |
+ |
+ return sorted_deps |
+ |
+ |
def GetPythonDependencies(): |
"""Gets the paths of imported non-system python modules. |