1fa0c3c69b9d632e5730bdd9c745c375beef5e54dmachenbach@chromium.org#!/usr/bin/env python 2fa0c3c69b9d632e5730bdd9c745c375beef5e54dmachenbach@chromium.org# Copyright 2014 the V8 project authors. All rights reserved. 3fa0c3c69b9d632e5730bdd9c745c375beef5e54dmachenbach@chromium.org# Use of this source code is governed by a BSD-style license that can be 4fa0c3c69b9d632e5730bdd9c745c375beef5e54dmachenbach@chromium.org# found in the LICENSE file. 5fa0c3c69b9d632e5730bdd9c745c375beef5e54dmachenbach@chromium.org 6fa0c3c69b9d632e5730bdd9c745c375beef5e54dmachenbach@chromium.orgimport argparse 7fa0c3c69b9d632e5730bdd9c745c375beef5e54dmachenbach@chromium.orgimport os 8fa0c3c69b9d632e5730bdd9c745c375beef5e54dmachenbach@chromium.orgimport sys 9fa0c3c69b9d632e5730bdd9c745c375beef5e54dmachenbach@chromium.org 10fa0c3c69b9d632e5730bdd9c745c375beef5e54dmachenbach@chromium.orgfrom common_includes import * 11fa0c3c69b9d632e5730bdd9c745c375beef5e54dmachenbach@chromium.org 12fa0c3c69b9d632e5730bdd9c745c375beef5e54dmachenbach@chromium.org 13fa0c3c69b9d632e5730bdd9c745c375beef5e54dmachenbach@chromium.orgclass Preparation(Step): 14fa0c3c69b9d632e5730bdd9c745c375beef5e54dmachenbach@chromium.org MESSAGE = "Preparation." 15fa0c3c69b9d632e5730bdd9c745c375beef5e54dmachenbach@chromium.org 16fa0c3c69b9d632e5730bdd9c745c375beef5e54dmachenbach@chromium.org def RunStep(self): 179aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org # Update v8 remote tracking branches. 189aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org self.GitFetchOrigin() 19fa0c3c69b9d632e5730bdd9c745c375beef5e54dmachenbach@chromium.org 20fa0c3c69b9d632e5730bdd9c745c375beef5e54dmachenbach@chromium.org 21fa0c3c69b9d632e5730bdd9c745c375beef5e54dmachenbach@chromium.orgclass DetectLastPush(Step): 22fa0c3c69b9d632e5730bdd9c745c375beef5e54dmachenbach@chromium.org MESSAGE = "Detect commit ID of last push to trunk." 23fa0c3c69b9d632e5730bdd9c745c375beef5e54dmachenbach@chromium.org 24fa0c3c69b9d632e5730bdd9c745c375beef5e54dmachenbach@chromium.org def RunStep(self): 258f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org self["last_push"] = self._options.last_push or self.FindLastTrunkPush( 269aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org branch="origin/master", include_patches=True) 279aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org self["trunk_revision"] = self.GetCommitPositionNumber(self["last_push"]) 28fa0c3c69b9d632e5730bdd9c745c375beef5e54dmachenbach@chromium.org self["push_title"] = self.GitLog(n=1, format="%s", 29fa0c3c69b9d632e5730bdd9c745c375beef5e54dmachenbach@chromium.org git_hash=self["last_push"]) 30fa0c3c69b9d632e5730bdd9c745c375beef5e54dmachenbach@chromium.org 31fa0c3c69b9d632e5730bdd9c745c375beef5e54dmachenbach@chromium.org 32fa0c3c69b9d632e5730bdd9c745c375beef5e54dmachenbach@chromium.orgclass SwitchChromium(Step): 33fa0c3c69b9d632e5730bdd9c745c375beef5e54dmachenbach@chromium.org MESSAGE = "Switch to Chromium checkout." 34fa0c3c69b9d632e5730bdd9c745c375beef5e54dmachenbach@chromium.org 35fa0c3c69b9d632e5730bdd9c745c375beef5e54dmachenbach@chromium.org def RunStep(self): 36fa0c3c69b9d632e5730bdd9c745c375beef5e54dmachenbach@chromium.org self["v8_path"] = os.getcwd() 3742ed2fc449e83fab2ccbf1b769a5e83715c9d783machenbach@chromium.org cwd = self._options.chromium 3842ed2fc449e83fab2ccbf1b769a5e83715c9d783machenbach@chromium.org os.chdir(cwd) 39a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org self.InitialEnvironmentChecks(cwd) 40fa0c3c69b9d632e5730bdd9c745c375beef5e54dmachenbach@chromium.org # Check for a clean workdir. 4142ed2fc449e83fab2ccbf1b769a5e83715c9d783machenbach@chromium.org if not self.GitIsWorkdirClean(cwd=cwd): # pragma: no cover 42fa0c3c69b9d632e5730bdd9c745c375beef5e54dmachenbach@chromium.org self.Die("Workspace is not clean. Please commit or undo your changes.") 43fa0c3c69b9d632e5730bdd9c745c375beef5e54dmachenbach@chromium.org # Assert that the DEPS file is there. 4442ed2fc449e83fab2ccbf1b769a5e83715c9d783machenbach@chromium.org if not os.path.exists(os.path.join(cwd, "DEPS")): # pragma: no cover 45fa0c3c69b9d632e5730bdd9c745c375beef5e54dmachenbach@chromium.org self.Die("DEPS file not present.") 46fa0c3c69b9d632e5730bdd9c745c375beef5e54dmachenbach@chromium.org 47fa0c3c69b9d632e5730bdd9c745c375beef5e54dmachenbach@chromium.org 48fa0c3c69b9d632e5730bdd9c745c375beef5e54dmachenbach@chromium.orgclass UpdateChromiumCheckout(Step): 49fa0c3c69b9d632e5730bdd9c745c375beef5e54dmachenbach@chromium.org MESSAGE = "Update the checkout and create a new branch." 50fa0c3c69b9d632e5730bdd9c745c375beef5e54dmachenbach@chromium.org 51fa0c3c69b9d632e5730bdd9c745c375beef5e54dmachenbach@chromium.org def RunStep(self): 5242ed2fc449e83fab2ccbf1b769a5e83715c9d783machenbach@chromium.org self.GitCheckout("master", cwd=self._options.chromium) 5342ed2fc449e83fab2ccbf1b769a5e83715c9d783machenbach@chromium.org self.Command("gclient", "sync --nohooks", cwd=self._options.chromium) 5442ed2fc449e83fab2ccbf1b769a5e83715c9d783machenbach@chromium.org self.GitPull(cwd=self._options.chromium) 5542ed2fc449e83fab2ccbf1b769a5e83715c9d783machenbach@chromium.org 5642ed2fc449e83fab2ccbf1b769a5e83715c9d783machenbach@chromium.org # Update v8 remotes. 5742ed2fc449e83fab2ccbf1b769a5e83715c9d783machenbach@chromium.org self.GitFetchOrigin() 5842ed2fc449e83fab2ccbf1b769a5e83715c9d783machenbach@chromium.org 5942ed2fc449e83fab2ccbf1b769a5e83715c9d783machenbach@chromium.org self.GitCreateBranch("v8-roll-%s" % self["trunk_revision"], 6042ed2fc449e83fab2ccbf1b769a5e83715c9d783machenbach@chromium.org cwd=self._options.chromium) 61fa0c3c69b9d632e5730bdd9c745c375beef5e54dmachenbach@chromium.org 62fa0c3c69b9d632e5730bdd9c745c375beef5e54dmachenbach@chromium.org 63fa0c3c69b9d632e5730bdd9c745c375beef5e54dmachenbach@chromium.orgclass UploadCL(Step): 64fa0c3c69b9d632e5730bdd9c745c375beef5e54dmachenbach@chromium.org MESSAGE = "Create and upload CL." 65fa0c3c69b9d632e5730bdd9c745c375beef5e54dmachenbach@chromium.org 66fa0c3c69b9d632e5730bdd9c745c375beef5e54dmachenbach@chromium.org def RunStep(self): 67fa0c3c69b9d632e5730bdd9c745c375beef5e54dmachenbach@chromium.org # Patch DEPS file. 6842ed2fc449e83fab2ccbf1b769a5e83715c9d783machenbach@chromium.org if self.Command( 6942ed2fc449e83fab2ccbf1b769a5e83715c9d783machenbach@chromium.org "roll-dep", "v8 %s" % self["trunk_revision"], 7042ed2fc449e83fab2ccbf1b769a5e83715c9d783machenbach@chromium.org cwd=self._options.chromium) is None: 71fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org self.Die("Failed to create deps for %s" % self["trunk_revision"]) 72fa0c3c69b9d632e5730bdd9c745c375beef5e54dmachenbach@chromium.org 73fa0c3c69b9d632e5730bdd9c745c375beef5e54dmachenbach@chromium.org commit_title = "Update V8 to %s." % self["push_title"].lower() 749e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org sheriff = "" 759e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org if self["sheriff"]: 769e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org sheriff = ("\n\nPlease reply to the V8 sheriff %s in case of problems." 779e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org % self["sheriff"]) 789aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org self.GitCommit("%s%s\n\nTBR=%s" % 799aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org (commit_title, sheriff, self._options.reviewer), 8042ed2fc449e83fab2ccbf1b769a5e83715c9d783machenbach@chromium.org author=self._options.author, 8142ed2fc449e83fab2ccbf1b769a5e83715c9d783machenbach@chromium.org cwd=self._options.chromium) 829aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org if not self._options.dry_run: 839aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org self.GitUpload(author=self._options.author, 849aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org force=True, 8542ed2fc449e83fab2ccbf1b769a5e83715c9d783machenbach@chromium.org cq=self._options.use_commit_queue, 8642ed2fc449e83fab2ccbf1b769a5e83715c9d783machenbach@chromium.org cwd=self._options.chromium) 879aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org print "CL uploaded." 889aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org else: 8942ed2fc449e83fab2ccbf1b769a5e83715c9d783machenbach@chromium.org self.GitCheckout("master", cwd=self._options.chromium) 9042ed2fc449e83fab2ccbf1b769a5e83715c9d783machenbach@chromium.org self.GitDeleteBranch("v8-roll-%s" % self["trunk_revision"], 9142ed2fc449e83fab2ccbf1b769a5e83715c9d783machenbach@chromium.org cwd=self._options.chromium) 929aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org print "Dry run - don't upload." 93fa0c3c69b9d632e5730bdd9c745c375beef5e54dmachenbach@chromium.org 94fa0c3c69b9d632e5730bdd9c745c375beef5e54dmachenbach@chromium.org 9542ed2fc449e83fab2ccbf1b769a5e83715c9d783machenbach@chromium.org# TODO(machenbach): Make this obsolete. We are only in the chromium chechout 9642ed2fc449e83fab2ccbf1b769a5e83715c9d783machenbach@chromium.org# for the initial .git check. 97fa0c3c69b9d632e5730bdd9c745c375beef5e54dmachenbach@chromium.orgclass SwitchV8(Step): 98fa0c3c69b9d632e5730bdd9c745c375beef5e54dmachenbach@chromium.org MESSAGE = "Returning to V8 checkout." 99fa0c3c69b9d632e5730bdd9c745c375beef5e54dmachenbach@chromium.org 100fa0c3c69b9d632e5730bdd9c745c375beef5e54dmachenbach@chromium.org def RunStep(self): 101fa0c3c69b9d632e5730bdd9c745c375beef5e54dmachenbach@chromium.org os.chdir(self["v8_path"]) 102fa0c3c69b9d632e5730bdd9c745c375beef5e54dmachenbach@chromium.org 103fa0c3c69b9d632e5730bdd9c745c375beef5e54dmachenbach@chromium.org 104fa0c3c69b9d632e5730bdd9c745c375beef5e54dmachenbach@chromium.orgclass CleanUp(Step): 105fa0c3c69b9d632e5730bdd9c745c375beef5e54dmachenbach@chromium.org MESSAGE = "Done!" 106fa0c3c69b9d632e5730bdd9c745c375beef5e54dmachenbach@chromium.org 107fa0c3c69b9d632e5730bdd9c745c375beef5e54dmachenbach@chromium.org def RunStep(self): 108fa0c3c69b9d632e5730bdd9c745c375beef5e54dmachenbach@chromium.org print("Congratulations, you have successfully rolled the push r%s it into " 109fa0c3c69b9d632e5730bdd9c745c375beef5e54dmachenbach@chromium.org "Chromium. Please don't forget to update the v8rel spreadsheet." 110fa0c3c69b9d632e5730bdd9c745c375beef5e54dmachenbach@chromium.org % self["trunk_revision"]) 111fa0c3c69b9d632e5730bdd9c745c375beef5e54dmachenbach@chromium.org 112fa0c3c69b9d632e5730bdd9c745c375beef5e54dmachenbach@chromium.org # Clean up all temporary files. 11306b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org Command("rm", "-f %s*" % self._config["PERSISTFILE_BASENAME"]) 114fa0c3c69b9d632e5730bdd9c745c375beef5e54dmachenbach@chromium.org 115fa0c3c69b9d632e5730bdd9c745c375beef5e54dmachenbach@chromium.org 116fa0c3c69b9d632e5730bdd9c745c375beef5e54dmachenbach@chromium.orgclass ChromiumRoll(ScriptsBase): 117fa0c3c69b9d632e5730bdd9c745c375beef5e54dmachenbach@chromium.org def _PrepareOptions(self, parser): 1189aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org parser.add_argument("-c", "--chromium", required=True, 119fa0c3c69b9d632e5730bdd9c745c375beef5e54dmachenbach@chromium.org help=("The path to your Chromium src/ " 120fa0c3c69b9d632e5730bdd9c745c375beef5e54dmachenbach@chromium.org "directory to automate the V8 roll.")) 121fa0c3c69b9d632e5730bdd9c745c375beef5e54dmachenbach@chromium.org parser.add_argument("-l", "--last-push", 122fa0c3c69b9d632e5730bdd9c745c375beef5e54dmachenbach@chromium.org help="The git commit ID of the last push to trunk.") 123c3564d8de4ebfc4fa3dc009fc9f6f18968ffcbd7machenbach@chromium.org parser.add_argument("--use-commit-queue", 124c3564d8de4ebfc4fa3dc009fc9f6f18968ffcbd7machenbach@chromium.org help="Check the CQ bit on upload.", 125c3564d8de4ebfc4fa3dc009fc9f6f18968ffcbd7machenbach@chromium.org default=False, action="store_true") 126fa0c3c69b9d632e5730bdd9c745c375beef5e54dmachenbach@chromium.org 127fa0c3c69b9d632e5730bdd9c745c375beef5e54dmachenbach@chromium.org def _ProcessOptions(self, options): # pragma: no cover 1289aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org if not options.author or not options.reviewer: 1299aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org print "A reviewer (-r) and an author (-a) are required." 130fa0c3c69b9d632e5730bdd9c745c375beef5e54dmachenbach@chromium.org return False 131fa0c3c69b9d632e5730bdd9c745c375beef5e54dmachenbach@chromium.org 1329aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org options.requires_editor = False 1339aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org options.force = True 1349aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org options.manual = False 135fa0c3c69b9d632e5730bdd9c745c375beef5e54dmachenbach@chromium.org return True 136fa0c3c69b9d632e5730bdd9c745c375beef5e54dmachenbach@chromium.org 13706b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org def _Config(self): 13806b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org return { 13906b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org "PERSISTFILE_BASENAME": "/tmp/v8-chromium-roll-tempfile", 14006b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org } 14106b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org 142fa0c3c69b9d632e5730bdd9c745c375beef5e54dmachenbach@chromium.org def _Steps(self): 143fa0c3c69b9d632e5730bdd9c745c375beef5e54dmachenbach@chromium.org return [ 144fa0c3c69b9d632e5730bdd9c745c375beef5e54dmachenbach@chromium.org Preparation, 145fa0c3c69b9d632e5730bdd9c745c375beef5e54dmachenbach@chromium.org DetectLastPush, 1469e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org DetermineV8Sheriff, 147fa0c3c69b9d632e5730bdd9c745c375beef5e54dmachenbach@chromium.org SwitchChromium, 148fa0c3c69b9d632e5730bdd9c745c375beef5e54dmachenbach@chromium.org UpdateChromiumCheckout, 149fa0c3c69b9d632e5730bdd9c745c375beef5e54dmachenbach@chromium.org UploadCL, 150fa0c3c69b9d632e5730bdd9c745c375beef5e54dmachenbach@chromium.org SwitchV8, 151fa0c3c69b9d632e5730bdd9c745c375beef5e54dmachenbach@chromium.org CleanUp, 152fa0c3c69b9d632e5730bdd9c745c375beef5e54dmachenbach@chromium.org ] 153fa0c3c69b9d632e5730bdd9c745c375beef5e54dmachenbach@chromium.org 154fa0c3c69b9d632e5730bdd9c745c375beef5e54dmachenbach@chromium.org 155fa0c3c69b9d632e5730bdd9c745c375beef5e54dmachenbach@chromium.orgif __name__ == "__main__": # pragma: no cover 15606b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org sys.exit(ChromiumRoll().Run()) 157