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

Side by Side 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 unified diff | Download patch
OLDNEW
(Empty)
1 #!/usr/bin/env python
2 #
3 # Copyright 2014 The Chromium Authors. All rights reserved.
4 # Use of this source code is governed by a BSD-style license that can be
5 # found in the LICENSE file.
6
7 """Archives a set of dart packages"""
8
9 import ast
10 import optparse
11 import os
12 import sys
13 import zipfile
14
15 def IsPackagesPath(path):
16 return path.startswith('packages/')
17
18 def IsMojomPath(path):
19 return path.startswith('mojom/lib/')
20
21 def IsMojomDartFile(path):
22 return path.endswith('.mojom.dart')
23
24 # Strips off mojom/lib/ returning module/interface.mojom.dart
25 def MojomDartRelativePath(path):
26 assert IsMojomPath(path)
27 assert IsMojomDartFile(path)
28 return os.path.relpath(path, 'mojom/lib/')
29
30 # Line is a line from pubspec.yaml
31 def PackageName(line):
32 assert line.startswith("name:")
33 return line.split(":")[1].strip()
34
35 # pubspec_contents is the contents of a pubspec.yaml file, returns the package
36 # name.
37 def FindPackageName(pubspec_contents):
38 for line in pubspec_contents.splitlines():
39 if line.startswith("name:"):
40 return PackageName(line)
41
42 # Returns true if path is in lib/.
43 def IsPathInLib(path):
44 return path.startswith("lib/")
45
46 # Strips off lib/
47 def PackageRelativePath(path):
48 return os.path.relpath(path, "lib/")
49
50 def DoZip(inputs, zip_inputs, output, base_dir):
51 files = []
52 with zipfile.ZipFile(output, 'w', zipfile.ZIP_DEFLATED) as outfile:
53 # Loose file inputs (package source files)
54 for f in inputs:
55 file_name = os.path.relpath(f, base_dir)
56 # We should never see a packages/ path here.
57 assert not IsPackagesPath(file_name)
58 # We should never see a .mojom.dart path here.
59 files.append(file_name)
60 outfile.write(f, file_name)
61 # zip file inputs (other packages)
62 for zf_name in zip_inputs:
63 with zipfile.ZipFile(zf_name, 'r') as zf:
64 # Attempt to sniff package_name. If this fails, we are processing a zip
65 # file with mojom.dart bindings or a packages/ dump.
66 package_name = None
67 try:
68 with zf.open("pubspec.yaml") as pubspec_file:
69 package_name = FindPackageName(pubspec_file.read())
70 except KeyError:
71 pass
72
73 # Iterate over all files in zip file.
74 for f in zf.namelist():
75
76 # Copy any direct mojom dependencies into mojom/
77 if IsMojomPath(f):
78 mojom_dep_copy = os.path.join("lib/mojom/",
79 MojomDartRelativePath(f))
80 if mojom_dep_copy not in files:
81 files.append(mojom_dep_copy)
82 with zf.open(f) as zff:
83 outfile.writestr(mojom_dep_copy, zff.read())
84
85 # Rewrite output file name, if it isn't a packages/ path.
86 output_name = None
87 if not IsPackagesPath(f):
88 if IsMojomDartFile(f) and IsMojomPath(f):
89 # Place mojom/lib/*.mojom.dart files into packages/mojom/
90 output_name = os.path.join("packages/mojom/",
91 MojomDartRelativePath(f))
92 else:
93 # We are processing a package, it must have a package name.
94 assert not (package_name is None)
95 package_path = os.path.join("packages/", package_name)
96 if IsPathInLib(f):
97 output_name = os.path.join(package_path, PackageRelativePath(f))
98 else:
99 output_name = f;
100
101 if output_name is None:
102 continue
103
104 if output_name not in files:
105 files.append(output_name)
106 with zf.open(f) as zff:
107 outfile.writestr(output_name, zff.read())
108
109
110 def main():
111 parser = optparse.OptionParser()
112
113 parser.add_option('--inputs', help='List of files to archive.')
114 parser.add_option('--link-inputs',
115 help='List of files to archive. Symbolic links are resolved.')
116 parser.add_option('--zip-inputs', help='List of zip files to re-archive.')
117 parser.add_option('--output', help='Path to output archive.')
118 parser.add_option('--base-dir',
119 help='If provided, the paths in the archive will be '
120 'relative to this directory', default='.')
121 options, _ = parser.parse_args()
122
123 inputs = []
124 if (options.inputs):
125 inputs = ast.literal_eval(options.inputs)
126 zip_inputs = []
127 if options.zip_inputs:
128 zip_inputs = ast.literal_eval(options.zip_inputs)
129 output = options.output
130 base_dir = options.base_dir
131
132 DoZip(inputs, zip_inputs, output, base_dir)
133
134 if __name__ == '__main__':
135 sys.exit(main())
OLDNEW
« 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