| 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 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 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): | 58 class PushToTrunkOptions(CommonOptions): |
| 59 @staticmethod | 59 @staticmethod |
| 60 def MakeForcedOptions(author, reviewer, chrome_path): | 60 def MakeForcedOptions(author, reviewer, chrome_path): |
| 61 """Convenience wrapper.""" | 61 """Convenience wrapper.""" |
| 62 class Options(object): | 62 class Options(object): |
| 63 pass | 63 pass |
| 64 options = Options() | 64 options = Options() |
| 65 options.s = 0 | 65 options.step = 0 |
| 66 options.l = None | 66 options.last_push = None |
| 67 options.b = None | 67 options.last_bleeding_edge = None |
| 68 options.f = True | 68 options.force = True |
| 69 options.m = False | 69 options.manual = False |
| 70 options.c = chrome_path | 70 options.chromium = chrome_path |
| 71 options.reviewer = reviewer | 71 options.reviewer = reviewer |
| 72 options.a = author | 72 options.author = author |
| 73 return PushToTrunkOptions(options) | 73 return PushToTrunkOptions(options) |
| 74 | 74 |
| 75 def __init__(self, options): | 75 def __init__(self, options): |
| 76 super(PushToTrunkOptions, self).__init__(options, options.m) | 76 super(PushToTrunkOptions, self).__init__(options, options.manual) |
| 77 self.requires_editor = not options.f | 77 self.requires_editor = not options.force |
| 78 self.wait_for_lgtm = not options.f | 78 self.wait_for_lgtm = not options.force |
| 79 self.tbr_commit = not options.m | 79 self.tbr_commit = not options.manual |
| 80 self.l = options.l | 80 self.last_push = options.last_push |
| 81 self.reviewer = options.reviewer | 81 self.reviewer = options.reviewer |
| 82 self.c = options.c | 82 self.chromium = options.chromium |
| 83 self.b = getattr(options, 'b', None) | 83 self.last_bleeding_edge = getattr(options, 'last_bleeding_edge', None) |
| 84 self.author = getattr(options, 'a', None) | 84 self.author = getattr(options, 'author', None) |
| 85 | 85 |
| 86 | 86 |
| 87 class Preparation(Step): | 87 class Preparation(Step): |
| 88 MESSAGE = "Preparation." | 88 MESSAGE = "Preparation." |
| 89 | 89 |
| 90 def RunStep(self): | 90 def RunStep(self): |
| 91 self.InitialEnvironmentChecks() | 91 self.InitialEnvironmentChecks() |
| 92 self.CommonPrepare() | 92 self.CommonPrepare() |
| 93 self.PrepareBranch() | 93 self.PrepareBranch() |
| 94 self.DeleteBranch(self.Config(TRUNKBRANCH)) | 94 self.DeleteBranch(self.Config(TRUNKBRANCH)) |
| 95 | 95 |
| 96 | 96 |
| 97 class FreshBranch(Step): | 97 class FreshBranch(Step): |
| 98 MESSAGE = "Create a fresh branch." | 98 MESSAGE = "Create a fresh branch." |
| 99 | 99 |
| 100 def RunStep(self): | 100 def RunStep(self): |
| 101 self.GitCreateBranch(self.Config(BRANCHNAME), "svn/bleeding_edge") | 101 self.GitCreateBranch(self.Config(BRANCHNAME), "svn/bleeding_edge") |
| 102 | 102 |
| 103 | 103 |
| 104 class DetectLastPush(Step): | 104 class DetectLastPush(Step): |
| 105 MESSAGE = "Detect commit ID of last push to trunk." | 105 MESSAGE = "Detect commit ID of last push to trunk." |
| 106 | 106 |
| 107 def RunStep(self): | 107 def RunStep(self): |
| 108 last_push = self._options.l or self.FindLastTrunkPush() | 108 last_push = self._options.last_push or self.FindLastTrunkPush() |
| 109 while True: | 109 while True: |
| 110 # Print assumed commit, circumventing git's pager. | 110 # Print assumed commit, circumventing git's pager. |
| 111 print self.GitLog(n=1, git_hash=last_push) | 111 print self.GitLog(n=1, git_hash=last_push) |
| 112 if self.Confirm("Is the commit printed above the last push to trunk?"): | 112 if self.Confirm("Is the commit printed above the last push to trunk?"): |
| 113 break | 113 break |
| 114 last_push = self.FindLastTrunkPush(parent_hash=last_push) | 114 last_push = self.FindLastTrunkPush(parent_hash=last_push) |
| 115 | 115 |
| 116 if self._options.b: | 116 if self._options.last_bleeding_edge: |
| 117 # Read the bleeding edge revision of the last push from a command-line | 117 # Read the bleeding edge revision of the last push from a command-line |
| 118 # option. | 118 # option. |
| 119 last_push_bleeding_edge = self._options.b | 119 last_push_bleeding_edge = self._options.last_bleeding_edge |
| 120 else: | 120 else: |
| 121 # Retrieve the bleeding edge revision of the last push from the text in | 121 # Retrieve the bleeding edge revision of the last push from the text in |
| 122 # the push commit message. | 122 # the push commit message. |
| 123 last_push_title = self.GitLog(n=1, format="%s", git_hash=last_push) | 123 last_push_title = self.GitLog(n=1, format="%s", git_hash=last_push) |
| 124 last_push_be_svn = PUSH_MESSAGE_RE.match(last_push_title).group(1) | 124 last_push_be_svn = PUSH_MESSAGE_RE.match(last_push_title).group(1) |
| 125 if not last_push_be_svn: | 125 if not last_push_be_svn: |
| 126 self.Die("Could not retrieve bleeding edge revision for trunk push %s" | 126 self.Die("Could not retrieve bleeding edge revision for trunk push %s" |
| 127 % last_push) | 127 % last_push) |
| 128 last_push_bleeding_edge = self.GitSVNFindGitHash(last_push_be_svn) | 128 last_push_bleeding_edge = self.GitSVNFindGitHash(last_push_be_svn) |
| 129 if not last_push_bleeding_edge: | 129 if not last_push_bleeding_edge: |
| (...skipping 278 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 408 MESSAGE = "Tag the new revision." | 408 MESSAGE = "Tag the new revision." |
| 409 | 409 |
| 410 def RunStep(self): | 410 def RunStep(self): |
| 411 self.GitSVNTag(self["version"]) | 411 self.GitSVNTag(self["version"]) |
| 412 | 412 |
| 413 | 413 |
| 414 class CheckChromium(Step): | 414 class CheckChromium(Step): |
| 415 MESSAGE = "Ask for chromium checkout." | 415 MESSAGE = "Ask for chromium checkout." |
| 416 | 416 |
| 417 def Run(self): | 417 def Run(self): |
| 418 self["chrome_path"] = self._options.c | 418 self["chrome_path"] = self._options.chromium |
| 419 if not self["chrome_path"]: | 419 if not self["chrome_path"]: |
| 420 self.DieNoManualMode("Please specify the path to a Chromium checkout in " | 420 self.DieNoManualMode("Please specify the path to a Chromium checkout in " |
| 421 "forced mode.") | 421 "forced mode.") |
| 422 print ("Do you have a \"NewGit\" Chromium checkout and want " | 422 print ("Do you have a \"NewGit\" Chromium checkout and want " |
| 423 "this script to automate creation of the roll CL? If yes, enter the " | 423 "this script to automate creation of the roll CL? If yes, enter the " |
| 424 "path to (and including) the \"src\" directory here, otherwise just " | 424 "path to (and including) the \"src\" directory here, otherwise just " |
| 425 "press <Return>: "), | 425 "press <Return>: "), |
| 426 self["chrome_path"] = self.ReadLine() | 426 self["chrome_path"] = self.ReadLine() |
| 427 | 427 |
| 428 | 428 |
| (...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 540 SwitchV8, | 540 SwitchV8, |
| 541 CleanUp, | 541 CleanUp, |
| 542 ] | 542 ] |
| 543 | 543 |
| 544 RunScript(step_classes, config, options, side_effect_handler) | 544 RunScript(step_classes, config, options, side_effect_handler) |
| 545 | 545 |
| 546 | 546 |
| 547 def BuildOptions(): | 547 def BuildOptions(): |
| 548 parser = argparse.ArgumentParser() | 548 parser = argparse.ArgumentParser() |
| 549 group = parser.add_mutually_exclusive_group() | 549 group = parser.add_mutually_exclusive_group() |
| 550 group.add_argument("-f", "--force", dest="f", | 550 group.add_argument("-f", "--force", |
| 551 help="Don't prompt the user.", | 551 help="Don't prompt the user.", |
| 552 default=False, action="store_true") | 552 default=False, action="store_true") |
| 553 group.add_argument("-m", "--manual", dest="m", | 553 group.add_argument("-m", "--manual", |
| 554 help="Prompt the user at every important step.", | 554 help="Prompt the user at every important step.", |
| 555 default=False, action="store_true") | 555 default=False, action="store_true") |
| 556 parser.add_argument("-a", "--author", dest="a", | 556 parser.add_argument("-a", "--author", |
| 557 help="The author email used for rietveld.") | 557 help="The author email used for rietveld.") |
| 558 parser.add_argument("-b", "--last-bleeding-edge", dest="b", | 558 parser.add_argument("-b", "--last-bleeding-edge", |
| 559 help=("The git commit ID of the last bleeding edge " | 559 help=("The git commit ID of the last bleeding edge " |
| 560 "revision that was pushed to trunk. This is used " | 560 "revision that was pushed to trunk. This is used " |
| 561 "for the auto-generated ChangeLog entry.")) | 561 "for the auto-generated ChangeLog entry.")) |
| 562 parser.add_argument("-c", "--chromium", dest="c", | 562 parser.add_argument("-c", "--chromium", |
| 563 help=("The path to your Chromium src/ directory to " | 563 help=("The path to your Chromium src/ directory to " |
| 564 "automate the V8 roll.")) | 564 "automate the V8 roll.")) |
| 565 parser.add_argument("-l", "--last-push", dest="l", | 565 parser.add_argument("-l", "--last-push", |
| 566 help="The git commit ID of the last push to trunk.") | 566 help="The git commit ID of the last push to trunk.") |
| 567 parser.add_argument("-r", "--reviewer", | 567 parser.add_argument("-r", "--reviewer", |
| 568 help="The account name to be used for reviews.") | 568 help="The account name to be used for reviews.") |
| 569 parser.add_argument("-s", "--step", dest="s", | 569 parser.add_argument("-s", "--step", |
| 570 help="The step where to start work. Default: 0.", | 570 help="The step where to start work. Default: 0.", |
| 571 default=0, type=int) | 571 default=0, type=int) |
| 572 return parser | 572 return parser |
| 573 | 573 |
| 574 | 574 |
| 575 def ProcessOptions(options): | 575 def ProcessOptions(options): |
| 576 if options.s < 0: | 576 if options.step < 0: |
| 577 print "Bad step number %d" % options.s | 577 print "Bad step number %d" % options.step |
| 578 return False | 578 return False |
| 579 if not options.m and not options.reviewer: | 579 if not options.manual and not options.reviewer: |
| 580 print "A reviewer (-r) is required in (semi-)automatic mode." | 580 print "A reviewer (-r) is required in (semi-)automatic mode." |
| 581 return False | 581 return False |
| 582 if not options.m and not options.c: | 582 if not options.manual and not options.chromium: |
| 583 print "A chromium checkout (-c) is required in (semi-)automatic mode." | 583 print "A chromium checkout (-c) is required in (semi-)automatic mode." |
| 584 return False | 584 return False |
| 585 if not options.m and not options.a: | 585 if not options.manual and not options.author: |
| 586 print "Specify your chromium.org email with -a in (semi-)automatic mode." | 586 print "Specify your chromium.org email with -a in (semi-)automatic mode." |
| 587 return False | 587 return False |
| 588 return True | 588 return True |
| 589 | 589 |
| 590 | 590 |
| 591 def Main(): | 591 def Main(): |
| 592 parser = BuildOptions() | 592 parser = BuildOptions() |
| 593 options = parser.parse_args() | 593 options = parser.parse_args() |
| 594 if not ProcessOptions(options): | 594 if not ProcessOptions(options): |
| 595 parser.print_help() | 595 parser.print_help() |
| 596 return 1 | 596 return 1 |
| 597 RunPushToTrunk(CONFIG, PushToTrunkOptions(options)) | 597 RunPushToTrunk(CONFIG, PushToTrunkOptions(options)) |
| 598 | 598 |
| 599 if __name__ == "__main__": | 599 if __name__ == "__main__": |
| 600 sys.exit(Main()) | 600 sys.exit(Main()) |
| OLD | NEW |