| #!/usr/bin/env python3 | 
 | # Copyright 2016 The Dart project authors. All rights reserved. | 
 | # Use of this source code is governed by a BSD-style license that can be | 
 | # found in the LICENSE file. | 
 |  | 
 | # Usage: create_pkg_manifest.py --deps <DEPS file> --output <jiri manifest> | 
 | # | 
 | # This script parses the DEPS file, extracts dependencies that live under | 
 | # third_party/pkg, and writes them to a file suitable for consumption as a | 
 | # jiri manifest for Fuchsia. It is assumed that the Dart tree is under | 
 | # //dart in the Fuchsia world, and so the dependencies extracted by this script | 
 | # will go under //dart/third_party/pkg. | 
 |  | 
 | import argparse | 
 | import os | 
 | import sys | 
 | import utils | 
 |  | 
 | SCRIPT_DIR = os.path.dirname(sys.argv[0]) | 
 | DART_ROOT = os.path.realpath(os.path.join(SCRIPT_DIR, '..')) | 
 |  | 
 |  | 
 | # Used in parsing the DEPS file. | 
 | class VarImpl(object): | 
 |     _env_vars = { | 
 |         "host_cpu": "x64", | 
 |         "host_os": "linux", | 
 |     } | 
 |  | 
 |     def __init__(self, local_scope): | 
 |         self._local_scope = local_scope | 
 |  | 
 |     def Lookup(self, var_name): | 
 |         """Implements the Var syntax.""" | 
 |         if var_name in self._local_scope.get("vars", {}): | 
 |             return self._local_scope["vars"][var_name] | 
 |         # Inject default values for env variables | 
 |         if var_name in self._env_vars: | 
 |             return self._env_vars[var_name] | 
 |         raise Exception("Var is not defined: %s" % var_name) | 
 |  | 
 |  | 
 | def ParseDepsFile(deps_file): | 
 |     local_scope = {} | 
 |     var = VarImpl(local_scope) | 
 |     global_scope = { | 
 |         'Var': var.Lookup, | 
 |         'deps_os': {}, | 
 |     } | 
 |     # Read the content. | 
 |     with open(deps_file, 'r') as fp: | 
 |         deps_content = fp.read() | 
 |  | 
 |     # Eval the content. | 
 |     exec (deps_content, global_scope, local_scope) | 
 |  | 
 |     # Extract the deps and filter. | 
 |     deps = local_scope.get('deps', {}) | 
 |     filtered_deps = {} | 
 |     for k, v in deps.items(): | 
 |         if 'sdk/third_party/pkg' in k: | 
 |             new_key = k.replace('sdk', 'third_party/dart', 1) | 
 |             filtered_deps[new_key] = v | 
 |  | 
 |     return filtered_deps | 
 |  | 
 |  | 
 | def WriteManifest(deps, manifest_file): | 
 |     project_template = """ | 
 |     <project name="%s" | 
 |              path="%s" | 
 |              remote="%s" | 
 |              revision="%s"/> | 
 | """ | 
 |     warning = ( | 
 |         '<!-- This file is generated by ' | 
 |         '//third_party/dart/tools/create_pkg_manifest.py. DO NOT EDIT -->\n') | 
 |     with open(manifest_file, 'w') as manifest: | 
 |         manifest.write('<?xml version="1.0" encoding="UTF-8"?>\n') | 
 |         manifest.write(warning) | 
 |         manifest.write('<manifest>\n') | 
 |         manifest.write('  <projects>\n') | 
 |         for path, remote in sorted(deps.items()): | 
 |             remote_components = remote.split('@') | 
 |             remote_url = remote_components[0] | 
 |             remote_version = remote_components[1] | 
 |             manifest.write( | 
 |                 project_template % (path, path, remote_url, remote_version)) | 
 |         manifest.write('  </projects>\n') | 
 |         manifest.write('</manifest>\n') | 
 |  | 
 |  | 
 | def ParseArgs(args): | 
 |     args = args[1:] | 
 |     parser = argparse.ArgumentParser( | 
 |         description='A script to generate a jiri manifest for third_party/pkg.') | 
 |  | 
 |     parser.add_argument( | 
 |         '--deps', | 
 |         '-d', | 
 |         type=str, | 
 |         help='Input DEPS file.', | 
 |         default=os.path.join(DART_ROOT, 'DEPS')) | 
 |     parser.add_argument( | 
 |         '--output', | 
 |         '-o', | 
 |         type=str, | 
 |         help='Output jiri manifest.', | 
 |         default=os.path.join(DART_ROOT, 'dart_third_party_pkg.manifest')) | 
 |  | 
 |     return parser.parse_args(args) | 
 |  | 
 |  | 
 | def Main(argv): | 
 |     args = ParseArgs(argv) | 
 |     deps = ParseDepsFile(args.deps) | 
 |     WriteManifest(deps, args.output) | 
 |     return 0 | 
 |  | 
 |  | 
 | if __name__ == '__main__': | 
 |     sys.exit(Main(sys.argv)) |