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

Delta Between Two Patch Sets: sitescripts/extensions/bin/createNightlies.py

Issue 29630555: Issue 6141, 6140 - Adapt to new build.py interface (Closed) Base URL: https://hg.adblockplus.org/sitescripts/file/6287fd6aa256
Left Patch Set: Issue 6141, 6140 - Adapt to new build.py interface Created Dec. 5, 2017, 11:03 a.m.
Right Patch Set: NO CHANGE rebase against current master Created Dec. 5, 2017, 12:34 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 | « .sitescripts.example ('k') | no next file » | 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 file is part of the Adblock Plus web scripts, 1 # This file is part of the Adblock Plus web scripts,
2 # Copyright (C) 2006-present eyeo GmbH 2 # Copyright (C) 2006-present eyeo GmbH
3 # 3 #
4 # Adblock Plus is free software: you can redistribute it and/or modify 4 # Adblock Plus is free software: you can redistribute it and/or modify
5 # it under the terms of the GNU General Public License version 3 as 5 # it under the terms of the GNU General Public License version 3 as
6 # published by the Free Software Foundation. 6 # published by the Free Software Foundation.
7 # 7 #
8 # Adblock Plus is distributed in the hope that it will be useful, 8 # Adblock Plus is distributed in the hope that it will be useful,
9 # but WITHOUT ANY WARRANTY; without even the implied warranty of 9 # but WITHOUT ANY WARRANTY; without even the implied warranty of
10 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 10 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
44 import zipfile 44 import zipfile
45 import contextlib 45 import contextlib
46 46
47 from xml.dom.minidom import parse as parseXml 47 from xml.dom.minidom import parse as parseXml
48 48
49 from sitescripts.extensions.utils import ( 49 from sitescripts.extensions.utils import (
50 compareVersions, Configuration, 50 compareVersions, Configuration,
51 writeAndroidUpdateManifest 51 writeAndroidUpdateManifest
52 ) 52 )
53 from sitescripts.utils import get_config, get_template 53 from sitescripts.utils import get_config, get_template
54 from sitescripts.extensions.bin.legacy import xarfile
55 54
56 MAX_BUILDS = 50 55 MAX_BUILDS = 50
57 56
58 57
59 # Google and Microsoft APIs use HTTP error codes with error message in 58 # Google and Microsoft APIs use HTTP error codes with error message in
60 # body. So we add the response body to the HTTPError to get more 59 # body. So we add the response body to the HTTPError to get more
61 # meaningful error messages. 60 # meaningful error messages.
62 class HTTPErrorBodyHandler(urllib2.HTTPDefaultErrorHandler): 61 class HTTPErrorBodyHandler(urllib2.HTTPDefaultErrorHandler):
63 def http_error_default(self, req, fp, code, msg, hdrs): 62 def http_error_default(self, req, fp, code, msg, hdrs):
64 raise urllib2.HTTPError(req.get_full_url(), code, 63 raise urllib2.HTTPError(req.get_full_url(), code,
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
99 'defaults.id=', self.config.repository 98 'defaults.id=', self.config.repository
100 ] 99 ]
101 return subprocess.check_output(command).strip() 100 return subprocess.check_output(command).strip()
102 101
103 def getCurrentBuild(self): 102 def getCurrentBuild(self):
104 """ 103 """
105 calculates the (typically numerical) build ID for the current build 104 calculates the (typically numerical) build ID for the current build
106 """ 105 """
107 command = ['hg', 'id', '-n', '--config', 'defaults.id=', self.tempdir] 106 command = ['hg', 'id', '-n', '--config', 'defaults.id=', self.tempdir]
108 build = subprocess.check_output(command).strip() 107 build = subprocess.check_output(command).strip()
109 if self.config.type == 'gecko': 108 if self.config.type in {'gecko', 'gecko-webext'}:
110 build += 'beta' 109 build += 'beta'
111 return build 110 return build
112 111
113 def getChanges(self): 112 def getChanges(self):
114 """ 113 """
115 retrieve changes between the current and previous ("first") revision 114 retrieve changes between the current and previous ("first") revision
116 """ 115 """
117 command = [ 116 command = [
118 'hg', 'log', '-R', self.tempdir, '-r', 117 'hg', 'log', '-R', self.tempdir, '-r',
119 'reverse(ancestors({}))'.format(self.config.revision), '-l', '50', 118 'reverse(ancestors({}))'.format(self.config.revision), '-l', '50',
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
163 os.symlink(os.path.basename(changelogPath), linkPath) 162 os.symlink(os.path.basename(changelogPath), linkPath)
164 else: 163 else:
165 shutil.copyfile(changelogPath, linkPath) 164 shutil.copyfile(changelogPath, linkPath)
166 165
167 def readGeckoMetadata(self): 166 def readGeckoMetadata(self):
168 """ 167 """
169 read Gecko-specific metadata file from a cloned repository 168 read Gecko-specific metadata file from a cloned repository
170 and parse id, version, basename and the compat section 169 and parse id, version, basename and the compat section
171 out of the file 170 out of the file
172 """ 171 """
173 import buildtools.packagerChrome as packager 172 import buildtools.packagerGecko as packager
174 metadata = packager.readMetadata(self.tempdir, self.config.type) 173 metadata = packager.readMetadata(self.tempdir, self.config.type)
175 self.extensionID = metadata.get('general', 'id') 174 self.extensionID = metadata.get('general', 'id')
176 self.version = packager.getBuildVersion(self.tempdir, metadata, False, 175 self.version = packager.getBuildVersion(self.tempdir, metadata, False,
177 self.buildNum) 176 self.buildNum)
178 self.basename = metadata.get('general', 'basename') 177 self.basename = metadata.get('general', 'basename')
179 178
180 def readAndroidMetadata(self): 179 def readAndroidMetadata(self):
181 """ 180 """
182 Read Android-specific metadata from AndroidManifest.xml file. 181 Read Android-specific metadata from AndroidManifest.xml file.
183 """ 182 """
(...skipping 30 matching lines...) Expand all
214 metadata = packager.readMetadata(self.tempdir, self.config.type) 213 metadata = packager.readMetadata(self.tempdir, self.config.type)
215 self.version = packager.getBuildVersion(self.tempdir, metadata, False, 214 self.version = packager.getBuildVersion(self.tempdir, metadata, False,
216 self.buildNum) 215 self.buildNum)
217 self.basename = metadata.get('general', 'basename') 216 self.basename = metadata.get('general', 'basename')
218 217
219 self.compat = [] 218 self.compat = []
220 if metadata.has_section('compat') and metadata.has_option('compat', 'chr ome'): 219 if metadata.has_section('compat') and metadata.has_option('compat', 'chr ome'):
221 self.compat.append({'id': 'chrome', 'minVersion': metadata.get('comp at', 'chrome')}) 220 self.compat.append({'id': 'chrome', 'minVersion': metadata.get('comp at', 'chrome')})
222 221
223 def readSafariMetadata(self): 222 def readSafariMetadata(self):
224 import sitescripts.extensions.bin.legacy.packagerSafari as packager 223 import buildtools.packagerSafari as packager
224 from buildtools import xarfile
225 metadata = packager.readMetadata(self.tempdir, self.config.type) 225 metadata = packager.readMetadata(self.tempdir, self.config.type)
226 certs = xarfile.read_certificates_and_key(self.config.keyFile)[0] 226 certs = xarfile.read_certificates_and_key(self.config.keyFile)[0]
227 227
228 self.certificateID = packager.get_developer_identifier(certs) 228 self.certificateID = packager.get_developer_identifier(certs)
229 self.version = packager.getBuildVersion(self.tempdir, metadata, False, 229 self.version = packager.getBuildVersion(self.tempdir, metadata, False,
230 self.buildNum) 230 self.buildNum)
231 self.shortVersion = metadata.get('general', 'version') 231 self.shortVersion = metadata.get('general', 'version')
232 self.basename = metadata.get('general', 'basename') 232 self.basename = metadata.get('general', 'basename')
233 self.updatedFromGallery = False 233 self.updatedFromGallery = False
234 234
(...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after
340 os.remove(self.path) 340 os.remove(self.path)
341 raise 341 raise
342 else: 342 else:
343 env = os.environ 343 env = os.environ
344 spiderMonkeyBinary = self.config.spiderMonkeyBinary 344 spiderMonkeyBinary = self.config.spiderMonkeyBinary
345 if spiderMonkeyBinary: 345 if spiderMonkeyBinary:
346 env = dict(env, SPIDERMONKEY_BINARY=spiderMonkeyBinary) 346 env = dict(env, SPIDERMONKEY_BINARY=spiderMonkeyBinary)
347 347
348 command = [os.path.join(self.tempdir, 'build.py'), 348 command = [os.path.join(self.tempdir, 'build.py'),
349 'build', '-t', self.config.type, '-b', self.buildNum] 349 'build', '-t', self.config.type, '-b', self.buildNum]
350 if self.config.type not in {'gecko', 'edge'}: 350 if self.config.type not in {'gecko', 'gecko-webext', 'edge'}:
351 command.extend(['-k', self.config.keyFile]) 351 command.extend(['-k', self.config.keyFile])
352 command.append(self.path) 352 command.append(self.path)
353 subprocess.check_call(command, env=env) 353 subprocess.check_call(command, env=env)
354 354
355 if not os.path.exists(self.path): 355 if not os.path.exists(self.path):
356 raise Exception("Build failed, output file hasn't been created") 356 raise Exception("Build failed, output file hasn't been created")
357 357
358 linkPath = os.path.join(baseDir, '00latest%s' % self.config.packageSuffi x) 358 linkPath = os.path.join(baseDir, '00latest%s' % self.config.packageSuffi x)
359 if hasattr(os, 'symlink'): 359 if hasattr(os, 'symlink'):
360 if os.path.exists(linkPath): 360 if os.path.exists(linkPath):
(...skipping 285 matching lines...) Expand 10 before | Expand all | Expand 10 after
646 self.copyRepository() 646 self.copyRepository()
647 self.buildNum = self.getCurrentBuild() 647 self.buildNum = self.getCurrentBuild()
648 648
649 # get meta data from the repository 649 # get meta data from the repository
650 if self.config.type == 'android': 650 if self.config.type == 'android':
651 self.readAndroidMetadata() 651 self.readAndroidMetadata()
652 elif self.config.type == 'chrome': 652 elif self.config.type == 'chrome':
653 self.readChromeMetadata() 653 self.readChromeMetadata()
654 elif self.config.type == 'safari': 654 elif self.config.type == 'safari':
655 self.readSafariMetadata() 655 self.readSafariMetadata()
656 elif self.config.type == 'gecko': 656 elif self.config.type in {'gecko', 'gecko-webext'}:
657 self.readGeckoMetadata() 657 self.readGeckoMetadata()
658 elif self.config.type == 'edge': 658 elif self.config.type == 'edge':
659 self.read_edge_metadata() 659 self.read_edge_metadata()
660 else: 660 else:
661 raise Exception('Unknown build type {}' % self.config.type) 661 raise Exception('Unknown build type {}' % self.config.type)
662 662
663 # create development build 663 # create development build
664 self.build() 664 self.build()
665 665
666 # write out changelog 666 # write out changelog
667 self.writeChangelog(self.getChanges()) 667 self.writeChangelog(self.getChanges())
668 668
669 # write update manifest 669 # write update manifest
670 self.writeUpdateManifest() 670 self.writeUpdateManifest()
671 671
672 # retire old builds 672 # retire old builds
673 versions = self.retireBuilds() 673 versions = self.retireBuilds()
674 674
675 if self.config.type == 'ie': 675 if self.config.type == 'ie':
676 self.writeIEUpdateManifest(versions) 676 self.writeIEUpdateManifest(versions)
677 677
678 # update index page 678 # update index page
679 self.updateIndex(versions) 679 self.updateIndex(versions)
680 680
681 # update nightlies config 681 # update nightlies config
682 self.config.latestRevision = self.revision 682 self.config.latestRevision = self.revision
683 683
684 if (self.config.type == 'gecko' and 684 if (self.config.type in {'gecko', 'gecko-webext'} and
685 self.config.galleryID and 685 self.config.galleryID and
686 get_config().has_option('extensions', 'amo_key')): 686 get_config().has_option('extensions', 'amo_key')):
687 self.uploadToMozillaAddons() 687 self.uploadToMozillaAddons()
688 elif self.config.type == 'chrome' and self.config.clientID and self. config.clientSecret and self.config.refreshToken: 688 elif self.config.type == 'chrome' and self.config.clientID and self. config.clientSecret and self.config.refreshToken:
689 self.uploadToChromeWebStore() 689 self.uploadToChromeWebStore()
690 elif self.config.type == 'edge' and self.config.clientID and self.co nfig.clientSecret and self.config.refreshToken and self.config.tenantID: 690 elif self.config.type == 'edge' and self.config.clientID and self.co nfig.clientSecret and self.config.refreshToken and self.config.tenantID:
691 self.upload_to_windows_store() 691 self.upload_to_windows_store()
692 692
693 finally: 693 finally:
694 # clean up 694 # clean up
(...skipping 22 matching lines...) Expand all
717 except Exception as ex: 717 except Exception as ex:
718 logging.error('The build for %s failed:', repo) 718 logging.error('The build for %s failed:', repo)
719 logging.exception(ex) 719 logging.exception(ex)
720 720
721 file = open(nightlyConfigFile, 'wb') 721 file = open(nightlyConfigFile, 'wb')
722 nightlyConfig.write(file) 722 nightlyConfig.write(file)
723 723
724 724
725 if __name__ == '__main__': 725 if __name__ == '__main__':
726 main() 726 main()
LEFTRIGHT

Powered by Google App Engine
This is Rietveld