Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(787)

Side by Side Diff: tools/push-to-trunk/push_to_trunk.py

Issue 594773003: Refactoring: Remove global configs in release scripts. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Remove global configs. Created 6 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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 16 matching lines...) Expand all
27 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28 28
29 import argparse 29 import argparse
30 import os 30 import os
31 import sys 31 import sys
32 import tempfile 32 import tempfile
33 import urllib2 33 import urllib2
34 34
35 from common_includes import * 35 from common_includes import *
36 36
37 TRUNKBRANCH = "TRUNKBRANCH"
38
39 CONFIG = {
40 BRANCHNAME: "prepare-push",
41 TRUNKBRANCH: "trunk-push",
42 PERSISTFILE_BASENAME: "/tmp/v8-push-to-trunk-tempfile",
43 CHANGELOG_FILE: "ChangeLog",
44 CHANGELOG_ENTRY_FILE: "/tmp/v8-push-to-trunk-tempfile-changelog-entry",
45 PATCH_FILE: "/tmp/v8-push-to-trunk-tempfile-patch-file",
46 COMMITMSG_FILE: "/tmp/v8-push-to-trunk-tempfile-commitmsg",
47 }
48
49 PUSH_MESSAGE_SUFFIX = " (based on bleeding_edge revision r%d)" 37 PUSH_MESSAGE_SUFFIX = " (based on bleeding_edge revision r%d)"
50 PUSH_MESSAGE_RE = re.compile(r".* \(based on bleeding_edge revision r(\d+)\)$") 38 PUSH_MESSAGE_RE = re.compile(r".* \(based on bleeding_edge revision r(\d+)\)$")
51 39
52 class Preparation(Step): 40 class Preparation(Step):
53 MESSAGE = "Preparation." 41 MESSAGE = "Preparation."
54 42
55 def RunStep(self): 43 def RunStep(self):
56 self.InitialEnvironmentChecks(self.default_cwd) 44 self.InitialEnvironmentChecks(self.default_cwd)
57 self.CommonPrepare() 45 self.CommonPrepare()
58 46
59 if(self["current_branch"] == self.Config(TRUNKBRANCH) 47 if(self["current_branch"] == self.Config("TRUNKBRANCH")
60 or self["current_branch"] == self.Config(BRANCHNAME)): 48 or self["current_branch"] == self.Config("BRANCHNAME")):
61 print "Warning: Script started on branch %s" % self["current_branch"] 49 print "Warning: Script started on branch %s" % self["current_branch"]
62 50
63 self.PrepareBranch() 51 self.PrepareBranch()
64 self.DeleteBranch(self.Config(TRUNKBRANCH)) 52 self.DeleteBranch(self.Config("TRUNKBRANCH"))
65 53
66 54
67 class FreshBranch(Step): 55 class FreshBranch(Step):
68 MESSAGE = "Create a fresh branch." 56 MESSAGE = "Create a fresh branch."
69 57
70 def RunStep(self): 58 def RunStep(self):
71 self.GitCreateBranch(self.Config(BRANCHNAME), "svn/bleeding_edge") 59 self.GitCreateBranch(self.Config("BRANCHNAME"), "svn/bleeding_edge")
72 60
73 61
74 class PreparePushRevision(Step): 62 class PreparePushRevision(Step):
75 MESSAGE = "Check which revision to push." 63 MESSAGE = "Check which revision to push."
76 64
77 def RunStep(self): 65 def RunStep(self):
78 if self._options.revision: 66 if self._options.revision:
79 self["push_hash"] = self.GitSVNFindGitHash(self._options.revision) 67 self["push_hash"] = self.GitSVNFindGitHash(self._options.revision)
80 else: 68 else:
81 self["push_hash"] = self.GitLog(n=1, format="%H", git_hash="HEAD") 69 self["push_hash"] = self.GitLog(n=1, format="%H", git_hash="HEAD")
(...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after
197 # Fetch from Rietveld but only retry once with one second delay since 185 # Fetch from Rietveld but only retry once with one second delay since
198 # there might be many revisions. 186 # there might be many revisions.
199 body = self.ReadURL(cl_url, wait_plan=[1]) 187 body = self.ReadURL(cl_url, wait_plan=[1])
200 except urllib2.URLError: # pragma: no cover 188 except urllib2.URLError: # pragma: no cover
201 pass 189 pass
202 return body 190 return body
203 191
204 def RunStep(self): 192 def RunStep(self):
205 self["date"] = self.GetDate() 193 self["date"] = self.GetDate()
206 output = "%s: Version %s\n\n" % (self["date"], self["version"]) 194 output = "%s: Version %s\n\n" % (self["date"], self["version"])
207 TextToFile(output, self.Config(CHANGELOG_ENTRY_FILE)) 195 TextToFile(output, self.Config("CHANGELOG_ENTRY_FILE"))
208 commits = self.GitLog(format="%H", 196 commits = self.GitLog(format="%H",
209 git_hash="%s..%s" % (self["last_push_bleeding_edge"], 197 git_hash="%s..%s" % (self["last_push_bleeding_edge"],
210 self["push_hash"])) 198 self["push_hash"]))
211 199
212 # Cache raw commit messages. 200 # Cache raw commit messages.
213 commit_messages = [ 201 commit_messages = [
214 [ 202 [
215 self.GitLog(n=1, format="%s", git_hash=commit), 203 self.GitLog(n=1, format="%s", git_hash=commit),
216 self.Reload(self.GitLog(n=1, format="%B", git_hash=commit)), 204 self.Reload(self.GitLog(n=1, format="%B", git_hash=commit)),
217 self.GitLog(n=1, format="%an", git_hash=commit), 205 self.GitLog(n=1, format="%an", git_hash=commit),
218 ] for commit in commits.splitlines() 206 ] for commit in commits.splitlines()
219 ] 207 ]
220 208
221 # Auto-format commit messages. 209 # Auto-format commit messages.
222 body = MakeChangeLogBody(commit_messages, auto_format=True) 210 body = MakeChangeLogBody(commit_messages, auto_format=True)
223 AppendToFile(body, self.Config(CHANGELOG_ENTRY_FILE)) 211 AppendToFile(body, self.Config("CHANGELOG_ENTRY_FILE"))
224 212
225 msg = (" Performance and stability improvements on all platforms." 213 msg = (" Performance and stability improvements on all platforms."
226 "\n#\n# The change log above is auto-generated. Please review if " 214 "\n#\n# The change log above is auto-generated. Please review if "
227 "all relevant\n# commit messages from the list below are included." 215 "all relevant\n# commit messages from the list below are included."
228 "\n# All lines starting with # will be stripped.\n#\n") 216 "\n# All lines starting with # will be stripped.\n#\n")
229 AppendToFile(msg, self.Config(CHANGELOG_ENTRY_FILE)) 217 AppendToFile(msg, self.Config("CHANGELOG_ENTRY_FILE"))
230 218
231 # Include unformatted commit messages as a reference in a comment. 219 # Include unformatted commit messages as a reference in a comment.
232 comment_body = MakeComment(MakeChangeLogBody(commit_messages)) 220 comment_body = MakeComment(MakeChangeLogBody(commit_messages))
233 AppendToFile(comment_body, self.Config(CHANGELOG_ENTRY_FILE)) 221 AppendToFile(comment_body, self.Config("CHANGELOG_ENTRY_FILE"))
234 222
235 223
236 class EditChangeLog(Step): 224 class EditChangeLog(Step):
237 MESSAGE = "Edit ChangeLog entry." 225 MESSAGE = "Edit ChangeLog entry."
238 226
239 def RunStep(self): 227 def RunStep(self):
240 print ("Please press <Return> to have your EDITOR open the ChangeLog " 228 print ("Please press <Return> to have your EDITOR open the ChangeLog "
241 "entry, then edit its contents to your liking. When you're done, " 229 "entry, then edit its contents to your liking. When you're done, "
242 "save the file and exit your EDITOR. ") 230 "save the file and exit your EDITOR. ")
243 self.ReadLine(default="") 231 self.ReadLine(default="")
244 self.Editor(self.Config(CHANGELOG_ENTRY_FILE)) 232 self.Editor(self.Config("CHANGELOG_ENTRY_FILE"))
245 233
246 # Strip comments and reformat with correct indentation. 234 # Strip comments and reformat with correct indentation.
247 changelog_entry = FileToText(self.Config(CHANGELOG_ENTRY_FILE)).rstrip() 235 changelog_entry = FileToText(self.Config("CHANGELOG_ENTRY_FILE")).rstrip()
248 changelog_entry = StripComments(changelog_entry) 236 changelog_entry = StripComments(changelog_entry)
249 changelog_entry = "\n".join(map(Fill80, changelog_entry.splitlines())) 237 changelog_entry = "\n".join(map(Fill80, changelog_entry.splitlines()))
250 changelog_entry = changelog_entry.lstrip() 238 changelog_entry = changelog_entry.lstrip()
251 239
252 if changelog_entry == "": # pragma: no cover 240 if changelog_entry == "": # pragma: no cover
253 self.Die("Empty ChangeLog entry.") 241 self.Die("Empty ChangeLog entry.")
254 242
255 # Safe new change log for adding it later to the trunk patch. 243 # Safe new change log for adding it later to the trunk patch.
256 TextToFile(changelog_entry, self.Config(CHANGELOG_ENTRY_FILE)) 244 TextToFile(changelog_entry, self.Config("CHANGELOG_ENTRY_FILE"))
257 245
258 246
259 class StragglerCommits(Step): 247 class StragglerCommits(Step):
260 MESSAGE = ("Fetch straggler commits that sneaked in since this script was " 248 MESSAGE = ("Fetch straggler commits that sneaked in since this script was "
261 "started.") 249 "started.")
262 250
263 def RunStep(self): 251 def RunStep(self):
264 self.GitSVNFetch() 252 self.GitSVNFetch()
265 self.GitCheckout("svn/bleeding_edge") 253 self.GitCheckout("svn/bleeding_edge")
266 254
267 255
268 class SquashCommits(Step): 256 class SquashCommits(Step):
269 MESSAGE = "Squash commits into one." 257 MESSAGE = "Squash commits into one."
270 258
271 def RunStep(self): 259 def RunStep(self):
272 # Instead of relying on "git rebase -i", we'll just create a diff, because 260 # Instead of relying on "git rebase -i", we'll just create a diff, because
273 # that's easier to automate. 261 # that's easier to automate.
274 TextToFile(self.GitDiff("svn/trunk", self["push_hash"]), 262 TextToFile(self.GitDiff("svn/trunk", self["push_hash"]),
275 self.Config(PATCH_FILE)) 263 self.Config("PATCH_FILE"))
276 264
277 # Convert the ChangeLog entry to commit message format. 265 # Convert the ChangeLog entry to commit message format.
278 text = FileToText(self.Config(CHANGELOG_ENTRY_FILE)) 266 text = FileToText(self.Config("CHANGELOG_ENTRY_FILE"))
279 267
280 # Remove date and trailing white space. 268 # Remove date and trailing white space.
281 text = re.sub(r"^%s: " % self["date"], "", text.rstrip()) 269 text = re.sub(r"^%s: " % self["date"], "", text.rstrip())
282 270
283 # Retrieve svn revision for showing the used bleeding edge revision in the 271 # Retrieve svn revision for showing the used bleeding edge revision in the
284 # commit message. 272 # commit message.
285 self["svn_revision"] = self.GitSVNFindSVNRev(self["push_hash"]) 273 self["svn_revision"] = self.GitSVNFindSVNRev(self["push_hash"])
286 suffix = PUSH_MESSAGE_SUFFIX % int(self["svn_revision"]) 274 suffix = PUSH_MESSAGE_SUFFIX % int(self["svn_revision"])
287 text = MSub(r"^(Version \d+\.\d+\.\d+)$", "\\1%s" % suffix, text) 275 text = MSub(r"^(Version \d+\.\d+\.\d+)$", "\\1%s" % suffix, text)
288 276
289 # Remove indentation and merge paragraphs into single long lines, keeping 277 # Remove indentation and merge paragraphs into single long lines, keeping
290 # empty lines between them. 278 # empty lines between them.
291 def SplitMapJoin(split_text, fun, join_text): 279 def SplitMapJoin(split_text, fun, join_text):
292 return lambda text: join_text.join(map(fun, text.split(split_text))) 280 return lambda text: join_text.join(map(fun, text.split(split_text)))
293 strip = lambda line: line.strip() 281 strip = lambda line: line.strip()
294 text = SplitMapJoin("\n\n", SplitMapJoin("\n", strip, " "), "\n\n")(text) 282 text = SplitMapJoin("\n\n", SplitMapJoin("\n", strip, " "), "\n\n")(text)
295 283
296 if not text: # pragma: no cover 284 if not text: # pragma: no cover
297 self.Die("Commit message editing failed.") 285 self.Die("Commit message editing failed.")
298 TextToFile(text, self.Config(COMMITMSG_FILE)) 286 TextToFile(text, self.Config("COMMITMSG_FILE"))
299 287
300 288
301 class NewBranch(Step): 289 class NewBranch(Step):
302 MESSAGE = "Create a new branch from trunk." 290 MESSAGE = "Create a new branch from trunk."
303 291
304 def RunStep(self): 292 def RunStep(self):
305 self.GitCreateBranch(self.Config(TRUNKBRANCH), "svn/trunk") 293 self.GitCreateBranch(self.Config("TRUNKBRANCH"), "svn/trunk")
306 294
307 295
308 class ApplyChanges(Step): 296 class ApplyChanges(Step):
309 MESSAGE = "Apply squashed changes." 297 MESSAGE = "Apply squashed changes."
310 298
311 def RunStep(self): 299 def RunStep(self):
312 self.ApplyPatch(self.Config(PATCH_FILE)) 300 self.ApplyPatch(self.Config("PATCH_FILE"))
313 os.remove(self.Config(PATCH_FILE)) 301 os.remove(self.Config("PATCH_FILE"))
314 302
315 303
316 class AddChangeLog(Step): 304 class AddChangeLog(Step):
317 MESSAGE = "Add ChangeLog changes to trunk branch." 305 MESSAGE = "Add ChangeLog changes to trunk branch."
318 306
319 def RunStep(self): 307 def RunStep(self):
320 # The change log has been modified by the patch. Reset it to the version 308 # The change log has been modified by the patch. Reset it to the version
321 # on trunk and apply the exact changes determined by this PrepareChangeLog 309 # on trunk and apply the exact changes determined by this PrepareChangeLog
322 # step above. 310 # step above.
323 self.GitCheckoutFile(self.Config(CHANGELOG_FILE), "svn/trunk") 311 self.GitCheckoutFile(self.Config("CHANGELOG_FILE"), "svn/trunk")
324 changelog_entry = FileToText(self.Config(CHANGELOG_ENTRY_FILE)) 312 changelog_entry = FileToText(self.Config("CHANGELOG_ENTRY_FILE"))
325 old_change_log = FileToText(self.Config(CHANGELOG_FILE)) 313 old_change_log = FileToText(self.Config("CHANGELOG_FILE"))
326 new_change_log = "%s\n\n\n%s" % (changelog_entry, old_change_log) 314 new_change_log = "%s\n\n\n%s" % (changelog_entry, old_change_log)
327 TextToFile(new_change_log, self.Config(CHANGELOG_FILE)) 315 TextToFile(new_change_log, self.Config("CHANGELOG_FILE"))
328 os.remove(self.Config(CHANGELOG_ENTRY_FILE)) 316 os.remove(self.Config("CHANGELOG_ENTRY_FILE"))
329 317
330 318
331 class SetVersion(Step): 319 class SetVersion(Step):
332 MESSAGE = "Set correct version for trunk." 320 MESSAGE = "Set correct version for trunk."
333 321
334 def RunStep(self): 322 def RunStep(self):
335 # The version file has been modified by the patch. Reset it to the version 323 # The version file has been modified by the patch. Reset it to the version
336 # on trunk and apply the correct version. 324 # on trunk and apply the correct version.
337 self.GitCheckoutFile(VERSION_FILE, "svn/trunk") 325 self.GitCheckoutFile(VERSION_FILE, "svn/trunk")
338 self.SetVersion(os.path.join(self.default_cwd, VERSION_FILE), "new_") 326 self.SetVersion(os.path.join(self.default_cwd, VERSION_FILE), "new_")
339 327
340 328
341 class CommitTrunk(Step): 329 class CommitTrunk(Step):
342 MESSAGE = "Commit to local trunk branch." 330 MESSAGE = "Commit to local trunk branch."
343 331
344 def RunStep(self): 332 def RunStep(self):
345 self.GitCommit(file_name = self.Config(COMMITMSG_FILE)) 333 self.GitCommit(file_name = self.Config("COMMITMSG_FILE"))
346 os.remove(self.Config(COMMITMSG_FILE)) 334 os.remove(self.Config("COMMITMSG_FILE"))
347 335
348 336
349 class SanityCheck(Step): 337 class SanityCheck(Step):
350 MESSAGE = "Sanity check." 338 MESSAGE = "Sanity check."
351 339
352 def RunStep(self): 340 def RunStep(self):
353 # TODO(machenbach): Run presubmit script here as it is now missing in the 341 # TODO(machenbach): Run presubmit script here as it is now missing in the
354 # prepare push process. 342 # prepare push process.
355 if not self.Confirm("Please check if your local checkout is sane: Inspect " 343 if not self.Confirm("Please check if your local checkout is sane: Inspect "
356 "%s, compile, run tests. Do you want to commit this new trunk " 344 "%s, compile, run tests. Do you want to commit this new trunk "
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
393 MESSAGE = "Done!" 381 MESSAGE = "Done!"
394 382
395 def RunStep(self): 383 def RunStep(self):
396 print("Congratulations, you have successfully created the trunk " 384 print("Congratulations, you have successfully created the trunk "
397 "revision %s. Please don't forget to roll this new version into " 385 "revision %s. Please don't forget to roll this new version into "
398 "Chromium, and to update the v8rel spreadsheet:" 386 "Chromium, and to update the v8rel spreadsheet:"
399 % self["version"]) 387 % self["version"])
400 print "%s\ttrunk\t%s" % (self["version"], self["trunk_revision"]) 388 print "%s\ttrunk\t%s" % (self["version"], self["trunk_revision"])
401 389
402 self.CommonCleanup() 390 self.CommonCleanup()
403 if self.Config(TRUNKBRANCH) != self["current_branch"]: 391 if self.Config("TRUNKBRANCH") != self["current_branch"]:
404 self.GitDeleteBranch(self.Config(TRUNKBRANCH)) 392 self.GitDeleteBranch(self.Config("TRUNKBRANCH"))
405 393
406 394
407 class PushToTrunk(ScriptsBase): 395 class PushToTrunk(ScriptsBase):
408 def _PrepareOptions(self, parser): 396 def _PrepareOptions(self, parser):
409 group = parser.add_mutually_exclusive_group() 397 group = parser.add_mutually_exclusive_group()
410 group.add_argument("-f", "--force", 398 group.add_argument("-f", "--force",
411 help="Don't prompt the user.", 399 help="Don't prompt the user.",
412 default=False, action="store_true") 400 default=False, action="store_true")
413 group.add_argument("-m", "--manual", 401 group.add_argument("-m", "--manual",
414 help="Prompt the user at every important step.", 402 help="Prompt the user at every important step.",
(...skipping 15 matching lines...) Expand all
430 print "Specify your chromium.org email with -a in (semi-)automatic mode." 418 print "Specify your chromium.org email with -a in (semi-)automatic mode."
431 return False 419 return False
432 if options.revision and not int(options.revision) > 0: 420 if options.revision and not int(options.revision) > 0:
433 print("The --revision flag must be a positiv integer pointing to a " 421 print("The --revision flag must be a positiv integer pointing to a "
434 "valid svn revision.") 422 "valid svn revision.")
435 return False 423 return False
436 424
437 options.tbr_commit = not options.manual 425 options.tbr_commit = not options.manual
438 return True 426 return True
439 427
428 def _Config(self):
429 return {
430 "BRANCHNAME": "prepare-push",
431 "TRUNKBRANCH": "trunk-push",
432 "PERSISTFILE_BASENAME": "/tmp/v8-push-to-trunk-tempfile",
433 "CHANGELOG_FILE": "ChangeLog",
434 "CHANGELOG_ENTRY_FILE": "/tmp/v8-push-to-trunk-tempfile-changelog-entry",
435 "PATCH_FILE": "/tmp/v8-push-to-trunk-tempfile-patch-file",
436 "COMMITMSG_FILE": "/tmp/v8-push-to-trunk-tempfile-commitmsg",
437 }
438
440 def _Steps(self): 439 def _Steps(self):
441 return [ 440 return [
442 Preparation, 441 Preparation,
443 FreshBranch, 442 FreshBranch,
444 PreparePushRevision, 443 PreparePushRevision,
445 DetectLastPush, 444 DetectLastPush,
446 GetCurrentBleedingEdgeVersion, 445 GetCurrentBleedingEdgeVersion,
447 IncrementVersion, 446 IncrementVersion,
448 PrepareChangeLog, 447 PrepareChangeLog,
449 EditChangeLog, 448 EditChangeLog,
450 StragglerCommits, 449 StragglerCommits,
451 SquashCommits, 450 SquashCommits,
452 NewBranch, 451 NewBranch,
453 ApplyChanges, 452 ApplyChanges,
454 AddChangeLog, 453 AddChangeLog,
455 SetVersion, 454 SetVersion,
456 CommitTrunk, 455 CommitTrunk,
457 SanityCheck, 456 SanityCheck,
458 CommitSVN, 457 CommitSVN,
459 TagRevision, 458 TagRevision,
460 CleanUp, 459 CleanUp,
461 ] 460 ]
462 461
463 462
464 if __name__ == "__main__": # pragma: no cover 463 if __name__ == "__main__": # pragma: no cover
465 sys.exit(PushToTrunk(CONFIG).Run()) 464 sys.exit(PushToTrunk().Run())
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698