Index: tools/release/auto_roll.py |
diff --git a/tools/release/auto_roll.py b/tools/release/auto_roll.py |
index 06bd92d6d109cdcf2474cc73c300f457a8f54fa9..16b80e840d501fcb85656be7f98f766cbe0fd0e3 100755 |
--- a/tools/release/auto_roll.py |
+++ b/tools/release/auto_roll.py |
@@ -4,36 +4,65 @@ |
# 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") |
+ |
+ISSUE_MSG = ( |
+"""Please follow these instructions for assigning/CC'ing issues: |
+https://code.google.com/p/v8-wiki/wiki/TriagingIssues |
+ |
+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): |
+ # 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["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["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 |
@@ -43,7 +72,7 @@ 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: |
@@ -52,26 +81,92 @@ class DetectLastRoll(Step): |
return True |
-class RollChromium(Step): |
- MESSAGE = "Roll V8 into Chromium." |
+class PrepareRollCandidate(Step): |
+ MESSAGE = "Robustness checks of the roll candidate." |
+ |
+ def RunStep(self): |
+ 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): |
+ 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): |
- 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.dry_run: |
- args.append("--dry-run") |
- if self._options.work_dir: |
- args.extend(["--work-dir", self._options.work_dir]) |
- if self._options.chromium_roll_json_output: |
- args.extend(["--json-output", self._options.chromium_roll_json_output]) |
- self._side_effect_handler.Call(chromium_roll.ChromiumRoll().Run, args) |
+ 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): |
+ 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): |
+ 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): |
@@ -79,31 +174,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("--chromium-roll-json-output", |
- help="File to write wrapped results summary to.") |
+ 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=3, 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 [ |
+ Preparation, |
DetectLastRoll, |
- RollChromium, |
+ DetectRevisionToRoll, |
+ PrepareRollCandidate, |
+ SwitchChromium, |
+ UpdateChromiumCheckout, |
+ UploadCL, |
+ CleanUp, |
] |