1b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#!/usr/bin/env python 2b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch# Copyright 2014 the V8 project authors. All rights reserved. 3b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch# Use of this source code is governed by a BSD-style license that can be 4b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch# found in the LICENSE file. 5b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochimport argparse 7b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochimport os 8b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochimport sys 9b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfrom common_includes import * 11b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 12b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 13b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass Preparation(Step): 14b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch MESSAGE = "Preparation." 15b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 16b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch def RunStep(self): 17b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch # Update v8 remote tracking branches. 18b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch self.GitFetchOrigin() 19b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 20b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 21b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass DetectLastPush(Step): 22b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch MESSAGE = "Detect commit ID of last push to trunk." 23b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 24b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch def RunStep(self): 25b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch self["last_push"] = self._options.last_push or self.FindLastTrunkPush( 26b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch branch="origin/master", include_patches=True) 27b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch self["trunk_revision"] = self.GetCommitPositionNumber(self["last_push"]) 28b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch self["push_title"] = self.GitLog(n=1, format="%s", 29b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch git_hash=self["last_push"]) 30b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 31b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 32b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass SwitchChromium(Step): 33b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch MESSAGE = "Switch to Chromium checkout." 34b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 35b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch def RunStep(self): 36b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch self["v8_path"] = os.getcwd() 37b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch cwd = self._options.chromium 38b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch os.chdir(cwd) 39b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch self.InitialEnvironmentChecks(cwd) 40b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch # Check for a clean workdir. 41b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if not self.GitIsWorkdirClean(cwd=cwd): # pragma: no cover 42b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch self.Die("Workspace is not clean. Please commit or undo your changes.") 43b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch # Assert that the DEPS file is there. 44b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if not os.path.exists(os.path.join(cwd, "DEPS")): # pragma: no cover 45b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch self.Die("DEPS file not present.") 46b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 47b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 48b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass UpdateChromiumCheckout(Step): 49b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch MESSAGE = "Update the checkout and create a new branch." 50b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 51b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch def RunStep(self): 52b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch self.GitCheckout("master", cwd=self._options.chromium) 53b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch self.Command("gclient", "sync --nohooks", cwd=self._options.chromium) 54b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch self.GitPull(cwd=self._options.chromium) 55b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 56b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch # Update v8 remotes. 57b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch self.GitFetchOrigin() 58b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 59b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch self.GitCreateBranch("v8-roll-%s" % self["trunk_revision"], 60b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch cwd=self._options.chromium) 61b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 62b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 63b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass UploadCL(Step): 64b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch MESSAGE = "Create and upload CL." 65b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 66b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch def RunStep(self): 67b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch # Patch DEPS file. 68b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if self.Command( 69b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch "roll-dep", "v8 %s" % self["trunk_revision"], 70b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch cwd=self._options.chromium) is None: 71b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch self.Die("Failed to create deps for %s" % self["trunk_revision"]) 72b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 73b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch commit_title = "Update V8 to %s." % self["push_title"].lower() 74b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch sheriff = "" 75b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if self["sheriff"]: 76b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch sheriff = ("\n\nPlease reply to the V8 sheriff %s in case of problems." 77b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch % self["sheriff"]) 78b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch self.GitCommit("%s%s\n\nTBR=%s" % 79b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch (commit_title, sheriff, self._options.reviewer), 80b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch author=self._options.author, 81b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch cwd=self._options.chromium) 82b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if not self._options.dry_run: 83b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch self.GitUpload(author=self._options.author, 84b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch force=True, 85b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch cq=self._options.use_commit_queue, 86b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch cwd=self._options.chromium) 87b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch print "CL uploaded." 88b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch else: 89b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch self.GitCheckout("master", cwd=self._options.chromium) 90b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch self.GitDeleteBranch("v8-roll-%s" % self["trunk_revision"], 91b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch cwd=self._options.chromium) 92b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch print "Dry run - don't upload." 93b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 94b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 95b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch# TODO(machenbach): Make this obsolete. We are only in the chromium chechout 96b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch# for the initial .git check. 97b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass SwitchV8(Step): 98b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch MESSAGE = "Returning to V8 checkout." 99b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 100b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch def RunStep(self): 101b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch os.chdir(self["v8_path"]) 102b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 103b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 104b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass CleanUp(Step): 105b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch MESSAGE = "Done!" 106b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 107b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch def RunStep(self): 108b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch print("Congratulations, you have successfully rolled the push r%s it into " 109b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch "Chromium. Please don't forget to update the v8rel spreadsheet." 110b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch % self["trunk_revision"]) 111b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 112b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch # Clean up all temporary files. 113b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Command("rm", "-f %s*" % self._config["PERSISTFILE_BASENAME"]) 114b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 115b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 116b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass ChromiumRoll(ScriptsBase): 117b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch def _PrepareOptions(self, parser): 118b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch parser.add_argument("-c", "--chromium", required=True, 119b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch help=("The path to your Chromium src/ " 120b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch "directory to automate the V8 roll.")) 121b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch parser.add_argument("-l", "--last-push", 122b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch help="The git commit ID of the last push to trunk.") 123b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch parser.add_argument("--use-commit-queue", 124b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch help="Check the CQ bit on upload.", 125b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch default=False, action="store_true") 126b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 127b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch def _ProcessOptions(self, options): # pragma: no cover 128b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if not options.author or not options.reviewer: 129b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch print "A reviewer (-r) and an author (-a) are required." 130b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return False 131b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 132b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch options.requires_editor = False 133b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch options.force = True 134b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch options.manual = False 135b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return True 136b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 137b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch def _Config(self): 138b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return { 139b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch "PERSISTFILE_BASENAME": "/tmp/v8-chromium-roll-tempfile", 140b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 141b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 142b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch def _Steps(self): 143b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return [ 144b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Preparation, 145b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DetectLastPush, 146b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DetermineV8Sheriff, 147b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SwitchChromium, 148b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch UpdateChromiumCheckout, 149b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch UploadCL, 150b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SwitchV8, 151b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CleanUp, 152b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ] 153b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 154b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 155b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochif __name__ == "__main__": # pragma: no cover 156b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch sys.exit(ChromiumRoll().Run()) 157