Rietveld Code Review Tool
Help | Bug tracker | Discussion group | Source code

Delta Between Two Patch Sets: releaseAutomation.py

Issue 29611593: Issue 5996 - Release consistent versions across WebExtensions (Closed) Base URL: https://codereview.adblockplus.org/29609559/
Left Patch Set: Addressing comments Created Nov. 28, 2017, 1:27 p.m.
Right Patch Set: Addressing comments Created Nov. 28, 2017, 2:17 p.m.
Left:
Right:
Use n/p to move between diff chunks; N/P to move between comments.
Jump to:
Left: Side by side diff | Download
Right: Side by side diff | Download
« no previous file with change/comment | « packagerChrome.py ('k') | tox.ini » ('j') | no next file with change/comment »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
LEFTRIGHT
1 # This Source Code Form is subject to the terms of the Mozilla Public 1 # This Source Code Form is subject to the terms of the Mozilla Public
2 # License, v. 2.0. If a copy of the MPL was not distributed with this 2 # License, v. 2.0. If a copy of the MPL was not distributed with this
3 # file, You can obtain one at http://mozilla.org/MPL/2.0/. 3 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
4 4
5 from __future__ import print_function 5 from __future__ import print_function
6 6
7 import os 7 import os
8 import operator 8 import operator
9 import re 9 import re
10 import codecs 10 import codecs
(...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after
118 return continue_with_outgoing() 118 return continue_with_outgoing()
119 return True 119 return True
120 120
121 121
122 def compare_versions(a, b): 122 def compare_versions(a, b):
123 """Compare two version numbers.""" 123 """Compare two version numbers."""
124 a_digits = [int(v) for v in a.split('.')] 124 a_digits = [int(v) for v in a.split('.')]
125 b_digits = [int(v) for v in b.split('.')] 125 b_digits = [int(v) for v in b.split('.')]
126 126
127 def safe_get(items, index): 127 def safe_get(items, index):
128 return int(items[index]) if index < len(items) else 0 128 return items[index] if index < len(items) else 0
Wladimir Palant 2017/11/28 14:04:41 You don't need to call int() here, you converted t
tlucas 2017/11/28 14:21:15 Done.
129 129
130 for i in range(len(a_digits)): 130 for i in range(max(len(a_digits), len(b_digits))):
Wladimir Palant 2017/11/28 14:04:41 This needs to be max(len(a_digits), len(b_digits))
tlucas 2017/11/28 14:21:15 Done.
131 result = safe_get(a_digits, i) - safe_get(b_digits, i) 131 result = safe_get(a_digits, i) - safe_get(b_digits, i)
132 if result != 0: 132 if result != 0:
133 return result 133 return result
134 return 0 134 return 0
135 135
136 136
137 def release_combination_is_possible(version, platforms, base_dir): 137 def release_combination_is_possible(version, platforms, base_dir):
138 """Determine whether a release for the given parameters is possible. 138 """Determine whether a release for the given parameters is possible.
139 139
140 Examine existing tags in order to find either higher or matching versions. 140 Examine existing tags in order to find either higher or matching versions.
141 The release is impossible if a) a higher version for a requested platform 141 The release is impossible if a) a higher version for a requested platform
142 exists, or if b) a matching version exists and the requested set of 142 exists, or if b) a matching version exists and the requested set of
143 platforms differs from what was already released. 143 platforms differs from what was already released.
144 """ 144 """
145 def higher_tag_version(tag, version, platforms): 145 def higher_tag_version(tag, version, platforms):
146 return (compare_versions(tag[0], version) > 0 and 146 return (compare_versions(tag[0], version) > 0 and
147 set(tag[1:]).intersection(platforms)) 147 set(tag[1:]).intersection(platforms))
148 148
149 def incomplete_platforms_for_version(tag, version, platforms): 149 def incomplete_platforms_for_version(tag, version, platforms):
150 intersection = set(tag[1:]).intersection(platforms) 150 intersection = set(tag[1:]).intersection(platforms)
151 return (compare_versions(tag[0], version) == 0 and 151 return (compare_versions(tag[0], version) == 0 and
152 intersection and set(platforms) != set(tag[1:])) 152 intersection and set(platforms) != set(tag[1:]))
153 153
154 # only consider tags of the form "1.2[.x ...]-platform[-platform ...] 154 # only consider tags of the form "1.2[.x ...]-platform[-platform ...]
155 platform_tags = re.compile(r'^(\d+(?:(?:\.\d+)+)(?:-\w+)+)$', re.MULTILINE) 155 platform_tags = re.compile(r'^(\d+(?:(?:\.\d+)*)(?:-\w+)+)$', re.MULTILINE)
Wladimir Palant 2017/11/28 14:04:41 Technically speaking, "1" is a valid version numbe
tlucas 2017/11/28 14:21:15 Good point, Done.
156 tags = [ 156 tags = [
157 c for c in [ 157 c for c in [
158 t.split('-') for t in 158 t.split('-') for t in
159 platform_tags.findall(subprocess.check_output( 159 platform_tags.findall(subprocess.check_output(
160 ['hg', 'tags', '-R', base_dir, '-q'])) 160 ['hg', 'tags', '-R', base_dir, '-q']))
161 ] if compare_versions(c[0], version) >= 0 161 ] if compare_versions(c[0], version) >= 0
162 ] 162 ]
163 163
164 for tag in tags: 164 for tag in tags:
165 if higher_tag_version(tag, version, platforms): 165 if higher_tag_version(tag, version, platforms):
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
210 ) 210 )
211 211
212 packager.createBuild(base_dir, type=platform, outFile=build_path, 212 packager.createBuild(base_dir, type=platform, outFile=build_path,
213 releaseBuild=True, keyFile=key_file) 213 releaseBuild=True, keyFile=key_file)
214 214
215 return build_path 215 return build_path
216 216
217 217
218 def release_commit(base_dir, extension_name, version, platforms): 218 def release_commit(base_dir, extension_name, version, platforms):
219 """Create a release commit with a representative message.""" 219 """Create a release commit with a representative message."""
220 subprocess.check_call([ 220 subprocess.check_output([
221 'hg', 'commit', '-R', base_dir, '-m', 221 'hg', 'commit', '-R', base_dir, '-m',
222 'Noissue - Releasing {} {} for {}'.format( 222 'Noissue - Releasing {} {} for {}'.format(
223 extension_name, version, 223 extension_name, version,
224 ', '.join([p.capitalize() for p in platforms]))]) 224 ', '.join([p.capitalize() for p in platforms]))],
225 stderr=subprocess.STDOUT)
225 226
226 227
227 def release_tag(base_dir, tag_name, extension_name): 228 def release_tag(base_dir, tag_name, extension_name):
228 """Create a tag, along with a commit message for that tag.""" 229 """Create a tag, along with a commit message for that tag."""
229 subprocess.check_call([ 230 subprocess.check_call([
230 'hg', 'tag', '-R', base_dir, '-f', tag_name, 231 'hg', 'tag', '-R', base_dir, '-f', tag_name,
231 '-m', 'Noissue - Adding release tag for {} {}'.format( 232 '-m', 'Noissue - Adding release tag for {} {}'.format(
232 extension_name, tag_name)]) 233 extension_name, tag_name)])
233 234
234 235
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
273 ) 274 )
274 275
275 # Only create one commit, one tag and one source archive for all 276 # Only create one commit, one tag and one source archive for all
276 # platforms 277 # platforms
277 archive_path = os.path.join( 278 archive_path = os.path.join(
278 downloads_repo, 279 downloads_repo,
279 'adblockplus-{}-source.tgz'.format(release_identifier), 280 'adblockplus-{}-source.tgz'.format(release_identifier),
280 ) 281 )
281 create_sourcearchive(baseDir, archive_path) 282 create_sourcearchive(baseDir, archive_path)
282 downloads.append(archive_path) 283 downloads.append(archive_path)
283 if not re_release: 284 try:
Wladimir Palant 2017/11/28 14:04:41 This might not be a good measure. What if the rele
tlucas 2017/11/28 14:21:15 Done. Replaced it with a try-except block, re-rais
284 release_commit(baseDir, extension_name, version, target_platforms) 285 release_commit(baseDir, extension_name, version, target_platforms)
286 except subprocess.CalledProcessError as e:
287 if not (re_release and 'nothing changed' in e.output):
288 raise
285 289
286 release_tag(baseDir, release_identifier, extension_name) 290 release_tag(baseDir, release_identifier, extension_name)
287 291
288 # Now add the downloads and commit 292 # Now add the downloads and commit
289 subprocess.check_call(['hg', 'add', '-R', downloads_repo] + downloads) 293 subprocess.check_call(['hg', 'add', '-R', downloads_repo] + downloads)
290 release_commit(downloads_repo, extension_name, version, target_platforms) 294 release_commit(downloads_repo, extension_name, version, target_platforms)
291 295
292 # Push all changes 296 # Push all changes
293 subprocess.check_call(['hg', 'push', '-R', baseDir]) 297 subprocess.check_call(['hg', 'push', '-R', baseDir])
294 subprocess.check_call(['hg', 'push', '-R', downloads_repo]) 298 subprocess.check_call(['hg', 'push', '-R', downloads_repo])
LEFTRIGHT

Powered by Google App Engine
This is Rietveld