def uploadTranslations(baseDir, scriptName, opts, args, type): if len(args) < 1: print 'Project key is required to upload existing translations.' usage(scriptName, type, 'uploadtrans') return key = args[0] if type == 'chrome' or type == 'opera': import buildtools.packagerChrome as packager localesDir = os.path.join(baseDir, '_locales') locales = os.listdir(localesDir) locales = map(lambda locale: (locale.replace('_', '-'), os.path.join(localesDir, locale)), locales) metadata = packager.readMetadata(baseDir, type) basename = metadata.get('general', 'basename') else: import buildtools.packagerGecko as packager localesDir = packager.getLocalesDir(baseDir) locales = packager.getLocales(baseDir, True) locales = map(lambda locale: (locale, os.path.join(localesDir, locale)), locales) metadata = packager.readMetadata(baseDir, type) basename = metadata.get('general', 'basename') import buildtools.localeTools as localeTools for locale, localeDir in locales: if locale != packager.defaultLocale: localeTools.uploadTranslations(type, metadata, localeDir, locale, basename, key)
def readChromeMetadata(self): """ Read Chrome-specific metadata from metadata file. This will also calculate extension ID from the private key. """ # Calculate extension ID from public key # (see http://supercollider.dk/2010/01/calculating-chrome-extension-id-from-your-private-key-233) import buildtools.packagerChrome as packager publicKey = packager.getPublicKey(self.config.keyFile) hash = hashlib.sha256() hash.update(publicKey) self.extensionID = hash.hexdigest()[0:32] self.extensionID = ''.join( map(lambda c: chr(97 + int(c, 16)), self.extensionID)) # Now read metadata file metadata = packager.readMetadata(self.tempdir, self.config.type) self.version = packager.getBuildVersion(self.tempdir, metadata, False, self.revision) self.basename = metadata.get("general", "basename") self.compat = [] if metadata.has_section('compat') and metadata.has_option( 'compat', 'chrome'): self.compat.append({ 'id': 'chrome', 'minVersion': metadata.get('compat', 'chrome') })
def readChromeMetadata(self): """ Read Chrome-specific metadata from metadata file. This will also calculate extension ID from the private key. """ # Calculate extension ID from public key # (see http://supercollider.dk/2010/01/calculating-chrome-extension-id-from-your-private-key-233) import buildtools.packagerChrome as packager publicKey = packager.getPublicKey(self.config.keyFile) hash = hashlib.sha256() hash.update(publicKey) self.extensionID = hash.hexdigest()[0:32] self.extensionID = ''.join(map(lambda c: chr(97 + int(c, 16)), self.extensionID)) # Now read metadata file metadata = packager.readMetadata(self.tempdir, self.config.type) self.version = packager.getBuildVersion(self.tempdir, metadata, False, self.revision) self.basename = metadata.get("general", "basename") if self.config.experimental: self.basename += '-experimental' self.compat = [] if metadata.has_section('compat') and metadata.has_option('compat', 'chrome'): self.compat.append({'id': 'chrome', 'minVersion': metadata.get('compat', 'chrome')})
def readSafariMetadata(self): # get the certificate ID from the developer certificate's common name import M2Crypto bio = M2Crypto.BIO.openfile(self.config.keyFile) try: while not hasattr(self, 'certificateID'): try: cert = M2Crypto.X509.load_cert_bio(bio) except M2Crypto.X509.X509Error: raise Exception('No safari developer certificate found in chain') subject = cert.get_subject() for entry in subject.get_entries_by_nid(subject.nid['CN']): m = re.match(r'Safari Developer: \((.*?)\)', entry.get_data().as_text()) if m: self.certificateID = m.group(1) break finally: bio.close() # read metadata file import buildtools.packagerSafari as packager metadata = packager.readMetadata(self.tempdir, self.config.type) self.version = packager.getBuildVersion(self.tempdir, metadata, False, self.revision) self.shortVersion = metadata.get("general", "version") self.basename = metadata.get("general", "basename")
def readSafariMetadata(self): import buildtools.packagerSafari as packager metadata = packager.readMetadata(self.tempdir, self.config.type) self.certificateID = getSafariCertificateID(self.config.keyFile) self.version = packager.getBuildVersion(self.tempdir, metadata, False, self.revision) self.shortVersion = metadata.get("general", "version") self.basename = metadata.get("general", "basename")
def readSafariMetadata(self): import buildtools.packagerSafari as packager metadata = packager.readMetadata(self.tempdir, self.config.type) certs = packager.get_certificates_and_key(self.config.keyFile)[0] self.certificateID = packager.get_developer_identifier(certs) self.version = packager.getBuildVersion(self.tempdir, metadata, False, self.revision) self.shortVersion = metadata.get("general", "version") self.basename = metadata.get("general", "basename") self.updatedFromGallery = False
def setupTranslations(baseDir, scriptName, opts, args, type): if len(args) < 1: print 'Project key is required to update translation master files.' usage(scriptName, type, 'setuptrans') return key = args[0] if type == 'chrome' or type == 'opera': import buildtools.packagerChrome as packager locales = os.listdir(os.path.join(baseDir, '_locales')) locales = map(lambda locale: locale.replace('_', '-'), locales) basename = packager.readMetadata(baseDir, type).get('general', 'basename') else: import buildtools.packagerGecko as packager locales = packager.getLocales(baseDir, True) basename = packager.readMetadata(baseDir, type).get('general', 'basename') import buildtools.localeTools as localeTools localeTools.setupTranslations(type, locales, basename, key)
def readSafariMetadata(self): import buildtools.packagerSafari as packager from buildtools import xarfile metadata = packager.readMetadata(self.tempdir, self.config.type) certs = xarfile.read_certificates_and_key(self.config.keyFile)[0] self.certificateID = packager.get_developer_identifier(certs) self.version = packager.getBuildVersion(self.tempdir, metadata, False, self.buildNum) self.shortVersion = metadata.get('general', 'version') self.basename = metadata.get('general', 'basename') self.updatedFromGallery = False
def updateTranslationMaster(baseDir, scriptName, opts, args, type): if len(args) < 1: print 'Project key is required to update translation master files.' usage(scriptName, type, 'translate') return key = args[0] if type == 'chrome' or type == 'opera': import buildtools.packagerChrome as packager defaultLocaleDir = os.path.join(baseDir, '_locales', packager.defaultLocale) metadata = packager.readMetadata(baseDir, type) basename = metadata.get('general', 'basename') else: import buildtools.packagerGecko as packager defaultLocaleDir = os.path.join(packager.getLocalesDir(baseDir), packager.defaultLocale) metadata = packager.readMetadata(baseDir, type) basename = metadata.get('general', 'basename') import buildtools.localeTools as localeTools localeTools.updateTranslationMaster(type, metadata, defaultLocaleDir, basename, key)
def read_edge_metadata(self): """ Read Edge-specific metadata from metadata file. """ from buildtools import packager # Now read metadata file metadata = packager.readMetadata(self.tempdir, self.config.type) self.version = packager.getBuildVersion(self.tempdir, metadata, False, self.buildNum) self.basename = metadata.get('general', 'basename') self.compat = []
def readGeckoMetadata(self): """ read Gecko-specific metadata file from a cloned repository and parse id, version, basename and the compat section out of the file """ import buildtools.packagerGecko as packager metadata = packager.readMetadata(self.tempdir, self.config.type) self.extensionID = metadata.get('general', 'id') self.version = packager.getBuildVersion(self.tempdir, metadata, False, self.buildNum) self.basename = metadata.get('general', 'basename')
def run(baseDir, version, keyFile, downloadsRepo): # Replace version number in metadata file "manually", ConfigParser will mess # up the order of lines. handle = open(packager.getMetadataPath(baseDir), 'rb') rawMetadata = handle.read() handle.close() versionRegExp = re.compile(r'^(\s*version\s*=\s*).*', re.I | re.M) rawMetadata = re.sub(versionRegExp, r'\g<1>%s' % version, rawMetadata) handle = open(packager.getMetadataPath(baseDir), 'wb') handle.write(rawMetadata) handle.close() # Read extension name and branch name locales = packager.readLocaleMetadata(baseDir, [packager.defaultLocale]) extensionName = locales[packager.defaultLocale]['name'] metadata = packager.readMetadata(baseDir) # Now commit the change and tag it subprocess.Popen(['hg', 'commit', '-R', baseDir, '-m', 'Releasing %s %s' % (extensionName, version)]).communicate() subprocess.Popen(['hg', 'tag', '-R', baseDir, '-f', version]).communicate() # Create a release build buildPath = os.path.join(downloadsRepo, packager.getDefaultFileName(baseDir, metadata, version)) packager.createBuild(baseDir, outFile=buildPath, releaseBuild=True, keyFile=keyFile) # Create source archive archivePath = os.path.splitext(buildPath)[0] + '-source.tgz' archiveHandle = open(archivePath, 'wb') archive = tarfile.open(fileobj=archiveHandle, name=os.path.basename(archivePath), mode='w:gz') (data, dummy) = subprocess.Popen(['hg', 'archive', '-R', baseDir, '-t', 'tar', '-S', '-'], stdout=subprocess.PIPE).communicate() repoArchive = tarfile.open(fileobj=StringIO(data), mode='r:') for fileInfo in repoArchive: if os.path.basename(fileInfo.name) in ('.hgtags', '.hgignore'): continue fileData = repoArchive.extractfile(fileInfo) fileInfo.name = re.sub(r'^[^/]+/', '', fileInfo.name) archive.addfile(fileInfo, fileData) repoArchive.close() archive.close() archiveHandle.close() # Now add the downloads and commit subprocess.Popen(['hg', 'add', '-R', downloadsRepo, buildPath, archivePath]).communicate() subprocess.Popen(['hg', 'commit', '-R', downloadsRepo, '-m', 'Releasing %s %s' % (extensionName, version)]).communicate() # Push all changes subprocess.Popen(['hg', 'push', '-R', baseDir]).communicate() subprocess.Popen(['hg', 'push', '-R', downloadsRepo]).communicate()
def readGeckoMetadata(self): """ read Gecko-specific metadata file from a cloned repository and parse id, version, basename and the compat section out of the file """ import buildtools.packagerGecko as packager metadata = packager.readMetadata(self.tempdir, self.config.type) self.extensionID = metadata.get("general", "id") self.version = packager.getBuildVersion(self.tempdir, metadata, False, self.revision) self.basename = metadata.get("general", "basename") self.compat = [] for key, value in packager.KNOWN_APPS.iteritems(): if metadata.has_option('compat', key): minVersion, maxVersion = metadata.get('compat', key).split('/') self.compat.append({'id': value, 'minVersion': minVersion, 'maxVersion': maxVersion})
def getTranslations(baseDir, scriptName, opts, args, type): if len(args) < 1: print 'Project key is required to update translation master files.' usage(scriptName, type, 'translate') return key = args[0] if type == 'chrome' or type == 'opera': import buildtools.packagerChrome as packager localesDir = os.path.join(baseDir, '_locales') else: import buildtools.packagerGecko as packager localesDir = packager.getLocalesDir(baseDir) import buildtools.localeTools as localeTools basename = packager.readMetadata(baseDir, type).get('general', 'basename') localeTools.getTranslations(type, localesDir, packager.defaultLocale.replace('_', '-'), basename, key)
def readGeckoMetadata(self): """ read Gecko-specific metadata file from a cloned repository and parse id, version, basename and the compat section out of the file """ import buildtools.packagerGecko as packager metadata = packager.readMetadata(self.tempdir, self.config.type) self.extensionID = metadata.get("general", "id") self.version = packager.getBuildVersion(self.tempdir, metadata, False, self.revision) self.basename = metadata.get("general", "basename") self.compat = [] for key, value in packager.KNOWN_APPS.iteritems(): if metadata.has_option('compat', key): minVersion, maxVersion = metadata.get('compat', key).split('/') self.compat.append({ 'id': value, 'minVersion': minVersion, 'maxVersion': maxVersion })
def run(baseDir, type, version, keyFiles, downloadsRepo): if type == "gecko": import buildtools.packagerGecko as packager elif type == "chrome": import buildtools.packagerChrome as packager # Replace version number in metadata file "manually", ConfigParser will mess # up the order of lines. metadata = packager.readMetadata(baseDir, type) with open(metadata.option_source("general", "version"), 'r+b') as file: rawMetadata = file.read() rawMetadata = re.sub( r'^(\s*version\s*=\s*).*', r'\g<1>%s' % version, rawMetadata, flags=re.I | re.M ) file.seek(0) file.write(rawMetadata) file.truncate() # Read extension name from locale data import buildtools.packagerGecko as packagerGecko if type == "gecko": locales_base = baseDir else: # This is somewhat of a hack but reading out locale import config here would be too much locales_base = os.path.join(baseDir, "adblockplus") locales = packagerGecko.readLocaleMetadata(locales_base, [packagerGecko.defaultLocale]) extensionName = locales[packagerGecko.defaultLocale]['name'] # Now commit the change and tag it subprocess.check_call(['hg', 'commit', '-R', baseDir, '-m', 'Releasing %s %s' % (extensionName, version)]) subprocess.check_call(['hg', 'tag', '-R', baseDir, '-f', version]) # Create a release build downloads = [] if type == "gecko": keyFile = keyFiles[0] if keyFiles else None metadata = packager.readMetadata(baseDir, type) buildPath = os.path.join(downloadsRepo, packager.getDefaultFileName(metadata, version, 'xpi')) packager.createBuild(baseDir, type=type, outFile=buildPath, releaseBuild=True, keyFile=keyFile) downloads.append(buildPath) elif type == "chrome": # We actually have to create three different builds: signed and unsigned # Chrome builds (the latter for Chrome Web Store), and a signed Safari build. metadata = packager.readMetadata(baseDir, type) buildPath = os.path.join(downloadsRepo, packager.getDefaultFileName(metadata, version, 'crx')) packager.createBuild(baseDir, type=type, outFile=buildPath, releaseBuild=True, keyFile=keyFiles[0]) downloads.append(buildPath) buildPathUnsigned = os.path.join(baseDir, packager.getDefaultFileName(metadata, version, 'zip')) packager.createBuild(baseDir, type=type, outFile=buildPathUnsigned, releaseBuild=True, keyFile=None) import buildtools.packagerSafari as packagerSafari metadataSafari = packagerSafari.readMetadata(baseDir, "safari") buildPathSafari = os.path.join(downloadsRepo, packagerSafari.getDefaultFileName(metadataSafari, version, 'safariextz')) packagerSafari.createBuild(baseDir, type="safari", outFile=buildPathSafari, releaseBuild=True, keyFile=keyFiles[1]) downloads.append(buildPathSafari) # Create source archive archivePath = os.path.splitext(buildPath)[0] + '-source.tgz' create_sourcearchive(baseDir, archivePath) downloads.append(archivePath) # Now add the downloads and commit subprocess.check_call(['hg', 'add', '-R', downloadsRepo] + downloads) subprocess.check_call(['hg', 'commit', '-R', downloadsRepo, '-m', 'Releasing %s %s' % (extensionName, version)]) # Push all changes subprocess.check_call(['hg', 'push', '-R', baseDir]) subprocess.check_call(['hg', 'push', '-R', downloadsRepo])
def run(baseDir, type, version, keyFile, downloadsRepo): if type == "gecko": import buildtools.packagerGecko as packager elif type == "chrome": import buildtools.packagerChrome as packager # Replace version number in metadata file "manually", ConfigParser will mess # up the order of lines. handle = open(packager.getMetadataPath(baseDir, type), 'rb') rawMetadata = handle.read() handle.close() versionRegExp = re.compile(r'^(\s*version\s*=\s*).*', re.I | re.M) rawMetadata = re.sub(versionRegExp, r'\g<1>%s' % version, rawMetadata) handle = open(packager.getMetadataPath(baseDir, type), 'wb') handle.write(rawMetadata) handle.close() # Read extension name from locale data import buildtools.packagerGecko as packagerGecko if type == "gecko": locales_base = baseDir else: # This is somewhat of a hack but reading out locale import config here would be too much locales_base = os.path.join(baseDir, "adblockplus") locales = packagerGecko.readLocaleMetadata(locales_base, [packagerGecko.defaultLocale]) extensionName = locales[packagerGecko.defaultLocale]['name'] # Now commit the change and tag it subprocess.check_call([ 'hg', 'commit', '-R', baseDir, '-m', 'Releasing %s %s' % (extensionName, version) ]) subprocess.check_call(['hg', 'tag', '-R', baseDir, '-f', version]) # Create a release build downloads = [] if type == "gecko": metadata = packager.readMetadata(baseDir, type) buildPath = os.path.join( downloadsRepo, packager.getDefaultFileName(baseDir, metadata, version, 'xpi')) packager.createBuild(baseDir, type=type, outFile=buildPath, releaseBuild=True, keyFile=keyFile) downloads.append(buildPath) elif type == "chrome": # We actually have to create three different builds for Chrome: signed a unsigned Chrome builds # (the latter for Chrome Web Store) and a signed Opera build. metadata = packager.readMetadata(baseDir, type) buildPath = os.path.join( downloadsRepo, packager.getDefaultFileName(baseDir, metadata, version, 'crx')) packager.createBuild(baseDir, type=type, outFile=buildPath, releaseBuild=True, keyFile=keyFile) downloads.append(buildPath) buildPathUnsigned = os.path.join( baseDir, packager.getDefaultFileName(baseDir, metadata, version, 'zip')) packager.createBuild(baseDir, type=type, outFile=buildPathUnsigned, releaseBuild=True, keyFile=None) metadataOpera = packager.readMetadata(baseDir, "opera") buildPathOpera = os.path.join( downloadsRepo, packager.getDefaultFileName(baseDir, metadataOpera, version, 'crx')) packager.createBuild(baseDir, type="opera", outFile=buildPathOpera, releaseBuild=True, keyFile=keyFile) downloads.append(buildPathOpera) # Create source archive archivePath = os.path.splitext(buildPath)[0] + '-source.tgz' archiveHandle = open(archivePath, 'wb') archive = tarfile.open(fileobj=archiveHandle, name=os.path.basename(archivePath), mode='w:gz') data = subprocess.check_output( ['hg', 'archive', '-R', baseDir, '-t', 'tar', '-S', '-']) repoArchive = tarfile.open(fileobj=StringIO(data), mode='r:') for fileInfo in repoArchive: if os.path.basename(fileInfo.name) in ('.hgtags', '.hgignore'): continue fileData = repoArchive.extractfile(fileInfo) fileInfo.name = re.sub(r'^[^/]+/', '', fileInfo.name) archive.addfile(fileInfo, fileData) repoArchive.close() archive.close() archiveHandle.close() downloads.append(archivePath) # Now add the downloads and commit subprocess.check_call(['hg', 'add', '-R', downloadsRepo] + downloads) subprocess.check_call([ 'hg', 'commit', '-R', downloadsRepo, '-m', 'Releasing %s %s' % (extensionName, version) ]) # Push all changes subprocess.check_call(['hg', 'push', '-R', baseDir]) subprocess.check_call(['hg', 'push', '-R', downloadsRepo])
def run(baseDir, type, version, keyFile, downloadsRepo): if type == "gecko": import buildtools.packagerGecko as packager elif type == "chrome": import buildtools.packagerChrome as packager # Replace version number in metadata file "manually", ConfigParser will mess # up the order of lines. metadata = packager.readMetadata(baseDir, type) with open(metadata.option_source("general", "version"), 'r+b') as file: rawMetadata = file.read() rawMetadata = re.sub( r'^(\s*version\s*=\s*).*', r'\g<1>%s' % version, rawMetadata, flags=re.I | re.M ) file.seek(0) file.write(rawMetadata) file.truncate() # Read extension name from locale data import buildtools.packagerGecko as packagerGecko if type == "gecko": locales_base = baseDir else: # This is somewhat of a hack but reading out locale import config here would be too much locales_base = os.path.join(baseDir, "adblockplus") locales = packagerGecko.readLocaleMetadata(locales_base, [packagerGecko.defaultLocale]) extensionName = locales[packagerGecko.defaultLocale]['name'] # Now commit the change and tag it subprocess.check_call(['hg', 'commit', '-R', baseDir, '-m', 'Releasing %s %s' % (extensionName, version)]) subprocess.check_call(['hg', 'tag', '-R', baseDir, '-f', version]) # Create a release build downloads = [] if type == "gecko": metadata = packager.readMetadata(baseDir, type) buildPath = os.path.join(downloadsRepo, packager.getDefaultFileName(baseDir, metadata, version, 'xpi')) packager.createBuild(baseDir, type=type, outFile=buildPath, releaseBuild=True, keyFile=keyFile) downloads.append(buildPath) elif type == "chrome": # We actually have to create three different builds for Chrome: signed a unsigned Chrome builds # (the latter for Chrome Web Store) and a signed Opera build. metadata = packager.readMetadata(baseDir, type) buildPath = os.path.join(downloadsRepo, packager.getDefaultFileName(baseDir, metadata, version, 'crx')) packager.createBuild(baseDir, type=type, outFile=buildPath, releaseBuild=True, keyFile=keyFile) downloads.append(buildPath) buildPathUnsigned = os.path.join(baseDir, packager.getDefaultFileName(baseDir, metadata, version, 'zip')) packager.createBuild(baseDir, type=type, outFile=buildPathUnsigned, releaseBuild=True, keyFile=None) metadataOpera = packager.readMetadata(baseDir, "opera") buildPathOpera = os.path.join(downloadsRepo, packager.getDefaultFileName(baseDir, metadataOpera, version, 'crx')) packager.createBuild(baseDir, type="opera", outFile=buildPathOpera, releaseBuild=True, keyFile=keyFile) downloads.append(buildPathOpera) # Create source archive archivePath = os.path.splitext(buildPath)[0] + '-source.tgz' archiveHandle = open(archivePath, 'wb') archive = tarfile.open(fileobj=archiveHandle, name=os.path.basename(archivePath), mode='w:gz') data = subprocess.check_output(['hg', 'archive', '-R', baseDir, '-t', 'tar', '-S', '-']) repoArchive = tarfile.open(fileobj=StringIO(data), mode='r:') for fileInfo in repoArchive: if os.path.basename(fileInfo.name) in ('.hgtags', '.hgignore'): continue fileData = repoArchive.extractfile(fileInfo) fileInfo.name = re.sub(r'^[^/]+/', '', fileInfo.name) archive.addfile(fileInfo, fileData) repoArchive.close() archive.close() archiveHandle.close() downloads.append(archivePath) # Now add the downloads and commit subprocess.check_call(['hg', 'add', '-R', downloadsRepo] + downloads) subprocess.check_call(['hg', 'commit', '-R', downloadsRepo, '-m', 'Releasing %s %s' % (extensionName, version)]) # Push all changes subprocess.check_call(['hg', 'push', '-R', baseDir]) subprocess.check_call(['hg', 'push', '-R', downloadsRepo])
def run(baseDir, type, version, keyFiles, downloadsRepo): if type == "gecko": import buildtools.packagerGecko as packager elif type == "chrome": import buildtools.packagerChrome as packager # Replace version number in metadata file "manually", ConfigParser will mess # up the order of lines. metadata = packager.readMetadata(baseDir, type) with open(metadata.option_source("general", "version"), 'r+b') as file: rawMetadata = file.read() rawMetadata = re.sub( r'^(\s*version\s*=\s*).*', r'\g<1>%s' % version, rawMetadata, flags=re.I | re.M ) file.seek(0) file.write(rawMetadata) file.truncate() # Read extension name from locale data import buildtools.packagerGecko as packagerGecko if type == "gecko": locales_base = baseDir else: # This is somewhat of a hack but reading out locale import config here would be too much locales_base = os.path.join(baseDir, "adblockcash") locales = packagerGecko.readLocaleMetadata(locales_base, [packagerGecko.defaultLocale]) extensionName = locales[packagerGecko.defaultLocale]['name'] # Now commit the change and tag it subprocess.check_call(['hg', 'commit', '-R', baseDir, '-m', 'Releasing %s %s' % (extensionName, version)]) subprocess.check_call(['hg', 'tag', '-R', baseDir, '-f', version]) # Create a release build downloads = [] if type == "gecko": keyFile = keyFiles[0] if keyFiles else None metadata = packager.readMetadata(baseDir, type) buildPath = os.path.join(downloadsRepo, packager.getDefaultFileName(baseDir, metadata, version, 'xpi')) packager.createBuild(baseDir, type=type, outFile=buildPath, releaseBuild=True, keyFile=keyFile) downloads.append(buildPath) elif type == "chrome": # We actually have to create four different builds for Chrome: signed a unsigned Chrome builds # (the latter for Chrome Web Store), a signed Opera build and a signed Safari build. metadata = packager.readMetadata(baseDir, type) buildPath = os.path.join(downloadsRepo, packager.getDefaultFileName(baseDir, metadata, version, 'crx')) packager.createBuild(baseDir, type=type, outFile=buildPath, releaseBuild=True, keyFile=keyFiles[0]) downloads.append(buildPath) buildPathUnsigned = os.path.join(baseDir, packager.getDefaultFileName(baseDir, metadata, version, 'zip')) packager.createBuild(baseDir, type=type, outFile=buildPathUnsigned, releaseBuild=True, keyFile=None) metadataOpera = packager.readMetadata(baseDir, "opera") buildPathOpera = os.path.join(downloadsRepo, packager.getDefaultFileName(baseDir, metadataOpera, version, 'crx')) packager.createBuild(baseDir, type="opera", outFile=buildPathOpera, releaseBuild=True, keyFile=keyFiles[0]) downloads.append(buildPathOpera) import buildtools.packagerSafari as packagerSafari metadataSafari = packagerSafari.readMetadata(baseDir, "safari") buildPathSafari = os.path.join(downloadsRepo, packagerSafari.getDefaultFileName(baseDir, metadataSafari, version, 'safariextz')) packagerSafari.createBuild(baseDir, type="safari", outFile=buildPathSafari, releaseBuild=True, keyFile=keyFiles[1]) downloads.append(buildPathSafari) # Create source archive archivePath = os.path.splitext(buildPath)[0] + '-source.tgz' create_sourcearchive(baseDir, archivePath) downloads.append(archivePath) # Now add the downloads and commit subprocess.check_call(['hg', 'add', '-R', downloadsRepo] + downloads) subprocess.check_call(['hg', 'commit', '-R', downloadsRepo, '-m', 'Releasing %s %s' % (extensionName, version)]) # Push all changes subprocess.check_call(['hg', 'push', '-R', baseDir]) subprocess.check_call(['hg', 'push', '-R', downloadsRepo])
def run(baseDir, version, keyFile, downloadsRepo): # Replace version number in metadata file "manually", ConfigParser will mess # up the order of lines. handle = open(packager.getMetadataPath(baseDir), 'rb') rawMetadata = handle.read() handle.close() versionRegExp = re.compile(r'^(\s*version\s*=\s*).*', re.I | re.M) rawMetadata = re.sub(versionRegExp, r'\g<1>%s' % version, rawMetadata) handle = open(packager.getMetadataPath(baseDir), 'wb') handle.write(rawMetadata) handle.close() # Read extension name and branch name locales = packager.readLocaleMetadata(baseDir, [packager.defaultLocale]) extensionName = locales[packager.defaultLocale]['name'] metadata = packager.readMetadata(baseDir) # Now commit the change and tag it subprocess.Popen([ 'hg', 'commit', '-R', baseDir, '-m', 'Releasing %s %s' % (extensionName, version) ]).communicate() subprocess.Popen(['hg', 'tag', '-R', baseDir, '-f', version]).communicate() # Create a release build buildPath = os.path.join( downloadsRepo, packager.getDefaultFileName(baseDir, metadata, version)) packager.createBuild(baseDir, outFile=buildPath, releaseBuild=True, keyFile=keyFile) # Create source archive archivePath = os.path.splitext(buildPath)[0] + '-source.tgz' archiveHandle = open(archivePath, 'wb') archive = tarfile.open(fileobj=archiveHandle, name=os.path.basename(archivePath), mode='w:gz') (data, dummy) = subprocess.Popen( ['hg', 'archive', '-R', baseDir, '-t', 'tar', '-S', '-'], stdout=subprocess.PIPE).communicate() repoArchive = tarfile.open(fileobj=StringIO(data), mode='r:') for fileInfo in repoArchive: if os.path.basename(fileInfo.name) in ('.hgtags', '.hgignore'): continue fileData = repoArchive.extractfile(fileInfo) fileInfo.name = re.sub(r'^[^/]+/', '', fileInfo.name) archive.addfile(fileInfo, fileData) repoArchive.close() archive.close() archiveHandle.close() # Now add the downloads and commit subprocess.Popen( ['hg', 'add', '-R', downloadsRepo, buildPath, archivePath]).communicate() subprocess.Popen([ 'hg', 'commit', '-R', downloadsRepo, '-m', 'Releasing %s %s' % (extensionName, version) ]).communicate() # Push all changes subprocess.Popen(['hg', 'push', '-R', baseDir]).communicate() subprocess.Popen(['hg', 'push', '-R', downloadsRepo]).communicate()