| OLD | NEW |
| (Empty) |
| 1 #!/usr/bin/env python | |
| 2 # Copyright 2014 the V8 project authors. All rights reserved. | |
| 3 # Use of this source code is governed by a BSD-style license that can be | |
| 4 # found in the LICENSE file. | |
| 5 | |
| 6 import argparse | |
| 7 import os | |
| 8 import sys | |
| 9 | |
| 10 from common_includes import * | |
| 11 | |
| 12 ROLL_SUMMARY = ("Summary of changes available at:\n" | |
| 13 "https://chromium.googlesource.com/v8/v8/+log/%s..%s") | |
| 14 | |
| 15 ISSUE_MSG = ( | |
| 16 """Please follow these instructions for assigning/CC'ing issues: | |
| 17 https://code.google.com/p/v8-wiki/wiki/TriagingIssues | |
| 18 | |
| 19 Please close rolling in case of a roll revert: | |
| 20 https://v8-roll.appspot.com/ | |
| 21 This only works with a Google account.""") | |
| 22 | |
| 23 class Preparation(Step): | |
| 24 MESSAGE = "Preparation." | |
| 25 | |
| 26 def RunStep(self): | |
| 27 # Update v8 remote tracking branches. | |
| 28 self.GitFetchOrigin() | |
| 29 self.Git("fetch origin +refs/tags/*:refs/tags/*") | |
| 30 | |
| 31 | |
| 32 class PrepareRollCandidate(Step): | |
| 33 MESSAGE = "Robustness checks of the roll candidate." | |
| 34 | |
| 35 def RunStep(self): | |
| 36 self["roll_title"] = self.GitLog(n=1, format="%s", | |
| 37 git_hash=self._options.roll) | |
| 38 | |
| 39 # Make sure the last roll and the roll candidate are releases. | |
| 40 version = self.GetVersionTag(self._options.roll) | |
| 41 assert version, "The revision to roll is not tagged." | |
| 42 version = self.GetVersionTag(self._options.last_roll) | |
| 43 assert version, "The revision used as last roll is not tagged." | |
| 44 | |
| 45 | |
| 46 class SwitchChromium(Step): | |
| 47 MESSAGE = "Switch to Chromium checkout." | |
| 48 | |
| 49 def RunStep(self): | |
| 50 cwd = self._options.chromium | |
| 51 self.InitialEnvironmentChecks(cwd) | |
| 52 # Check for a clean workdir. | |
| 53 if not self.GitIsWorkdirClean(cwd=cwd): # pragma: no cover | |
| 54 self.Die("Workspace is not clean. Please commit or undo your changes.") | |
| 55 # Assert that the DEPS file is there. | |
| 56 if not os.path.exists(os.path.join(cwd, "DEPS")): # pragma: no cover | |
| 57 self.Die("DEPS file not present.") | |
| 58 | |
| 59 | |
| 60 class UpdateChromiumCheckout(Step): | |
| 61 MESSAGE = "Update the checkout and create a new branch." | |
| 62 | |
| 63 def RunStep(self): | |
| 64 cwd = self._options.chromium | |
| 65 self.GitCheckout("master", cwd=cwd) | |
| 66 self.DeleteBranch("work-branch", cwd=cwd) | |
| 67 self.Command("gclient", "sync --nohooks", cwd=cwd) | |
| 68 self.GitPull(cwd=cwd) | |
| 69 | |
| 70 # Update v8 remotes. | |
| 71 self.GitFetchOrigin() | |
| 72 | |
| 73 self.GitCreateBranch("work-branch", cwd=cwd) | |
| 74 | |
| 75 | |
| 76 class UploadCL(Step): | |
| 77 MESSAGE = "Create and upload CL." | |
| 78 | |
| 79 def RunStep(self): | |
| 80 cwd = self._options.chromium | |
| 81 # Patch DEPS file. | |
| 82 if self.Command("roll-dep-svn", "v8 %s" % | |
| 83 self._options.roll, cwd=cwd) is None: | |
| 84 self.Die("Failed to create deps for %s" % self._options.roll) | |
| 85 | |
| 86 message = [] | |
| 87 message.append("Update V8 to %s." % self["roll_title"].lower()) | |
| 88 | |
| 89 message.append( | |
| 90 ROLL_SUMMARY % (self._options.last_roll[:8], self._options.roll[:8])) | |
| 91 | |
| 92 message.append(ISSUE_MSG) | |
| 93 | |
| 94 message.append("TBR=%s" % self._options.reviewer) | |
| 95 self.GitCommit("\n\n".join(message), author=self._options.author, cwd=cwd) | |
| 96 if not self._options.dry_run: | |
| 97 self.GitUpload(author=self._options.author, | |
| 98 force=True, | |
| 99 cq=self._options.use_commit_queue, | |
| 100 cwd=cwd) | |
| 101 print "CL uploaded." | |
| 102 else: | |
| 103 print "Dry run - don't upload." | |
| 104 | |
| 105 self.GitCheckout("master", cwd=cwd) | |
| 106 self.GitDeleteBranch("work-branch", cwd=cwd) | |
| 107 | |
| 108 class CleanUp(Step): | |
| 109 MESSAGE = "Done!" | |
| 110 | |
| 111 def RunStep(self): | |
| 112 print("Congratulations, you have successfully rolled %s into " | |
| 113 "Chromium." | |
| 114 % self._options.roll) | |
| 115 | |
| 116 # Clean up all temporary files. | |
| 117 Command("rm", "-f %s*" % self._config["PERSISTFILE_BASENAME"]) | |
| 118 | |
| 119 | |
| 120 class ChromiumRoll(ScriptsBase): | |
| 121 def _PrepareOptions(self, parser): | |
| 122 parser.add_argument("-c", "--chromium", required=True, | |
| 123 help=("The path to your Chromium src/ " | |
| 124 "directory to automate the V8 roll.")) | |
| 125 parser.add_argument("--last-roll", required=True, | |
| 126 help="The git commit ID of the last rolled version.") | |
| 127 parser.add_argument("roll", nargs=1, help="Revision to roll."), | |
| 128 parser.add_argument("--use-commit-queue", | |
| 129 help="Check the CQ bit on upload.", | |
| 130 default=False, action="store_true") | |
| 131 | |
| 132 def _ProcessOptions(self, options): # pragma: no cover | |
| 133 if not options.author or not options.reviewer: | |
| 134 print "A reviewer (-r) and an author (-a) are required." | |
| 135 return False | |
| 136 | |
| 137 options.requires_editor = False | |
| 138 options.force = True | |
| 139 options.manual = False | |
| 140 options.roll = options.roll[0] | |
| 141 return True | |
| 142 | |
| 143 def _Config(self): | |
| 144 return { | |
| 145 "PERSISTFILE_BASENAME": "/tmp/v8-chromium-roll-tempfile", | |
| 146 } | |
| 147 | |
| 148 def _Steps(self): | |
| 149 return [ | |
| 150 Preparation, | |
| 151 PrepareRollCandidate, | |
| 152 SwitchChromium, | |
| 153 UpdateChromiumCheckout, | |
| 154 UploadCL, | |
| 155 CleanUp, | |
| 156 ] | |
| 157 | |
| 158 | |
| 159 if __name__ == "__main__": # pragma: no cover | |
| 160 sys.exit(ChromiumRoll().Run()) | |
| OLD | NEW |