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