diff options
Diffstat (limited to 'deps/v8/tools/release/auto_roll.py')
-rwxr-xr-x | deps/v8/tools/release/auto_roll.py | 222 |
1 files changed, 158 insertions, 64 deletions
diff --git a/deps/v8/tools/release/auto_roll.py b/deps/v8/tools/release/auto_roll.py index f7692cf6f9..27fd370971 100755 --- a/deps/v8/tools/release/auto_roll.py +++ b/deps/v8/tools/release/auto_roll.py @@ -4,61 +4,68 @@ # found in the LICENSE file. import argparse -import json import os import sys -import urllib from common_includes import * -import chromium_roll +ROLL_SUMMARY = ("Summary of changes available at:\n" + "https://chromium.googlesource.com/v8/v8/+log/%s..%s") -class CheckActiveRoll(Step): - MESSAGE = "Check active roll." +ISSUE_MSG = ( +"""Please follow these instructions for assigning/CC'ing issues: +https://github.com/v8/v8/wiki/Triaging%20issues - @staticmethod - def ContainsChromiumRoll(changes): - for change in changes: - if change["subject"].startswith("Update V8 to"): - return True - return False +Please close rolling in case of a roll revert: +https://v8-roll.appspot.com/ +This only works with a Google account.""") + +class Preparation(Step): + MESSAGE = "Preparation." def RunStep(self): - params = { - "closed": 3, - "owner": self._options.author, - "limit": 30, - "format": "json", - } - params = urllib.urlencode(params) - search_url = "https://codereview.chromium.org/search" - result = self.ReadURL(search_url, params, wait_plan=[5, 20]) - if self.ContainsChromiumRoll(json.loads(result)["results"]): - print "Stop due to existing Chromium roll." - return True + self['json_output']['monitoring_state'] = 'preparation' + # Update v8 remote tracking branches. + self.GitFetchOrigin() + self.Git("fetch origin +refs/tags/*:refs/tags/*") class DetectLastRoll(Step): MESSAGE = "Detect commit ID of the last Chromium roll." def RunStep(self): + self['json_output']['monitoring_state'] = 'detect_last_roll' + self["last_roll"] = self._options.last_roll + if not self["last_roll"]: + # Interpret the DEPS file to retrieve the v8 revision. + # TODO(machenbach): This should be part or the roll-deps api of + # depot_tools. + Var = lambda var: '%s' + exec(FileToText(os.path.join(self._options.chromium, "DEPS"))) + + # The revision rolled last. + self["last_roll"] = vars['v8_revision'] + self["last_version"] = self.GetVersionTag(self["last_roll"]) + assert self["last_version"], "The last rolled v8 revision is not tagged." + + +class DetectRevisionToRoll(Step): + MESSAGE = "Detect commit ID of the V8 revision to roll." + + def RunStep(self): + self['json_output']['monitoring_state'] = 'detect_revision' + self["roll"] = self._options.revision + if self["roll"]: + # If the revision was passed on the cmd line, continue script execution + # in the next step. + return False + # The revision that should be rolled. Check for the latest of the most # recent releases based on commit timestamp. revisions = self.GetRecentReleases( max_age=self._options.max_age * DAY_IN_SECONDS) assert revisions, "Didn't find any recent release." - # Interpret the DEPS file to retrieve the v8 revision. - # TODO(machenbach): This should be part or the roll-deps api of - # depot_tools. - Var = lambda var: '%s' - exec(FileToText(os.path.join(self._options.chromium, "DEPS"))) - - # The revision rolled last. - self["last_roll"] = vars['v8_revision'] - last_version = self.GetVersionTag(self["last_roll"]) - assert last_version, "The last rolled v8 revision is not tagged." - # There must be some progress between the last roll and the new candidate # revision (i.e. we don't go backwards). The revisions are ordered newest # to oldest. It is possible that the newest timestamp has no progress @@ -68,35 +75,107 @@ class DetectLastRoll(Step): version = self.GetVersionTag(revision) assert version, "Internal error. All recent releases should have a tag" - if SortingKey(last_version) < SortingKey(version): + if SortingKey(self["last_version"]) < SortingKey(version): self["roll"] = revision break else: print("There is no newer v8 revision than the one in Chromium (%s)." % self["last_roll"]) + self['json_output']['monitoring_state'] = 'up_to_date' return True -class RollChromium(Step): - MESSAGE = "Roll V8 into Chromium." +class PrepareRollCandidate(Step): + MESSAGE = "Robustness checks of the roll candidate." def RunStep(self): - if self._options.roll: - args = [ - "--author", self._options.author, - "--reviewer", self._options.reviewer, - "--chromium", self._options.chromium, - "--last-roll", self["last_roll"], - "--use-commit-queue", - self["roll"], - ] - if self._options.sheriff: - args.append("--sheriff") - if self._options.dry_run: - args.append("--dry-run") - if self._options.work_dir: - args.extend(["--work-dir", self._options.work_dir]) - self._side_effect_handler.Call(chromium_roll.ChromiumRoll().Run, args) + self['json_output']['monitoring_state'] = 'prepare_candidate' + self["roll_title"] = self.GitLog(n=1, format="%s", + git_hash=self["roll"]) + + # Make sure the last roll and the roll candidate are releases. + version = self.GetVersionTag(self["roll"]) + assert version, "The revision to roll is not tagged." + version = self.GetVersionTag(self["last_roll"]) + assert version, "The revision used as last roll is not tagged." + + +class SwitchChromium(Step): + MESSAGE = "Switch to Chromium checkout." + + def RunStep(self): + self['json_output']['monitoring_state'] = 'switch_chromium' + cwd = self._options.chromium + self.InitialEnvironmentChecks(cwd) + # Check for a clean workdir. + if not self.GitIsWorkdirClean(cwd=cwd): # pragma: no cover + self.Die("Workspace is not clean. Please commit or undo your changes.") + # Assert that the DEPS file is there. + if not os.path.exists(os.path.join(cwd, "DEPS")): # pragma: no cover + self.Die("DEPS file not present.") + + +class UpdateChromiumCheckout(Step): + MESSAGE = "Update the checkout and create a new branch." + + def RunStep(self): + self['json_output']['monitoring_state'] = 'update_chromium' + cwd = self._options.chromium + self.GitCheckout("master", cwd=cwd) + self.DeleteBranch("work-branch", cwd=cwd) + self.Command("gclient", "sync --nohooks", cwd=cwd) + self.GitPull(cwd=cwd) + + # Update v8 remotes. + self.GitFetchOrigin() + + self.GitCreateBranch("work-branch", cwd=cwd) + + +class UploadCL(Step): + MESSAGE = "Create and upload CL." + + def RunStep(self): + self['json_output']['monitoring_state'] = 'upload' + cwd = self._options.chromium + # Patch DEPS file. + if self.Command("roll-dep-svn", "v8 %s" % + self["roll"], cwd=cwd) is None: + self.Die("Failed to create deps for %s" % self["roll"]) + + message = [] + message.append("Update V8 to %s." % self["roll_title"].lower()) + + message.append( + ROLL_SUMMARY % (self["last_roll"][:8], self["roll"][:8])) + + message.append(ISSUE_MSG) + + message.append("TBR=%s" % self._options.reviewer) + self.GitCommit("\n\n".join(message), author=self._options.author, cwd=cwd) + if not self._options.dry_run: + self.GitUpload(author=self._options.author, + force=True, + cq=self._options.use_commit_queue, + cwd=cwd) + print "CL uploaded." + else: + print "Dry run - don't upload." + + self.GitCheckout("master", cwd=cwd) + self.GitDeleteBranch("work-branch", cwd=cwd) + +class CleanUp(Step): + MESSAGE = "Done!" + + def RunStep(self): + self['json_output']['monitoring_state'] = 'success' + print("Congratulations, you have successfully rolled %s into " + "Chromium." + % self["roll"]) + + # Clean up all temporary files. + Command("rm", "-f %s*" % self._config["PERSISTFILE_BASENAME"]) class AutoRoll(ScriptsBase): @@ -104,30 +183,45 @@ class AutoRoll(ScriptsBase): parser.add_argument("-c", "--chromium", required=True, help=("The path to your Chromium src/ " "directory to automate the V8 roll.")) - parser.add_argument("--max-age", default=3, type=int, + parser.add_argument("--last-roll", + help="The git commit ID of the last rolled version. " + "Auto-detected if not specified.") + parser.add_argument("--max-age", default=7, type=int, help="Maximum age in days of the latest release.") - parser.add_argument("--roll", help="Call Chromium roll script.", - default=False, action="store_true") + parser.add_argument("--revision", + help="Revision to roll. Auto-detected if not " + "specified."), + parser.add_argument("--roll", help="Deprecated.", + default=True, action="store_true") + parser.add_argument("--use-commit-queue", + help="Check the CQ bit on upload.", + default=True, action="store_true") def _ProcessOptions(self, options): # pragma: no cover - if not options.reviewer: - print "A reviewer (-r) is required." - return False - if not options.author: - print "An author (-a) is required." + if not options.author or not options.reviewer: + print "A reviewer (-r) and an author (-a) are required." return False + + options.requires_editor = False + options.force = True + options.manual = False return True def _Config(self): return { - "PERSISTFILE_BASENAME": "/tmp/v8-auto-roll-tempfile", + "PERSISTFILE_BASENAME": "/tmp/v8-chromium-roll-tempfile", } def _Steps(self): return [ - CheckActiveRoll, + Preparation, DetectLastRoll, - RollChromium, + DetectRevisionToRoll, + PrepareRollCandidate, + SwitchChromium, + UpdateChromiumCheckout, + UploadCL, + CleanUp, ] |