| OLD | NEW |
| 1 #!/usr/bin/env python | 1 #!/usr/bin/env python |
| 2 # Copyright 2015 The LUCI Authors. All rights reserved. | 2 # Copyright 2015 The LUCI Authors. All rights reserved. |
| 3 # Use of this source code is governed under the Apache License, Version 2.0 | 3 # Use of this source code is governed under the Apache License, Version 2.0 |
| 4 # that can be found in the LICENSE file. | 4 # that can be found in the LICENSE file. |
| 5 | 5 |
| 6 """Tool to interact with recipe repositories. | 6 """Tool to interact with recipe repositories. |
| 7 | 7 |
| 8 This tool operates on the nearest ancestor directory containing an | 8 This tool operates on the nearest ancestor directory containing an |
| 9 infra/config/recipes.cfg. | 9 infra/config/recipes.cfg. |
| 10 """ | 10 """ |
| (...skipping 208 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 219 return handle_recipe_return( | 219 return handle_recipe_return( |
| 220 ret, args.output_result_json, stream_engine, engine_flags) | 220 ret, args.output_result_json, stream_engine, engine_flags) |
| 221 | 221 |
| 222 | 222 |
| 223 def remote(args): | 223 def remote(args): |
| 224 from recipe_engine import remote | 224 from recipe_engine import remote |
| 225 | 225 |
| 226 return remote.main(args) | 226 return remote.main(args) |
| 227 | 227 |
| 228 | 228 |
| 229 def autoroll(repo_root, config_file, args): | |
| 230 from recipe_engine import autoroll | |
| 231 | |
| 232 if args.verbose_json and not args.output_json: | |
| 233 print >> sys.stderr, '--verbose-json passed without --output-json' | |
| 234 return 1 | |
| 235 | |
| 236 return autoroll.main(args, repo_root, config_file) | |
| 237 | |
| 238 | |
| 239 class ProjectOverrideAction(argparse.Action): | 229 class ProjectOverrideAction(argparse.Action): |
| 240 def __call__(self, parser, namespace, values, option_string=None): | 230 def __call__(self, parser, namespace, values, option_string=None): |
| 241 p = values.split('=', 2) | 231 p = values.split('=', 2) |
| 242 if len(p) != 2: | 232 if len(p) != 2: |
| 243 raise ValueError('Override must have the form: repo=path') | 233 raise ValueError('Override must have the form: repo=path') |
| 244 project_id, path = p | 234 project_id, path = p |
| 245 | 235 |
| 246 v = getattr(namespace, self.dest, None) | 236 v = getattr(namespace, self.dest, None) |
| 247 if v is None: | 237 if v is None: |
| 248 v = {} | 238 v = {} |
| (...skipping 134 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 383 | 373 |
| 384 return post_process_args | 374 return post_process_args |
| 385 | 375 |
| 386 | 376 |
| 387 def main(): | 377 def main(): |
| 388 parser = argparse.ArgumentParser( | 378 parser = argparse.ArgumentParser( |
| 389 description='Interact with the recipe system.') | 379 description='Interact with the recipe system.') |
| 390 | 380 |
| 391 common_postprocess_func = add_common_args(parser) | 381 common_postprocess_func = add_common_args(parser) |
| 392 | 382 |
| 393 from recipe_engine import fetch, lint_test, bundle, depgraph | 383 from recipe_engine import fetch, lint_test, bundle, depgraph, autoroll |
| 394 to_add = [fetch, lint_test, bundle, depgraph] | 384 to_add = [fetch, lint_test, bundle, depgraph, autoroll] |
| 395 | 385 |
| 396 subp = parser.add_subparsers() | 386 subp = parser.add_subparsers() |
| 397 for module in to_add: | 387 for module in to_add: |
| 398 module.add_subparser(subp) | 388 module.add_subparser(subp) |
| 399 | 389 |
| 400 test_p = subp.add_parser( | 390 test_p = subp.add_parser( |
| 401 'test', | 391 'test', |
| 402 description='Generate or check expectations by simulation') | 392 description='Generate or check expectations by simulation') |
| 403 test_p.set_defaults(command='test') | 393 test_p.set_defaults(command='test') |
| 404 test_p.add_argument('args', nargs=argparse.REMAINDER) | 394 test_p.add_argument('args', nargs=argparse.REMAINDER) |
| (...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 493 type=os.path.abspath, | 483 type=os.path.abspath, |
| 494 help='The working directory of repo checkout') | 484 help='The working directory of repo checkout') |
| 495 remote_p.add_argument( | 485 remote_p.add_argument( |
| 496 '--use-gitiles', action='store_true', | 486 '--use-gitiles', action='store_true', |
| 497 help='Use Gitiles-specific way to fetch repo (potentially cheaper for ' | 487 help='Use Gitiles-specific way to fetch repo (potentially cheaper for ' |
| 498 'large repos)') | 488 'large repos)') |
| 499 remote_p.add_argument( | 489 remote_p.add_argument( |
| 500 'remote_args', nargs='*', | 490 'remote_args', nargs='*', |
| 501 help='Arguments to pass to fetched repo\'s recipes.py') | 491 help='Arguments to pass to fetched repo\'s recipes.py') |
| 502 | 492 |
| 503 autoroll_p = subp.add_parser( | |
| 504 'autoroll', | |
| 505 help='Roll dependencies of a recipe package forward (implies fetch)') | |
| 506 autoroll_p.set_defaults(command='autoroll') | |
| 507 autoroll_p.add_argument( | |
| 508 '--output-json', | |
| 509 type=os.path.abspath, | |
| 510 help='A json file to output information about the roll to.') | |
| 511 autoroll_p.add_argument( | |
| 512 '--verbose-json', | |
| 513 action='store_true', | |
| 514 help=('Emit even more data in the output-json file. ' | |
| 515 'Requires --output-json.')) | |
| 516 | 493 |
| 517 refs_p = subp.add_parser( | 494 refs_p = subp.add_parser( |
| 518 'refs', | 495 'refs', |
| 519 description='List places referencing given recipe module(s).') | 496 description='List places referencing given recipe module(s).') |
| 520 refs_p.set_defaults(command='refs') | 497 refs_p.set_defaults(command='refs') |
| 521 refs_p.add_argument('modules', nargs='+', help='Module(s) to query for') | 498 refs_p.add_argument('modules', nargs='+', help='Module(s) to query for') |
| 522 refs_p.add_argument('--transitive', action='store_true', | 499 refs_p.add_argument('--transitive', action='store_true', |
| 523 help='Compute transitive closure of the references') | 500 help='Compute transitive closure of the references') |
| 524 | 501 |
| 525 doc_kinds=('binarypb', 'jsonpb', 'textpb', 'markdown(github)', | 502 doc_kinds=('binarypb', 'jsonpb', 'textpb', 'markdown(github)', |
| (...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 651 # an infra failure, rather than a test failure. | 628 # an infra failure, rather than a test failure. |
| 652 return 2 | 629 return 2 |
| 653 | 630 |
| 654 if hasattr(args, 'func'): | 631 if hasattr(args, 'func'): |
| 655 return args.func(package_deps, args) | 632 return args.func(package_deps, args) |
| 656 | 633 |
| 657 if args.command == 'test': | 634 if args.command == 'test': |
| 658 return test(config_file, package_deps, args) | 635 return test(config_file, package_deps, args) |
| 659 elif args.command == 'run': | 636 elif args.command == 'run': |
| 660 return run(config_file, package_deps, args) | 637 return run(config_file, package_deps, args) |
| 661 elif args.command == 'autoroll': | |
| 662 return autoroll(repo_root, config_file, args) | |
| 663 elif args.command == 'refs': | 638 elif args.command == 'refs': |
| 664 return refs(config_file, package_deps, args) | 639 return refs(config_file, package_deps, args) |
| 665 elif args.command == 'doc': | 640 elif args.command == 'doc': |
| 666 return doc(config_file, package_deps, args) | 641 return doc(config_file, package_deps, args) |
| 667 else: | 642 else: |
| 668 print """Dear sir or madam, | 643 print """Dear sir or madam, |
| 669 It has come to my attention that a quite impossible condition has come | 644 It has come to my attention that a quite impossible condition has come |
| 670 to pass in the specification you have issued a request for us to fulfill. | 645 to pass in the specification you have issued a request for us to fulfill. |
| 671 It is with a heavy heart that I inform you that, at the present juncture, | 646 It is with a heavy heart that I inform you that, at the present juncture, |
| 672 there is no conceivable next action to be taken upon your request, and as | 647 there is no conceivable next action to be taken upon your request, and as |
| (...skipping 23 matching lines...) Expand all Loading... |
| 696 | 671 |
| 697 if not isinstance(ret, int): | 672 if not isinstance(ret, int): |
| 698 if ret is None: | 673 if ret is None: |
| 699 ret = 0 | 674 ret = 0 |
| 700 else: | 675 else: |
| 701 print >> sys.stderr, ret | 676 print >> sys.stderr, ret |
| 702 ret = 1 | 677 ret = 1 |
| 703 sys.stdout.flush() | 678 sys.stdout.flush() |
| 704 sys.stderr.flush() | 679 sys.stderr.flush() |
| 705 os._exit(ret) | 680 os._exit(ret) |
| OLD | NEW |