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

Side by Side Diff: tools/release/merge_to_branch.py

Issue 1398033003: [Release] Update merge script to leverage auto-tag bot (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Reviewable version Created 5 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
« no previous file with comments | « no previous file | tools/release/test_scripts.py » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 #!/usr/bin/env python 1 #!/usr/bin/env python
2 # Copyright 2014 the V8 project authors. All rights reserved. 2 # Copyright 2014 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 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
67 class SearchArchitecturePorts(Step): 67 class SearchArchitecturePorts(Step):
68 MESSAGE = "Search for corresponding architecture ports." 68 MESSAGE = "Search for corresponding architecture ports."
69 69
70 def RunStep(self): 70 def RunStep(self):
71 self["full_revision_list"] = list(OrderedDict.fromkeys( 71 self["full_revision_list"] = list(OrderedDict.fromkeys(
72 self._options.revisions)) 72 self._options.revisions))
73 port_revision_list = [] 73 port_revision_list = []
74 for revision in self["full_revision_list"]: 74 for revision in self["full_revision_list"]:
75 # Search for commits which matches the "Port XXX" pattern. 75 # Search for commits which matches the "Port XXX" pattern.
76 git_hashes = self.GitLog(reverse=True, format="%H", 76 git_hashes = self.GitLog(reverse=True, format="%H",
77 grep="Port %s" % revision, 77 grep="^[P,p]ort %s" % revision,
Michael Achenbach 2015/10/21 12:38:37 Does there really need to be a comma in the charac
Michael Hablich 2015/10/22 14:25:50 Done.
78 branch=self.vc.RemoteMasterBranch()) 78 branch=self.vc.RemoteMasterBranch())
79 for git_hash in git_hashes.splitlines(): 79 for git_hash in git_hashes.splitlines():
80 revision_title = self.GitLog(n=1, format="%s", git_hash=git_hash) 80 revision_title = self.GitLog(n=1, format="%s", git_hash=git_hash)
81 81
82 # Is this revision included in the original revision list? 82 # Is this revision included in the original revision list?
83 if git_hash in self["full_revision_list"]: 83 if git_hash in self["full_revision_list"]:
84 print("Found port of %s -> %s (already included): %s" 84 print("Found port of %s -> %s (already included): %s"
85 % (revision, git_hash, revision_title)) 85 % (revision, git_hash, revision_title))
86 else: 86 else:
87 print("Found port of %s -> %s: %s" 87 print("Found port of %s -> %s: %s"
88 % (revision, git_hash, revision_title)) 88 % (revision, git_hash, revision_title))
89 port_revision_list.append(git_hash) 89 port_revision_list.append(git_hash)
90 90
91 # Do we find any port? 91 # Do we find any port?
92 if len(port_revision_list) > 0: 92 if len(port_revision_list) > 0:
93 if self.Confirm("Automatically add corresponding ports (%s)?" 93 if self.Confirm("Automatically add corresponding ports (%s)?"
94 % ", ".join(port_revision_list)): 94 % ", ".join(port_revision_list)):
95 #: 'y': Add ports to revision list. 95 #: 'y': Add ports to revision list.
96 self["full_revision_list"].extend(port_revision_list) 96 self["full_revision_list"].extend(port_revision_list)
97 97
98 98
99 class CreateCommitMessage(Step): 99 class CreateCommitMessage(Step):
100 MESSAGE = "Create commit message." 100 MESSAGE = "Create commit message."
101 101
102 def _create_commit_description(self, commit_hash):
103 patch_merge_desc = self.GitLog(n=1, format="%s", git_hash=commit_hash)
104 description = "Merged: " + patch_merge_desc + "\n"
105 description = description + "Hash: " + commit_hash + "\n\n"
106 return description
107
102 def RunStep(self): 108 def RunStep(self):
103 109
104 # Stringify: ["abcde", "12345"] -> "abcde, 12345" 110 # Stringify: ["abcde", "12345"] -> "abcde, 12345"
105 self["revision_list"] = ", ".join(self["full_revision_list"]) 111 self["revision_list"] = ", ".join(self["full_revision_list"])
106 112
107 if not self["revision_list"]: # pragma: no cover 113 if not self["revision_list"]: # pragma: no cover
108 self.Die("Revision list is empty.") 114 self.Die("Revision list is empty.")
109 115
110 action_text = "Merged %s" 116 msg_pieces = []
111 117
112 # The commit message title is added below after the version is specified. 118 if len(self["full_revision_list"]) > 1:
113 msg_pieces = [ 119 self["commit_title"] = "Merged: Squashed multiple commits."
114 "\n".join(action_text % s for s in self["full_revision_list"]), 120 else:
115 ] 121 commit_hash = self["full_revision_list"][0]
116 msg_pieces.append("\n\n") 122 patch_merge_desc = self.GitLog(n=1, format="%s", git_hash=commit_hash)
123 title = "Merged: " + patch_merge_desc
124 self["commit_title"] = title
117 125
118 for commit_hash in self["full_revision_list"]: 126 for commit_hash in self["full_revision_list"]:
119 patch_merge_desc = self.GitLog(n=1, format="%s", git_hash=commit_hash) 127 msg_pieces.append(self._create_commit_description(commit_hash))
120 msg_pieces.append("%s\n\n" % patch_merge_desc)
121 128
122 bugs = [] 129 bugs = []
123 for commit_hash in self["full_revision_list"]: 130 for commit_hash in self["full_revision_list"]:
124 msg = self.GitLog(n=1, git_hash=commit_hash) 131 msg = self.GitLog(n=1, git_hash=commit_hash)
125 for bug in re.findall(r"^[ \t]*BUG[ \t]*=[ \t]*(.*?)[ \t]*$", msg, re.M): 132 for bug in re.findall(r"^[ \t]*BUG[ \t]*=[ \t]*(.*?)[ \t]*$", msg, re.M):
126 bugs.extend(s.strip() for s in bug.split(",")) 133 bugs.extend(s.strip() for s in bug.split(","))
127 bug_aggregate = ",".join(sorted(filter(lambda s: s and s != "none", bugs))) 134 bug_aggregate = ",".join(sorted(filter(lambda s: s and s != "none", bugs)))
128 if bug_aggregate: 135 if bug_aggregate:
129 msg_pieces.append("BUG=%s\nLOG=N\n" % bug_aggregate) 136 msg_pieces.append("BUG=%s\nLOG=N\n" % bug_aggregate)
130 137
131 self["new_commit_msg"] = "".join(msg_pieces) 138 self["new_commit_msg"] = "".join(msg_pieces)
132 139
133 140
134 class ApplyPatches(Step): 141 class ApplyPatches(Step):
135 MESSAGE = "Apply patches for selected revisions." 142 MESSAGE = "Apply patches for selected revisions."
136 143
137 def RunStep(self): 144 def RunStep(self):
138 for commit_hash in self["full_revision_list"]: 145 for commit_hash in self["full_revision_list"]:
139 print("Applying patch for %s to %s..." 146 print("Applying patch for %s to %s..."
140 % (commit_hash, self["merge_to_branch"])) 147 % (commit_hash, self["merge_to_branch"]))
141 patch = self.GitGetPatch(commit_hash) 148 patch = self.GitGetPatch(commit_hash)
142 TextToFile(patch, self.Config("TEMPORARY_PATCH_FILE")) 149 TextToFile(patch, self.Config("TEMPORARY_PATCH_FILE"))
143 self.ApplyPatch(self.Config("TEMPORARY_PATCH_FILE")) 150 self.ApplyPatch(self.Config("TEMPORARY_PATCH_FILE"))
144 if self._options.patch: 151 if self._options.patch:
145 self.ApplyPatch(self._options.patch) 152 self.ApplyPatch(self._options.patch)
146 153
147
148 class PrepareVersion(Step):
149 MESSAGE = "Prepare version file."
150
151 def RunStep(self):
152 # This is used to calculate the patch level increment.
153 self.ReadAndPersistVersion()
154
155
156 class IncrementVersion(Step):
157 MESSAGE = "Increment version number."
158
159 def RunStep(self):
160 new_patch = str(int(self["patch"]) + 1)
161 if self.Confirm("Automatically increment V8_PATCH_LEVEL? (Saying 'n' will "
162 "fire up your EDITOR on %s so you can make arbitrary "
163 "changes. When you're done, save the file and exit your "
164 "EDITOR.)" % VERSION_FILE):
165 text = FileToText(os.path.join(self.default_cwd, VERSION_FILE))
166 text = MSub(r"(?<=#define V8_PATCH_LEVEL)(?P<space>\s+)\d*$",
167 r"\g<space>%s" % new_patch,
168 text)
169 TextToFile(text, os.path.join(self.default_cwd, VERSION_FILE))
170 else:
171 self.Editor(os.path.join(self.default_cwd, VERSION_FILE))
172 self.ReadAndPersistVersion("new_")
173 self["version"] = "%s.%s.%s.%s" % (self["new_major"],
174 self["new_minor"],
175 self["new_build"],
176 self["new_patch"])
177
178
179 class CommitLocal(Step): 154 class CommitLocal(Step):
180 MESSAGE = "Commit to local branch." 155 MESSAGE = "Commit to local branch."
181 156
182 def RunStep(self): 157 def RunStep(self):
183 # Add a commit message title. 158 # Add a commit message title.
184 self["commit_title"] = "Version %s (cherry-pick)" % self["version"]
185 self["new_commit_msg"] = "%s\n\n%s" % (self["commit_title"], 159 self["new_commit_msg"] = "%s\n\n%s" % (self["commit_title"],
186 self["new_commit_msg"]) 160 self["new_commit_msg"])
187 TextToFile(self["new_commit_msg"], self.Config("COMMITMSG_FILE")) 161 TextToFile(self["new_commit_msg"], self.Config("COMMITMSG_FILE"))
188 self.GitCommit(file_name=self.Config("COMMITMSG_FILE")) 162 self.GitCommit(file_name=self.Config("COMMITMSG_FILE"))
189 163
190 164
191 class CommitRepository(Step): 165 class CommitRepository(Step):
192 MESSAGE = "Commit to the repository." 166 MESSAGE = "Commit to the repository."
193 167
194 def RunStep(self): 168 def RunStep(self):
195 self.GitCheckout(self.Config("BRANCHNAME")) 169 self.GitCheckout(self.Config("BRANCHNAME"))
196 self.WaitForLGTM() 170 self.WaitForLGTM()
197 self.GitPresubmit() 171 self.GitPresubmit()
198 self.vc.CLLand() 172 self.vc.CLLand()
199 173
200
201 class TagRevision(Step):
202 MESSAGE = "Create the tag."
203
204 def RunStep(self):
205 print "Creating tag %s" % self["version"]
206 self.vc.Tag(self["version"],
207 self.vc.RemoteBranch(self["merge_to_branch"]),
208 self["commit_title"])
209
210
211 class CleanUp(Step): 174 class CleanUp(Step):
212 MESSAGE = "Cleanup." 175 MESSAGE = "Cleanup."
213 176
214 def RunStep(self): 177 def RunStep(self):
215 self.CommonCleanup() 178 self.CommonCleanup()
216 print "*** SUMMARY ***" 179 print "*** SUMMARY ***"
217 print "version: %s" % self["version"] 180 print "version: %s" % self["version"]
218 print "branch: %s" % self["merge_to_branch"] 181 print "branch: %s" % self["merge_to_branch"]
219 if self["revision_list"]: 182 if self["revision_list"]:
220 print "patches: %s" % self["revision_list"] 183 print "patches: %s" % self["revision_list"]
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
269 "COMMITMSG_FILE": "/tmp/v8-prepare-merge-tempfile-commitmsg", 232 "COMMITMSG_FILE": "/tmp/v8-prepare-merge-tempfile-commitmsg",
270 } 233 }
271 234
272 def _Steps(self): 235 def _Steps(self):
273 return [ 236 return [
274 Preparation, 237 Preparation,
275 CreateBranch, 238 CreateBranch,
276 SearchArchitecturePorts, 239 SearchArchitecturePorts,
277 CreateCommitMessage, 240 CreateCommitMessage,
278 ApplyPatches, 241 ApplyPatches,
279 PrepareVersion,
280 IncrementVersion,
281 CommitLocal, 242 CommitLocal,
282 UploadStep, 243 UploadStep,
283 CommitRepository, 244 CommitRepository,
284 TagRevision,
285 CleanUp, 245 CleanUp,
286 ] 246 ]
287 247
288 248
289 if __name__ == "__main__": # pragma: no cover 249 if __name__ == "__main__": # pragma: no cover
290 sys.exit(MergeToBranch().Run()) 250 sys.exit(MergeToBranch().Run())
OLDNEW
« no previous file with comments | « no previous file | tools/release/test_scripts.py » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698