| Index: sitescripts/extensions/utils.py |
| =================================================================== |
| --- a/sitescripts/extensions/utils.py |
| +++ b/sitescripts/extensions/utils.py |
| @@ -16,7 +16,10 @@ |
| # along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>. |
| import re |
| -from ConfigParser import NoOptionError |
| +import os |
| +import subprocess |
| +from ConfigParser import SafeConfigParser, NoOptionError |
| +from StringIO import StringIO |
| from sitescripts.utils import get_config |
| def compareVersionParts(part1, part2): |
| @@ -89,26 +92,19 @@ |
| changed (latestRevision), others come from the global config and are |
| read-only (repository, repositoryName, nightliesDirectory). |
| """ |
| + def _defineProperty(name, local=False, type='', default=None): |
| + def getter(self): |
| + method = getattr(self.config, 'get' + type) |
| + key = '%s_%s' % (self.repositoryName, name) if local else name |
| - def _defineGlobalProperty(key): |
| - """ |
| - Creates a property corresponding with a key in the config file |
| - """ |
| - return property(lambda self: self.config.get('extensions', key)) |
| + try: |
| + return method('extensions', key) |
| + except NoOptionError: |
| + if default is None: |
| + raise |
| + return default |
| - def _defineLocalProperty(key, default = None): |
| - """ |
| - Creates a property corresponding with a repository-specific key in the config file |
| - """ |
| - def getLocalProperty(self): |
| - try: |
| - return self.config.get('extensions', self.repositoryName + '_' + key) |
| - except NoOptionError, e: |
| - if default != None: |
| - return default |
| - else: |
| - raise e |
| - return property(getLocalProperty) |
| + return property(getter) |
| def _defineNightlyProperty(key): |
| """ |
| @@ -122,26 +118,30 @@ |
| repositoryName = None |
| repository = None |
| - buildRepository = _defineGlobalProperty('buildRepository') |
| - nightliesDirectory = _defineGlobalProperty('nightliesDirectory') |
| - nightliesURL = _defineGlobalProperty('nightliesURL') |
| - downloadsRepo = _defineGlobalProperty('downloadsRepo') |
| - downloadsURL = _defineGlobalProperty('downloadsURL') |
| - docsDirectory = _defineGlobalProperty('docsDirectory') |
| - signtool = _defineGlobalProperty('signtool') |
| - certname = _defineGlobalProperty('signtool_certname') |
| - dbdir = _defineGlobalProperty('signtool_dbdir') |
| - dbpass = _defineGlobalProperty('signtool_dbpass') |
| + buildRepository = _defineProperty('buildRepository') |
| + nightliesDirectory = _defineProperty('nightliesDirectory') |
| + nightliesURL = _defineProperty('nightliesURL') |
| + downloadsRepo = _defineProperty('downloadsRepo') |
| + downloadsURL = _defineProperty('downloadsURL') |
| + docsDirectory = _defineProperty('docsDirectory') |
| + signtool = _defineProperty('signtool') |
| + certname = _defineProperty('signtool_certname') |
| + dbdir = _defineProperty('signtool_dbdir') |
| + dbpass = _defineProperty('signtool_dbpass') |
| + padDirectory = _defineProperty('padDirectory') |
| + padURL = _defineProperty('padURL') |
| + padTemplate = _defineProperty('padTemplate') |
| - keyFile = _defineLocalProperty('key', '') |
| - name = _defineLocalProperty('name') |
| - galleryID = _defineLocalProperty('galleryID', '') |
| - devbuildGalleryID = _defineLocalProperty('devbuildGalleryID', '') |
| - downloadPage = _defineLocalProperty('downloadPage', '') |
| - experimental = _defineLocalProperty('experimental', '') |
| - clientID = _defineLocalProperty('clientID', '') |
| - clientSecret = _defineLocalProperty('clientSecret', '') |
| - refreshToken = _defineLocalProperty('refreshToken', '') |
| + keyFile = _defineProperty('key', local=True, default='') |
| + name = _defineProperty('name', local=True) |
| + galleryID = _defineProperty('galleryID', local=True, default='') |
| + devbuildGalleryID = _defineProperty('devbuildGalleryID', local=True, default='') |
| + downloadPage = _defineProperty('downloadPage', local=True, default='') |
| + experimental = _defineProperty('experimental', local=True, default='') |
| + clientID = _defineProperty('clientID', local=True, default='') |
| + clientSecret = _defineProperty('clientSecret', local=True, default='') |
| + refreshToken = _defineProperty('refreshToken', local=True, default='') |
| + pad = _defineProperty('pad', local=True, type='boolean', default=False) |
| latestRevision = _defineNightlyProperty('latestRevision') |
| @@ -181,6 +181,46 @@ |
| """ |
| return self.repositoryName |
| + def listContents(self, version='tip'): |
| + return subprocess.check_output(['hg', '-R', self.repository, 'locate', '-r', version]).splitlines() |
| + |
| + def readMetadata(self, version='tip'): |
| + genericFilename = 'metadata' |
| + filename = '%s.%s' % (genericFilename, self.type) |
| + files = self.listContents(version) |
| + |
| + if filename not in files: |
| + # some repositories like those for Android and |
| + # Internet Explorer don't have metadata files |
| + if genericFilename not in files: |
| + return None |
| + |
| + # Fall back to platform-independent metadata file |
| + filename = genericFilename |
| + |
| + command = ['hg', '-R', self.repository, 'cat', '-r', version, os.path.join(self.repository, filename)] |
| + result = subprocess.check_output(command) |
| + |
| + parser = SafeConfigParser() |
| + parser.readfp(StringIO(result)) |
| + |
| + return parser |
| + |
| + @property |
| + def basename(self): |
| + metadata = self.readMetadata() |
| + if metadata: |
| + return metadata.get('general', 'basename') |
| + return os.path.basename(self.repository) |
| + |
| + def getDownloads(self): |
| + prefix = self.basename + '-' |
| + command = ['hg', 'locate', '-R', self.downloadsRepo, '-r', 'default'] |
| + |
| + for filename in subprocess.check_output(command).splitlines(): |
| + if filename.startswith(prefix) and filename.endswith(self.packageSuffix): |
| + yield (filename, filename[len(prefix):len(filename) - len(self.packageSuffix)]) |
| + |
| @staticmethod |
| def getRepositoryConfigurations(nightlyConfig = None): |
| """ |