|  | #!/usr/bin/env python2.7 | 
|  | # | 
|  | # Copyright 2020 The Fuchsia Authors. All rights reserved. | 
|  | # Use of this source code is governed by a BSD-style license that can be | 
|  | # found in the LICENSE file. | 
|  | """Prepares a directory and a corresponding package definition which can be | 
|  | used to create a CIPD package.""" | 
|  |  | 
|  | import argparse | 
|  | import os | 
|  | import sys | 
|  |  | 
|  |  | 
|  | def main(args): | 
|  | parser = argparse.ArgumentParser() | 
|  | parser.add_argument( | 
|  | '--pkg-name', type=str, required=True, help='Name of the CIPD package.') | 
|  | parser.add_argument( | 
|  | '--description', | 
|  | type=str, | 
|  | required=True, | 
|  | help='Description of the CIPD package.') | 
|  | parser.add_argument( | 
|  | '--pkg-root', type=str, required=True, help='Path to the package root.') | 
|  | parser.add_argument( | 
|  | '--install-mode', | 
|  | type=str, | 
|  | choices=['copy', 'symlink'], | 
|  | required=True, | 
|  | help='CIPD install mode.') | 
|  | parser.add_argument( | 
|  | '--pkg-def', | 
|  | type=str, | 
|  | required=True, | 
|  | help='Path to the output package definition.') | 
|  | parser.add_argument( | 
|  | '--depfile', type=str, required=True, help='Path to the depfile.') | 
|  | parser.add_argument( | 
|  | '--files', | 
|  | nargs='+', | 
|  | default=(), | 
|  | help='Files relative to --pkg-root to include in the ' | 
|  | 'package definition.') | 
|  | parser.add_argument( | 
|  | '--directories', | 
|  | nargs='+', | 
|  | default=(), | 
|  | help='Directories relative to --pkg-root to include in ' | 
|  | 'the package definition.') | 
|  | parser.add_argument( | 
|  | '--copy-files', | 
|  | nargs='+', | 
|  | default=(), | 
|  | help='Files to be copied into --pkg-root and included ' | 
|  | 'in the package definition.') | 
|  | args = parser.parse_args(args) | 
|  |  | 
|  | pkg_def = { | 
|  | 'package': args.pkg_name, | 
|  | 'description': args.description, | 
|  | 'root': args.pkg_root, | 
|  | 'install_mode': args.install_mode, | 
|  | 'data': [], | 
|  | } | 
|  |  | 
|  | deps = set() | 
|  | # Include files and directories in the package definition. | 
|  | for relpath in args.files: | 
|  | pkg_def['data'].append({'file': relpath}) | 
|  | deps.add(os.path.join(args.pkg_root, relpath)) | 
|  | for relpath in args.directories: | 
|  | pkg_def['data'].append({'dir': relpath}) | 
|  | deps.add(os.path.join(args.pkg_root, relpath)) | 
|  |  | 
|  | # Copy files into the root and include in the package definition. | 
|  | if args.copy_files: | 
|  | for filepath in args.copy_files: | 
|  | basename = os.path.basename(filepath) | 
|  | dest = os.path.join(args.pkg_root, basename) | 
|  | if not os.path.exists(dest): | 
|  | os.link(filepath, dest) | 
|  | pkg_def['data'].append({'file': basename}) | 
|  | deps.add(dest) | 
|  |  | 
|  | with open(args.pkg_def, 'w') as f: | 
|  | print_yaml(pkg_def, f) | 
|  | with open(args.depfile, 'w') as f: | 
|  | f.writelines('%s: %s\n' % (args.pkg_def, ' '.join(sorted(deps)))) | 
|  |  | 
|  | return 0 | 
|  |  | 
|  |  | 
|  | def print_yaml_item(item, out): | 
|  | keys = list(item.keys()) | 
|  | keys.sort() | 
|  | first = True | 
|  | for key in keys: | 
|  | if first: | 
|  | out.write('- %s: %s\n' % (key, item[key])) | 
|  | first = False | 
|  | else: | 
|  | out.write('  %s: %s\n' % (key, item[key])) | 
|  |  | 
|  |  | 
|  | def print_yaml(o, out): | 
|  | keys = list(o.keys()) | 
|  | keys.sort() | 
|  | for k in keys: | 
|  | val = o[k] | 
|  | if isinstance(val, (list, set)): | 
|  | out.write('%s:\n' % k) | 
|  | for item in val: | 
|  | print_yaml_item(item, out) | 
|  | elif isinstance(val, (str, unicode)): | 
|  | out.write('%s: %s\n' % (k, val)) | 
|  |  | 
|  |  | 
|  | if __name__ == '__main__': | 
|  | sys.exit(main(sys.argv[1:])) |