| Index: sitescripts/extensions/bin/updateDownloadLinks.py |
| =================================================================== |
| --- a/sitescripts/extensions/bin/updateDownloadLinks.py |
| +++ b/sitescripts/extensions/bin/updateDownloadLinks.py |
| @@ -18,17 +18,17 @@ |
| """ |
| Update the list of extenstions |
| ============================== |
| This script generates a list of extensions and saves these with download links |
| and version information |
| """ |
| -import os, re, urllib, urllib2, urlparse, subprocess, time |
| +import sys, os, re, urllib, urllib2, urlparse, subprocess, time |
| import xml.dom.minidom as dom |
| from ConfigParser import SafeConfigParser |
| from StringIO import StringIO |
| from sitescripts.utils import get_config, get_template |
| from sitescripts.extensions.utils import compareVersions, Configuration |
| from buildtools.packagerGecko import KNOWN_APPS |
| def urlencode(value): |
| @@ -153,56 +153,73 @@ def getDownloadLinks(result): |
| result.set(repo.repositoryName, "downloadURL", downloadURL) |
| result.set(repo.repositoryName, "version", version) |
| def readMetadata(repo, version): |
| """ |
| reads extension ID and compatibility information from metadata file in the |
| extension's repository |
| """ |
| - command = ['hg', '-R', repo.repository, 'cat', '-r', version, os.path.join(repo.repository, 'metadata.%s' % repo.type)] |
| - (result, dummy) = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE).communicate() |
| + if repo.type == 'android': |
| + command = ['hg', '-R', repo.repository, 'id', '-r', version, '-n'] |
| + (result, dummy) = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE).communicate() |
| + revision = re.sub(r'\D', '', result) |
| - # Fall back to platform-independent metadata file for now |
| - if not result: |
| - command = ['hg', '-R', repo.repository, 'cat', '-r', version, os.path.join(repo.repository, 'metadata')] |
| - (result, dummy) = subprocess.Popen(command, stdout=subprocess.PIPE).communicate() |
| + command = ['hg', '-R', repo.repository, 'cat', '-r', version, os.path.join(repo.repository, 'AndroidManifest.xml')] |
| + (result, dummy) = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE).communicate() |
| + manifest = dom.parseString(result) |
| + usesSdk = manifest.getElementsByTagName('uses-sdk')[0] |
| - parser = SafeConfigParser() |
| - parser.readfp(StringIO(result)) |
| + return { |
| + 'revision': revision, |
| + 'minSdkVersion': usesSdk.attributes["android:minSdkVersion"].value, |
| + } |
| + else: |
| + command = ['hg', '-R', repo.repository, 'cat', '-r', version, os.path.join(repo.repository, 'metadata.%s' % repo.type)] |
| + (result, dummy) = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE).communicate() |
| - result = { |
| - 'extensionID': parser.get('general', 'id'), |
| - 'version': version, |
| - 'compat': [] |
| - } |
| - for key, value in KNOWN_APPS.iteritems(): |
| - if parser.has_option('compat', key): |
| - minVersion, maxVersion = parser.get('compat', key).split('/') |
| - result['compat'].append({'id': value, 'minVersion': minVersion, 'maxVersion': maxVersion}) |
| - return result |
| + # Fall back to platform-independent metadata file for now |
| + if not result: |
| + command = ['hg', '-R', repo.repository, 'cat', '-r', version, os.path.join(repo.repository, 'metadata')] |
| + (result, dummy) = subprocess.Popen(command, stdout=subprocess.PIPE).communicate() |
| + |
| + parser = SafeConfigParser() |
| + parser.readfp(StringIO(result)) |
| + |
| + result = { |
| + 'extensionID': parser.get('general', 'id'), |
| + 'version': version, |
| + 'compat': [] |
| + } |
| + for key, value in KNOWN_APPS.iteritems(): |
| + if parser.has_option('compat', key): |
| + minVersion, maxVersion = parser.get('compat', key).split('/') |
| + result['compat'].append({'id': value, 'minVersion': minVersion, 'maxVersion': maxVersion}) |
| + return result |
| def writeUpdateManifest(links): |
| """ |
| - writes an update.rdf file for all Gecko extensions |
| + writes an update manifest for all Gecko extensions and Android apps |
| """ |
| - extensions = [] |
| + extensions = {'gecko': [], 'android': []} |
| for repo in Configuration.getRepositoryConfigurations(): |
| - if repo.type != 'gecko': |
| - continue |
| - if not links.has_section(repo.repositoryName): |
| + if repo.type not in extensions or not links.has_section(repo.repositoryName): |
| continue |
| data = readMetadata(repo, links.get(repo.repositoryName, 'version')) |
| data['updateURL'] = links.get(repo.repositoryName, 'downloadURL') |
| - extensions.append(data) |
| + extensions[repo.type].append(data) |
| - manifestPath = get_config().get('extensions', 'geckoUpdateManifestPath') |
| - template = get_template(get_config().get('extensions', 'geckoUpdateManifest')) |
| - template.stream({'extensions': extensions}).dump(manifestPath) |
| + if len(extensions['android']) > 1: |
| + print >>sys.stderr, 'Warning: more than one Android app defined, update manifest only works for one' |
| + |
| + for repoType in extensions.iterkeys(): |
| + manifestPath = get_config().get('extensions', '%sUpdateManifestPath' % repoType) |
| + template = get_template(get_config().get('extensions', '%sUpdateManifest' % repoType)) |
| + template.stream({'extensions': extensions[repoType]}).dump(manifestPath) |
| def updateLinks(): |
| """ |
| writes the current extension download links to a file |
| """ |
| # Update downloads directory first |
| downloadsRepository = get_config().get('extensions', 'downloadsDirectory') |