OLD | NEW |
1 #!/usr/bin/env python | 1 #!/usr/bin/env python |
2 # Copyright 2013 the V8 project authors. All rights reserved. | 2 # Copyright 2013 the V8 project authors. All rights reserved. |
3 # Redistribution and use in source and binary forms, with or without | 3 # Redistribution and use in source and binary forms, with or without |
4 # modification, are permitted provided that the following conditions are | 4 # modification, are permitted provided that the following conditions are |
5 # met: | 5 # met: |
6 # | 6 # |
7 # * Redistributions of source code must retain the above copyright | 7 # * Redistributions of source code must retain the above copyright |
8 # notice, this list of conditions and the following disclaimer. | 8 # notice, this list of conditions and the following disclaimer. |
9 # * Redistributions in binary form must reproduce the above | 9 # * Redistributions in binary form must reproduce the above |
10 # copyright notice, this list of conditions and the following | 10 # copyright notice, this list of conditions and the following |
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
94 last_push_title = self.GitLog(n=1, format="%s", git_hash=last_push) | 94 last_push_title = self.GitLog(n=1, format="%s", git_hash=last_push) |
95 last_push_be_svn = PUSH_MESSAGE_RE.match(last_push_title).group(1) | 95 last_push_be_svn = PUSH_MESSAGE_RE.match(last_push_title).group(1) |
96 if not last_push_be_svn: # pragma: no cover | 96 if not last_push_be_svn: # pragma: no cover |
97 self.Die("Could not retrieve bleeding edge revision for trunk push %s" | 97 self.Die("Could not retrieve bleeding edge revision for trunk push %s" |
98 % last_push) | 98 % last_push) |
99 last_push_bleeding_edge = self.GitSVNFindGitHash(last_push_be_svn) | 99 last_push_bleeding_edge = self.GitSVNFindGitHash(last_push_be_svn) |
100 if not last_push_bleeding_edge: # pragma: no cover | 100 if not last_push_bleeding_edge: # pragma: no cover |
101 self.Die("Could not retrieve bleeding edge git hash for trunk push %s" | 101 self.Die("Could not retrieve bleeding edge git hash for trunk push %s" |
102 % last_push) | 102 % last_push) |
103 | 103 |
104 # TODO(machenbach): last_push_trunk points to the svn revision on trunk. | 104 # This points to the svn revision of the last push on trunk. |
105 # It is not used yet but we'll need it for retrieving the current version. | |
106 self["last_push_trunk"] = last_push | 105 self["last_push_trunk"] = last_push |
107 # TODO(machenbach): This currently points to the prepare push revision that | 106 # This points to the last bleeding_edge revision that went into the last |
108 # will be deprecated soon. After the deprecation it will point to the last | 107 # push. |
109 # bleeding_edge revision that went into the last push. | |
110 self["last_push_bleeding_edge"] = last_push_bleeding_edge | 108 self["last_push_bleeding_edge"] = last_push_bleeding_edge |
111 | 109 |
112 | 110 |
113 class IncrementVersion(Step): | 111 class IncrementVersion(Step): |
114 MESSAGE = "Increment version number." | 112 MESSAGE = "Increment version number." |
115 | 113 |
116 def RunStep(self): | 114 def RunStep(self): |
117 # Retrieve current version from last trunk push. | 115 # Retrieve current version from last trunk push. |
118 self.GitCheckoutFile(self.Config(VERSION_FILE), self["last_push_trunk"]) | 116 self.GitCheckoutFile(self.Config(VERSION_FILE), self["last_push_trunk"]) |
119 self.ReadAndPersistVersion() | 117 self.ReadAndPersistVersion() |
(...skipping 10 matching lines...) Expand all Loading... |
130 else: | 128 else: |
131 self.Editor(self.Config(VERSION_FILE)) | 129 self.Editor(self.Config(VERSION_FILE)) |
132 | 130 |
133 # Variables prefixed with 'new_' contain the new version numbers for the | 131 # Variables prefixed with 'new_' contain the new version numbers for the |
134 # ongoing trunk push. | 132 # ongoing trunk push. |
135 self.ReadAndPersistVersion("new_") | 133 self.ReadAndPersistVersion("new_") |
136 self["version"] = "%s.%s.%s" % (self["new_major"], | 134 self["version"] = "%s.%s.%s" % (self["new_major"], |
137 self["new_minor"], | 135 self["new_minor"], |
138 self["new_build"]) | 136 self["new_build"]) |
139 | 137 |
140 # TODO(machenbach): The following will be deprecated. Increment version | |
141 # numbers for version.cc on bleeding_edge (new build level on trunk + 1). | |
142 text = FileToText(self.Config(VERSION_FILE)) | |
143 text = MSub(r"(?<=#define BUILD_NUMBER)(?P<space>\s+)\d*$", | |
144 r"\g<space>%s" % str(int(self["new_build"]) + 1), | |
145 text) | |
146 TextToFile(text, self.Config(VERSION_FILE)) | |
147 self.ReadAndPersistVersion("new_be_") | |
148 | |
149 | 138 |
150 class PrepareChangeLog(Step): | 139 class PrepareChangeLog(Step): |
151 MESSAGE = "Prepare raw ChangeLog entry." | 140 MESSAGE = "Prepare raw ChangeLog entry." |
152 | 141 |
153 def Reload(self, body): | 142 def Reload(self, body): |
154 """Attempts to reload the commit message from rietveld in order to allow | 143 """Attempts to reload the commit message from rietveld in order to allow |
155 late changes to the LOG flag. Note: This is brittle to future changes of | 144 late changes to the LOG flag. Note: This is brittle to future changes of |
156 the web page name or structure. | 145 the web page name or structure. |
157 """ | 146 """ |
158 match = re.search(r"^Review URL: https://codereview\.chromium\.org/(\d+)$", | 147 match = re.search(r"^Review URL: https://codereview\.chromium\.org/(\d+)$", |
159 body, flags=re.M) | 148 body, flags=re.M) |
160 if match: | 149 if match: |
161 cl_url = ("https://codereview.chromium.org/%s/description" | 150 cl_url = ("https://codereview.chromium.org/%s/description" |
162 % match.group(1)) | 151 % match.group(1)) |
163 try: | 152 try: |
164 # Fetch from Rietveld but only retry once with one second delay since | 153 # Fetch from Rietveld but only retry once with one second delay since |
165 # there might be many revisions. | 154 # there might be many revisions. |
166 body = self.ReadURL(cl_url, wait_plan=[1]) | 155 body = self.ReadURL(cl_url, wait_plan=[1]) |
167 except urllib2.URLError: # pragma: no cover | 156 except urllib2.URLError: # pragma: no cover |
168 pass | 157 pass |
169 return body | 158 return body |
170 | 159 |
171 def RunStep(self): | 160 def RunStep(self): |
172 self["date"] = self.GetDate() | 161 self["date"] = self.GetDate() |
173 output = "%s: Version %s\n\n" % (self["date"], self["version"]) | 162 output = "%s: Version %s\n\n" % (self["date"], self["version"]) |
174 TextToFile(output, self.Config(CHANGELOG_ENTRY_FILE)) | 163 TextToFile(output, self.Config(CHANGELOG_ENTRY_FILE)) |
| 164 # TODO(machenbach): Retrieve the push hash also from a command-line option. |
175 commits = self.GitLog(format="%H", | 165 commits = self.GitLog(format="%H", |
176 git_hash="%s..HEAD" % self["last_push_bleeding_edge"]) | 166 git_hash="%s..HEAD" % self["last_push_bleeding_edge"]) |
177 | 167 |
178 # Cache raw commit messages. | 168 # Cache raw commit messages. |
179 commit_messages = [ | 169 commit_messages = [ |
180 [ | 170 [ |
181 self.GitLog(n=1, format="%s", git_hash=commit), | 171 self.GitLog(n=1, format="%s", git_hash=commit), |
182 self.Reload(self.GitLog(n=1, format="%B", git_hash=commit)), | 172 self.Reload(self.GitLog(n=1, format="%B", git_hash=commit)), |
183 self.GitLog(n=1, format="%an", git_hash=commit), | 173 self.GitLog(n=1, format="%an", git_hash=commit), |
184 ] for commit in commits.splitlines() | 174 ] for commit in commits.splitlines() |
(...skipping 30 matching lines...) Expand all Loading... |
215 changelog_entry = "\n".join(map(Fill80, changelog_entry.splitlines())) | 205 changelog_entry = "\n".join(map(Fill80, changelog_entry.splitlines())) |
216 changelog_entry = changelog_entry.lstrip() | 206 changelog_entry = changelog_entry.lstrip() |
217 | 207 |
218 if changelog_entry == "": # pragma: no cover | 208 if changelog_entry == "": # pragma: no cover |
219 self.Die("Empty ChangeLog entry.") | 209 self.Die("Empty ChangeLog entry.") |
220 | 210 |
221 # Safe new change log for adding it later to the trunk patch. | 211 # Safe new change log for adding it later to the trunk patch. |
222 TextToFile(changelog_entry, self.Config(CHANGELOG_ENTRY_FILE)) | 212 TextToFile(changelog_entry, self.Config(CHANGELOG_ENTRY_FILE)) |
223 | 213 |
224 | 214 |
225 class CommitLocal(Step): | |
226 MESSAGE = "Commit to local branch." | |
227 | |
228 def RunStep(self): | |
229 self["prep_commit_msg"] = ("Prepare push to trunk. " | |
230 "Now working on version %s.%s.%s." % (self["new_be_major"], | |
231 self["new_be_minor"], | |
232 self["new_be_build"])) | |
233 | |
234 # Include optional TBR only in the git command. The persisted commit | |
235 # message is used for finding the commit again later. | |
236 if self._options.tbr_commit: | |
237 message = "%s\n\nTBR=%s" % (self["prep_commit_msg"], | |
238 self._options.reviewer) | |
239 else: | |
240 message = "%s" % self["prep_commit_msg"] | |
241 self.GitCommit(message) | |
242 | |
243 | |
244 class CommitRepository(Step): | |
245 MESSAGE = "Commit to the repository." | |
246 | |
247 def RunStep(self): | |
248 self.WaitForLGTM() | |
249 self.GitPresubmit() | |
250 self.GitDCommit() | |
251 | |
252 | |
253 class StragglerCommits(Step): | 215 class StragglerCommits(Step): |
254 MESSAGE = ("Fetch straggler commits that sneaked in since this script was " | 216 MESSAGE = ("Fetch straggler commits that sneaked in since this script was " |
255 "started.") | 217 "started.") |
256 | 218 |
257 def RunStep(self): | 219 def RunStep(self): |
258 self.GitSVNFetch() | 220 self.GitSVNFetch() |
259 self.GitCheckout("svn/bleeding_edge") | 221 self.GitCheckout("svn/bleeding_edge") |
260 self["prepare_commit_hash"] = self.GitLog(n=1, format="%H", | 222 # TODO(machenbach): Retrieve the push hash also from a command-line option. |
261 grep=self["prep_commit_msg"]) | 223 self["push_hash"] = self.GitLog(n=1, format="%H", git_hash="HEAD") |
262 # TODO(machenbach): Retrieve the push hash from a command-line option or | |
263 # use ToT. The "prepare_commit_hash" will be deprecated along with the | |
264 # prepare push commit. | |
265 self["push_hash"] = self.GitLog(n=1, format="%H", | |
266 parent_hash=self["prepare_commit_hash"]) | |
267 | 224 |
268 | 225 |
269 class SquashCommits(Step): | 226 class SquashCommits(Step): |
270 MESSAGE = "Squash commits into one." | 227 MESSAGE = "Squash commits into one." |
271 | 228 |
272 def RunStep(self): | 229 def RunStep(self): |
273 # Instead of relying on "git rebase -i", we'll just create a diff, because | 230 # Instead of relying on "git rebase -i", we'll just create a diff, because |
274 # that's easier to automate. | 231 # that's easier to automate. |
275 TextToFile(self.GitDiff("svn/trunk", self["push_hash"]), | 232 TextToFile(self.GitDiff("svn/trunk", self["push_hash"]), |
276 self.Config(PATCH_FILE)) | 233 self.Config(PATCH_FILE)) |
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
357 | 314 |
358 def RunStep(self): | 315 def RunStep(self): |
359 self.GitCommit(file_name = self.Config(COMMITMSG_FILE)) | 316 self.GitCommit(file_name = self.Config(COMMITMSG_FILE)) |
360 Command("rm", "-f %s*" % self.Config(COMMITMSG_FILE)) | 317 Command("rm", "-f %s*" % self.Config(COMMITMSG_FILE)) |
361 | 318 |
362 | 319 |
363 class SanityCheck(Step): | 320 class SanityCheck(Step): |
364 MESSAGE = "Sanity check." | 321 MESSAGE = "Sanity check." |
365 | 322 |
366 def RunStep(self): | 323 def RunStep(self): |
| 324 # TODO(machenbach): Run presubmit script here as it is now missing in the |
| 325 # prepare push process. |
367 if not self.Confirm("Please check if your local checkout is sane: Inspect " | 326 if not self.Confirm("Please check if your local checkout is sane: Inspect " |
368 "%s, compile, run tests. Do you want to commit this new trunk " | 327 "%s, compile, run tests. Do you want to commit this new trunk " |
369 "revision to the repository?" % self.Config(VERSION_FILE)): | 328 "revision to the repository?" % self.Config(VERSION_FILE)): |
370 self.Die("Execution canceled.") # pragma: no cover | 329 self.Die("Execution canceled.") # pragma: no cover |
371 | 330 |
372 | 331 |
373 class CommitSVN(Step): | 332 class CommitSVN(Step): |
374 MESSAGE = "Commit to SVN." | 333 MESSAGE = "Commit to SVN." |
375 | 334 |
376 def RunStep(self): | 335 def RunStep(self): |
(...skipping 158 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
535 return True | 494 return True |
536 | 495 |
537 def _Steps(self): | 496 def _Steps(self): |
538 return [ | 497 return [ |
539 Preparation, | 498 Preparation, |
540 FreshBranch, | 499 FreshBranch, |
541 DetectLastPush, | 500 DetectLastPush, |
542 IncrementVersion, | 501 IncrementVersion, |
543 PrepareChangeLog, | 502 PrepareChangeLog, |
544 EditChangeLog, | 503 EditChangeLog, |
545 CommitLocal, | |
546 UploadStep, | |
547 CommitRepository, | |
548 StragglerCommits, | 504 StragglerCommits, |
549 SquashCommits, | 505 SquashCommits, |
550 NewBranch, | 506 NewBranch, |
551 ApplyChanges, | 507 ApplyChanges, |
552 AddChangeLog, | 508 AddChangeLog, |
553 SetVersion, | 509 SetVersion, |
554 CommitTrunk, | 510 CommitTrunk, |
555 SanityCheck, | 511 SanityCheck, |
556 CommitSVN, | 512 CommitSVN, |
557 TagRevision, | 513 TagRevision, |
558 CheckChromium, | 514 CheckChromium, |
559 SwitchChromium, | 515 SwitchChromium, |
560 UpdateChromiumCheckout, | 516 UpdateChromiumCheckout, |
561 UploadCL, | 517 UploadCL, |
562 SwitchV8, | 518 SwitchV8, |
563 CleanUp, | 519 CleanUp, |
564 ] | 520 ] |
565 | 521 |
566 | 522 |
567 if __name__ == "__main__": # pragma: no cover | 523 if __name__ == "__main__": # pragma: no cover |
568 sys.exit(PushToTrunk(CONFIG).Run()) | 524 sys.exit(PushToTrunk(CONFIG).Run()) |
OLD | NEW |