OLD | NEW |
1 #!/usr/bin/env python | 1 #!/usr/bin/env python |
2 # Copyright 2013 the V8 project authors. All rights reserved. | 2 # Copyright 2013 the V8 project authors. All rights reserved. |
3 # Redistribution and use in source and binary forms, with or without | 3 # Redistribution and use in source and binary forms, with or without |
4 # modification, are permitted provided that the following conditions are | 4 # modification, are permitted provided that the following conditions are |
5 # met: | 5 # met: |
6 # | 6 # |
7 # * Redistributions of source code must retain the above copyright | 7 # * Redistributions of source code must retain the above copyright |
8 # notice, this list of conditions and the following disclaimer. | 8 # notice, this list of conditions and the following disclaimer. |
9 # * Redistributions in binary form must reproduce the above | 9 # * Redistributions in binary form must reproduce the above |
10 # copyright notice, this list of conditions and the following | 10 # copyright notice, this list of conditions and the following |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
48 CHANGELOG_ENTRY_FILE: "/tmp/v8-push-to-trunk-tempfile-changelog-entry", | 48 CHANGELOG_ENTRY_FILE: "/tmp/v8-push-to-trunk-tempfile-changelog-entry", |
49 PATCH_FILE: "/tmp/v8-push-to-trunk-tempfile-patch-file", | 49 PATCH_FILE: "/tmp/v8-push-to-trunk-tempfile-patch-file", |
50 COMMITMSG_FILE: "/tmp/v8-push-to-trunk-tempfile-commitmsg", | 50 COMMITMSG_FILE: "/tmp/v8-push-to-trunk-tempfile-commitmsg", |
51 DEPS_FILE: "DEPS", | 51 DEPS_FILE: "DEPS", |
52 } | 52 } |
53 | 53 |
54 PUSH_MESSAGE_SUFFIX = " (based on bleeding_edge revision r%d)" | 54 PUSH_MESSAGE_SUFFIX = " (based on bleeding_edge revision r%d)" |
55 PUSH_MESSAGE_RE = re.compile(r".* \(based on bleeding_edge revision r(\d+)\)$") | 55 PUSH_MESSAGE_RE = re.compile(r".* \(based on bleeding_edge revision r(\d+)\)$") |
56 | 56 |
57 | 57 |
58 class PushToTrunkOptions(CommonOptions): | |
59 @staticmethod | |
60 def MakeForcedOptions(author, reviewer, chrome_path): | |
61 """Convenience wrapper.""" | |
62 class Options(object): | |
63 pass | |
64 options = Options() | |
65 options.step = 0 | |
66 options.last_push = None | |
67 options.last_bleeding_edge = None | |
68 options.force = True | |
69 options.manual = False | |
70 options.chromium = chrome_path | |
71 options.reviewer = reviewer | |
72 options.author = author | |
73 return PushToTrunkOptions(options) | |
74 | |
75 def __init__(self, options): | |
76 super(PushToTrunkOptions, self).__init__(options, options.manual) | |
77 self.requires_editor = not options.force | |
78 self.wait_for_lgtm = not options.force | |
79 self.tbr_commit = not options.manual | |
80 self.last_push = options.last_push | |
81 self.reviewer = options.reviewer | |
82 self.chromium = options.chromium | |
83 self.last_bleeding_edge = getattr(options, 'last_bleeding_edge', None) | |
84 self.author = getattr(options, 'author', None) | |
85 | |
86 | |
87 class Preparation(Step): | 58 class Preparation(Step): |
88 MESSAGE = "Preparation." | 59 MESSAGE = "Preparation." |
89 | 60 |
90 def RunStep(self): | 61 def RunStep(self): |
91 self.InitialEnvironmentChecks() | 62 self.InitialEnvironmentChecks() |
92 self.CommonPrepare() | 63 self.CommonPrepare() |
93 self.PrepareBranch() | 64 self.PrepareBranch() |
94 self.DeleteBranch(self.Config(TRUNKBRANCH)) | 65 self.DeleteBranch(self.Config(TRUNKBRANCH)) |
95 | 66 |
96 | 67 |
(...skipping 407 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
504 "Chromium, and to update the v8rel spreadsheet:" | 475 "Chromium, and to update the v8rel spreadsheet:" |
505 % self["version"]) | 476 % self["version"]) |
506 print "%s\ttrunk\t%s" % (self["version"], | 477 print "%s\ttrunk\t%s" % (self["version"], |
507 self["trunk_revision"]) | 478 self["trunk_revision"]) |
508 | 479 |
509 self.CommonCleanup() | 480 self.CommonCleanup() |
510 if self.Config(TRUNKBRANCH) != self["current_branch"]: | 481 if self.Config(TRUNKBRANCH) != self["current_branch"]: |
511 self.GitDeleteBranch(self.Config(TRUNKBRANCH)) | 482 self.GitDeleteBranch(self.Config(TRUNKBRANCH)) |
512 | 483 |
513 | 484 |
514 def RunPushToTrunk(config, | 485 class PushToTrunk(ScriptsBase): |
515 options, | 486 def _PrepareOptions(self, parser): |
516 side_effect_handler=DEFAULT_SIDE_EFFECT_HANDLER): | 487 group = parser.add_mutually_exclusive_group() |
517 step_classes = [ | 488 group.add_argument("-f", "--force", |
518 Preparation, | 489 help="Don't prompt the user.", |
519 FreshBranch, | 490 default=False, action="store_true") |
520 DetectLastPush, | 491 group.add_argument("-m", "--manual", |
521 PrepareChangeLog, | 492 help="Prompt the user at every important step.", |
522 EditChangeLog, | 493 default=False, action="store_true") |
523 IncrementVersion, | 494 parser.add_argument("-b", "--last-bleeding-edge", |
524 CommitLocal, | 495 help=("The git commit ID of the last bleeding edge " |
525 UploadStep, | 496 "revision that was pushed to trunk. This is " |
526 CommitRepository, | 497 "used for the auto-generated ChangeLog entry.")) |
527 StragglerCommits, | 498 parser.add_argument("-c", "--chromium", |
528 SquashCommits, | 499 help=("The path to your Chromium src/ " |
529 NewBranch, | 500 "directory to automate the V8 roll.")) |
530 ApplyChanges, | 501 parser.add_argument("-l", "--last-push", |
531 SetVersion, | 502 help="The git commit ID of the last push to trunk.") |
532 CommitTrunk, | |
533 SanityCheck, | |
534 CommitSVN, | |
535 TagRevision, | |
536 CheckChromium, | |
537 SwitchChromium, | |
538 UpdateChromiumCheckout, | |
539 UploadCL, | |
540 SwitchV8, | |
541 CleanUp, | |
542 ] | |
543 | 503 |
544 RunScript(step_classes, config, options, side_effect_handler) | 504 def _ProcessOptions(self, options): |
| 505 if not options.manual and not options.reviewer: |
| 506 print "A reviewer (-r) is required in (semi-)automatic mode." |
| 507 return False |
| 508 if not options.manual and not options.chromium: |
| 509 print "A chromium checkout (-c) is required in (semi-)automatic mode." |
| 510 return False |
| 511 if not options.manual and not options.author: |
| 512 print "Specify your chromium.org email with -a in (semi-)automatic mode." |
| 513 return False |
| 514 |
| 515 options.tbr_commit = not options.manual |
| 516 return True |
| 517 |
| 518 def _Steps(self): |
| 519 return [ |
| 520 Preparation, |
| 521 FreshBranch, |
| 522 DetectLastPush, |
| 523 PrepareChangeLog, |
| 524 EditChangeLog, |
| 525 IncrementVersion, |
| 526 CommitLocal, |
| 527 UploadStep, |
| 528 CommitRepository, |
| 529 StragglerCommits, |
| 530 SquashCommits, |
| 531 NewBranch, |
| 532 ApplyChanges, |
| 533 SetVersion, |
| 534 CommitTrunk, |
| 535 SanityCheck, |
| 536 CommitSVN, |
| 537 TagRevision, |
| 538 CheckChromium, |
| 539 SwitchChromium, |
| 540 UpdateChromiumCheckout, |
| 541 UploadCL, |
| 542 SwitchV8, |
| 543 CleanUp, |
| 544 ] |
545 | 545 |
546 | 546 |
547 def BuildOptions(): | |
548 parser = argparse.ArgumentParser() | |
549 group = parser.add_mutually_exclusive_group() | |
550 group.add_argument("-f", "--force", | |
551 help="Don't prompt the user.", | |
552 default=False, action="store_true") | |
553 group.add_argument("-m", "--manual", | |
554 help="Prompt the user at every important step.", | |
555 default=False, action="store_true") | |
556 parser.add_argument("-a", "--author", | |
557 help="The author email used for rietveld.") | |
558 parser.add_argument("-b", "--last-bleeding-edge", | |
559 help=("The git commit ID of the last bleeding edge " | |
560 "revision that was pushed to trunk. This is used " | |
561 "for the auto-generated ChangeLog entry.")) | |
562 parser.add_argument("-c", "--chromium", | |
563 help=("The path to your Chromium src/ directory to " | |
564 "automate the V8 roll.")) | |
565 parser.add_argument("-l", "--last-push", | |
566 help="The git commit ID of the last push to trunk.") | |
567 parser.add_argument("-r", "--reviewer", | |
568 help="The account name to be used for reviews.") | |
569 parser.add_argument("-s", "--step", | |
570 help="The step where to start work. Default: 0.", | |
571 default=0, type=int) | |
572 return parser | |
573 | |
574 | |
575 def ProcessOptions(options): | |
576 if options.step < 0: | |
577 print "Bad step number %d" % options.step | |
578 return False | |
579 if not options.manual and not options.reviewer: | |
580 print "A reviewer (-r) is required in (semi-)automatic mode." | |
581 return False | |
582 if not options.manual and not options.chromium: | |
583 print "A chromium checkout (-c) is required in (semi-)automatic mode." | |
584 return False | |
585 if not options.manual and not options.author: | |
586 print "Specify your chromium.org email with -a in (semi-)automatic mode." | |
587 return False | |
588 return True | |
589 | |
590 | |
591 def Main(): | |
592 parser = BuildOptions() | |
593 options = parser.parse_args() | |
594 if not ProcessOptions(options): | |
595 parser.print_help() | |
596 return 1 | |
597 RunPushToTrunk(CONFIG, PushToTrunkOptions(options)) | |
598 | |
599 if __name__ == "__main__": | 547 if __name__ == "__main__": |
600 sys.exit(Main()) | 548 sys.exit(PushToTrunk(CONFIG).Run()) |
OLD | NEW |