| Index: tools/push-to-trunk/chromium_roll.py
|
| diff --git a/tools/push-to-trunk/chromium_roll.py b/tools/push-to-trunk/chromium_roll.py
|
| new file mode 100755
|
| index 0000000000000000000000000000000000000000..ef9b8bf38b920d684b464ba9d868c022b4cd80be
|
| --- /dev/null
|
| +++ b/tools/push-to-trunk/chromium_roll.py
|
| @@ -0,0 +1,170 @@
|
| +#!/usr/bin/env python
|
| +# Copyright 2014 the V8 project authors. All rights reserved.
|
| +# Use of this source code is governed by a BSD-style license that can be
|
| +# found in the LICENSE file.
|
| +
|
| +import argparse
|
| +import os
|
| +import sys
|
| +
|
| +from common_includes import *
|
| +
|
| +DEPS_FILE = "DEPS_FILE"
|
| +CHROMIUM = "CHROMIUM"
|
| +
|
| +CONFIG = {
|
| + PERSISTFILE_BASENAME: "/tmp/v8-chromium-roll-tempfile",
|
| + DOT_GIT_LOCATION: ".git",
|
| + DEPS_FILE: "DEPS",
|
| +}
|
| +
|
| +
|
| +class Preparation(Step):
|
| + MESSAGE = "Preparation."
|
| +
|
| + def RunStep(self):
|
| + self.CommonPrepare()
|
| +
|
| +
|
| +class DetectLastPush(Step):
|
| + MESSAGE = "Detect commit ID of last push to trunk."
|
| +
|
| + def RunStep(self):
|
| + self["last_push"] = self._options.last_push or self.FindLastTrunkPush()
|
| + self["trunk_revision"] = self.GitSVNFindSVNRev(self["last_push"])
|
| + self["push_title"] = self.GitLog(n=1, format="%s",
|
| + git_hash=self["last_push"])
|
| +
|
| +
|
| +class CheckChromium(Step):
|
| + MESSAGE = "Ask for chromium checkout."
|
| +
|
| + def Run(self):
|
| + self["chrome_path"] = self._options.chromium
|
| + while not self["chrome_path"]:
|
| + self.DieNoManualMode("Please specify the path to a Chromium checkout in "
|
| + "forced mode.")
|
| + print ("Please specify the path to the chromium \"src\" directory: "),
|
| + self["chrome_path"] = self.ReadLine()
|
| +
|
| +
|
| +class SwitchChromium(Step):
|
| + MESSAGE = "Switch to Chromium checkout."
|
| + REQUIRES = "chrome_path"
|
| +
|
| + def RunStep(self):
|
| + self["v8_path"] = os.getcwd()
|
| + os.chdir(self["chrome_path"])
|
| + self.InitialEnvironmentChecks()
|
| + # Check for a clean workdir.
|
| + if not self.GitIsWorkdirClean(): # 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(self.Config(DEPS_FILE)): # pragma: no cover
|
| + self.Die("DEPS file not present.")
|
| +
|
| +
|
| +class UpdateChromiumCheckout(Step):
|
| + MESSAGE = "Update the checkout and create a new branch."
|
| + REQUIRES = "chrome_path"
|
| +
|
| + def RunStep(self):
|
| + os.chdir(self["chrome_path"])
|
| + self.GitCheckout("master")
|
| + self.GitPull()
|
| + self.GitCreateBranch("v8-roll-%s" % self["trunk_revision"])
|
| +
|
| +
|
| +class UploadCL(Step):
|
| + MESSAGE = "Create and upload CL."
|
| + REQUIRES = "chrome_path"
|
| +
|
| + def RunStep(self):
|
| + os.chdir(self["chrome_path"])
|
| +
|
| + # Patch DEPS file.
|
| + deps = FileToText(self.Config(DEPS_FILE))
|
| + deps = re.sub("(?<=\"v8_revision\": \")([0-9]+)(?=\")",
|
| + self["trunk_revision"],
|
| + deps)
|
| + TextToFile(deps, self.Config(DEPS_FILE))
|
| +
|
| + if self._options.reviewer:
|
| + print "Using account %s for review." % self._options.reviewer
|
| + rev = self._options.reviewer
|
| + else:
|
| + print "Please enter the email address of a reviewer for the roll CL: ",
|
| + self.DieNoManualMode("A reviewer must be specified in forced mode.")
|
| + rev = self.ReadLine()
|
| +
|
| + commit_title = "Update V8 to %s." % self["push_title"].lower()
|
| + self.GitCommit("%s\n\nTBR=%s" % (commit_title, rev))
|
| + self.GitUpload(author=self._options.author,
|
| + force=self._options.force_upload)
|
| + print "CL uploaded."
|
| +
|
| +
|
| +class SwitchV8(Step):
|
| + MESSAGE = "Returning to V8 checkout."
|
| + REQUIRES = "chrome_path"
|
| +
|
| + def RunStep(self):
|
| + os.chdir(self["v8_path"])
|
| +
|
| +
|
| +class CleanUp(Step):
|
| + MESSAGE = "Done!"
|
| +
|
| + def RunStep(self):
|
| + print("Congratulations, you have successfully rolled the push r%s it into "
|
| + "Chromium. Please don't forget to update the v8rel spreadsheet."
|
| + % self["trunk_revision"])
|
| +
|
| + # Clean up all temporary files.
|
| + Command("rm", "-f %s*" % self._config[PERSISTFILE_BASENAME])
|
| +
|
| +
|
| +class ChromiumRoll(ScriptsBase):
|
| + def _PrepareOptions(self, parser):
|
| + group = parser.add_mutually_exclusive_group()
|
| + group.add_argument("-f", "--force",
|
| + help="Don't prompt the user.",
|
| + default=False, action="store_true")
|
| + group.add_argument("-m", "--manual",
|
| + help="Prompt the user at every important step.",
|
| + default=False, action="store_true")
|
| + parser.add_argument("-c", "--chromium",
|
| + help=("The path to your Chromium src/ "
|
| + "directory to automate the V8 roll."))
|
| + parser.add_argument("-l", "--last-push",
|
| + help="The git commit ID of the last push to trunk.")
|
| +
|
| + def _ProcessOptions(self, options): # pragma: no cover
|
| + if not options.manual and not options.reviewer:
|
| + print "A reviewer (-r) is required in (semi-)automatic mode."
|
| + return False
|
| + if not options.manual and not options.chromium:
|
| + print "A chromium checkout (-c) is required in (semi-)automatic mode."
|
| + return False
|
| + if not options.manual and not options.author:
|
| + print "Specify your chromium.org email with -a in (semi-)automatic mode."
|
| + return False
|
| +
|
| + options.tbr_commit = not options.manual
|
| + return True
|
| +
|
| + def _Steps(self):
|
| + return [
|
| + Preparation,
|
| + DetectLastPush,
|
| + CheckChromium,
|
| + SwitchChromium,
|
| + UpdateChromiumCheckout,
|
| + UploadCL,
|
| + SwitchV8,
|
| + CleanUp,
|
| + ]
|
| +
|
| +
|
| +if __name__ == "__main__": # pragma: no cover
|
| + sys.exit(ChromiumRoll(CONFIG).Run())
|
|
|