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)
Beispiel #2
0
    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
Beispiel #7
0
    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)
Beispiel #9
0
    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
Beispiel #10
0
    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)
Beispiel #12
0
    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 = []
Beispiel #13
0
 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)
Beispiel #17
0
 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])
Beispiel #20
0
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()