Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(649)

Unified Diff: mojo/public/tools/dart_package.py

Issue 1132063007: Rationalize Dart mojo and sky package structure (Closed) Base URL: https://github.com/domokit/mojo.git@master
Patch Set: Created 5 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « mojo/public/tools/dart_list_packages_contents.py ('k') | mojo/public/tools/dart_package_name.py » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: mojo/public/tools/dart_package.py
diff --git a/mojo/public/tools/dart_package.py b/mojo/public/tools/dart_package.py
new file mode 100755
index 0000000000000000000000000000000000000000..083a6d51e0b4bbb86f12785ca7a2f802e8d42ae9
--- /dev/null
+++ b/mojo/public/tools/dart_package.py
@@ -0,0 +1,135 @@
+#!/usr/bin/env python
+#
+# Copyright 2014 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+"""Archives a set of dart packages"""
+
+import ast
+import optparse
+import os
+import sys
+import zipfile
+
+def IsPackagesPath(path):
+ return path.startswith('packages/')
+
+def IsMojomPath(path):
+ return path.startswith('mojom/lib/')
+
+def IsMojomDartFile(path):
+ return path.endswith('.mojom.dart')
+
+# Strips off mojom/lib/ returning module/interface.mojom.dart
+def MojomDartRelativePath(path):
+ assert IsMojomPath(path)
+ assert IsMojomDartFile(path)
+ return os.path.relpath(path, 'mojom/lib/')
+
+# Line is a line from pubspec.yaml
+def PackageName(line):
+ assert line.startswith("name:")
+ return line.split(":")[1].strip()
+
+# pubspec_contents is the contents of a pubspec.yaml file, returns the package
+# name.
+def FindPackageName(pubspec_contents):
+ for line in pubspec_contents.splitlines():
+ if line.startswith("name:"):
+ return PackageName(line)
+
+# Returns true if path is in lib/.
+def IsPathInLib(path):
+ return path.startswith("lib/")
+
+# Strips off lib/
+def PackageRelativePath(path):
+ return os.path.relpath(path, "lib/")
+
+def DoZip(inputs, zip_inputs, output, base_dir):
+ files = []
+ with zipfile.ZipFile(output, 'w', zipfile.ZIP_DEFLATED) as outfile:
+ # Loose file inputs (package source files)
+ for f in inputs:
+ file_name = os.path.relpath(f, base_dir)
+ # We should never see a packages/ path here.
+ assert not IsPackagesPath(file_name)
+ # We should never see a .mojom.dart path here.
+ files.append(file_name)
+ outfile.write(f, file_name)
+ # zip file inputs (other packages)
+ for zf_name in zip_inputs:
+ with zipfile.ZipFile(zf_name, 'r') as zf:
+ # Attempt to sniff package_name. If this fails, we are processing a zip
+ # file with mojom.dart bindings or a packages/ dump.
+ package_name = None
+ try:
+ with zf.open("pubspec.yaml") as pubspec_file:
+ package_name = FindPackageName(pubspec_file.read())
+ except KeyError:
+ pass
+
+ # Iterate over all files in zip file.
+ for f in zf.namelist():
+
+ # Copy any direct mojom dependencies into mojom/
+ if IsMojomPath(f):
+ mojom_dep_copy = os.path.join("lib/mojom/",
+ MojomDartRelativePath(f))
+ if mojom_dep_copy not in files:
+ files.append(mojom_dep_copy)
+ with zf.open(f) as zff:
+ outfile.writestr(mojom_dep_copy, zff.read())
+
+ # Rewrite output file name, if it isn't a packages/ path.
+ output_name = None
+ if not IsPackagesPath(f):
+ if IsMojomDartFile(f) and IsMojomPath(f):
+ # Place mojom/lib/*.mojom.dart files into packages/mojom/
+ output_name = os.path.join("packages/mojom/",
+ MojomDartRelativePath(f))
+ else:
+ # We are processing a package, it must have a package name.
+ assert not (package_name is None)
+ package_path = os.path.join("packages/", package_name)
+ if IsPathInLib(f):
+ output_name = os.path.join(package_path, PackageRelativePath(f))
+ else:
+ output_name = f;
+
+ if output_name is None:
+ continue
+
+ if output_name not in files:
+ files.append(output_name)
+ with zf.open(f) as zff:
+ outfile.writestr(output_name, zff.read())
+
+
+def main():
+ parser = optparse.OptionParser()
+
+ parser.add_option('--inputs', help='List of files to archive.')
+ parser.add_option('--link-inputs',
+ help='List of files to archive. Symbolic links are resolved.')
+ parser.add_option('--zip-inputs', help='List of zip files to re-archive.')
+ parser.add_option('--output', help='Path to output archive.')
+ parser.add_option('--base-dir',
+ help='If provided, the paths in the archive will be '
+ 'relative to this directory', default='.')
+ options, _ = parser.parse_args()
+
+ inputs = []
+ if (options.inputs):
+ inputs = ast.literal_eval(options.inputs)
+ zip_inputs = []
+ if options.zip_inputs:
+ zip_inputs = ast.literal_eval(options.zip_inputs)
+ output = options.output
+ base_dir = options.base_dir
+
+ DoZip(inputs, zip_inputs, output, base_dir)
+
+if __name__ == '__main__':
+ sys.exit(main())
« no previous file with comments | « mojo/public/tools/dart_list_packages_contents.py ('k') | mojo/public/tools/dart_package_name.py » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698