Index: sitescripts/extensions/utils.py |
=================================================================== |
--- a/sitescripts/extensions/utils.py |
+++ b/sitescripts/extensions/utils.py |
@@ -18,9 +18,12 @@ |
import re |
import os |
import subprocess |
+import urlparse |
from ConfigParser import SafeConfigParser, NoOptionError |
from StringIO import StringIO |
from sitescripts.utils import get_config |
+from sitescripts.extensions.android import get_min_sdk_version |
+from buildtools.packagerGecko import KNOWN_APPS |
def compareVersionParts(part1, part2): |
def convertInt(value, default): |
@@ -256,3 +259,108 @@ |
return m.group(1) |
finally: |
bio.close() |
+ |
+def _getLocalLink(repo): |
Felix Dahlke
2014/07/22 08:11:11
These functions have just been moved. The only cha
|
+ """ |
+ gets the link for the newest download of an add-on in the local downloads |
+ repository |
+ """ |
+ highestURL = None |
+ highestVersion = None |
+ |
+ for filename, version in repo.getDownloads(): |
+ if not highestVersion or compareVersions(version, highestVersion) > 0: |
+ highestURL = urlparse.urljoin(repo.downloadsURL, filename) |
+ highestVersion = version |
+ |
+ return (highestURL, highestVersion) |
+ |
+def _getDownloadLink(repo): |
+ """ |
+ gets the download link to the most current version of an extension |
+ """ |
+ # you can't easily install extensions from third-party sources on Chrome |
+ # and Opera. So always get the link for the version on the Web Store. |
+ if repo.galleryID: |
+ if repo.type == "chrome": |
+ return getGoogleDownloadLink(repo.galleryID) |
+ if repo.type == "opera": |
+ return getOperaDownloadLink(repo.galleryID) |
+ |
+ (localURL, localVersion) = _getLocalLink(repo) |
+ |
+ # get a link to Firefox Add-Ons, if the latest version has been published there |
+ if repo.type == 'gecko' and repo.galleryID: |
+ (galleryURL, galleryVersion) = getMozillaDownloadLink(repo.galleryID) |
+ if not localVersion or (galleryVersion and |
+ compareVersions(galleryVersion, localVersion) >= 0): |
+ return (galleryURL, galleryVersion) |
+ |
+ return (localURL, localVersion) |
+ |
+def _getQRCode(text): |
+ try: |
+ import qrcode |
+ import base64 |
+ import Image # required by qrcode but not formally a dependency |
+ except: |
+ return None |
+ |
+ data = StringIO() |
+ qrcode.make(text, box_size=5).save(data, 'png') |
+ return 'data:image/png;base64,' + base64.b64encode(data.getvalue()) |
+ |
+def getDownloadLinks(result): |
+ """ |
+ gets the download links for all extensions and puts them into the config |
+ object |
+ """ |
+ for repo in Configuration.getRepositoryConfigurations(): |
+ (downloadURL, version) = _getDownloadLink(repo) |
+ if downloadURL == None: |
+ continue |
+ if not result.has_section(repo.repositoryName): |
+ result.add_section(repo.repositoryName) |
+ result.set(repo.repositoryName, "downloadURL", downloadURL) |
+ result.set(repo.repositoryName, "version", version) |
+ |
+ qrcode = _getQRCode(downloadURL) |
+ if qrcode != None: |
+ result.set(repo.repositoryName, "qrcode", qrcode) |
+ |
+def readMetadata(repo, version): |
+ """ |
+ reads extension ID and compatibility information from metadata file in the |
+ extension's repository |
+ """ |
+ if repo.type == 'android': |
+ command = ['hg', '-R', repo.repository, 'id', '-r', version, '-n'] |
+ result = subprocess.check_output(command) |
+ revision = re.sub(r'\D', '', result) |
+ |
+ return { |
+ 'revision': revision, |
+ 'minSdkVersion': get_min_sdk_version(repo, version), |
+ } |
+ elif repo.type == 'safari': |
+ metadata = repo.readMetadata(version) |
+ return { |
+ 'certificateID': getSafariCertificateID(repo.keyFile), |
+ 'version': version, |
+ 'shortVersion': version, |
+ 'basename': metadata.get('general', 'basename'), |
+ } |
+ elif repo.type == 'gecko': |
+ metadata = repo.readMetadata(version) |
+ result = { |
+ 'extensionID': metadata.get('general', 'id'), |
+ 'version': version, |
+ 'compat': [] |
+ } |
+ for key, value in KNOWN_APPS.iteritems(): |
+ if metadata.has_option('compat', key): |
+ minVersion, maxVersion = metadata.get('compat', key).split('/') |
+ result['compat'].append({'id': value, 'minVersion': minVersion, 'maxVersion': maxVersion}) |
+ return result |
+ else: |
+ raise Exception('unknown repository type %r' % repo.type) |