Rietveld Code Review Tool
Help | Bug tracker | Discussion group | Source code

Side by Side Diff: sitescripts/extensions/utils.py

Issue 5723465818570752: Issue 520 - Generate PAD files for download portals when updating download links (Closed)
Patch Set: Addressed comments Created June 4, 2014, 4:35 p.m.
Left:
Right:
Use n/p to move between diff chunks; N/P to move between comments.
Jump to:
View unified diff | Download patch
« no previous file with comments | « sitescripts/extensions/template/pad.xml ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 # coding: utf-8 1 # coding: utf-8
2 2
3 # This file is part of the Adblock Plus web scripts, 3 # This file is part of the Adblock Plus web scripts,
4 # Copyright (C) 2006-2014 Eyeo GmbH 4 # Copyright (C) 2006-2014 Eyeo GmbH
5 # 5 #
6 # Adblock Plus is free software: you can redistribute it and/or modify 6 # Adblock Plus is free software: you can redistribute it and/or modify
7 # it under the terms of the GNU General Public License version 3 as 7 # it under the terms of the GNU General Public License version 3 as
8 # published by the Free Software Foundation. 8 # published by the Free Software Foundation.
9 # 9 #
10 # Adblock Plus is distributed in the hope that it will be useful, 10 # Adblock Plus is distributed in the hope that it will be useful,
11 # but WITHOUT ANY WARRANTY; without even the implied warranty of 11 # but WITHOUT ANY WARRANTY; without even the implied warranty of
12 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 # GNU General Public License for more details. 13 # GNU General Public License for more details.
14 # 14 #
15 # You should have received a copy of the GNU General Public License 15 # You should have received a copy of the GNU General Public License
16 # along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>. 16 # along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>.
17 17
18 import re 18 import re
19 from ConfigParser import NoOptionError 19 import os
20 import subprocess
21 from ConfigParser import SafeConfigParser, NoOptionError
22 from StringIO import StringIO
20 from sitescripts.utils import get_config 23 from sitescripts.utils import get_config
21 24
22 def compareVersionParts(part1, part2): 25 def compareVersionParts(part1, part2):
23 def convertInt(value, default): 26 def convertInt(value, default):
24 try: 27 try:
25 return int(value) 28 return int(value)
26 except ValueError: 29 except ValueError:
27 return default 30 return default
28 31
29 def convertVersionPart(part): 32 def convertVersionPart(part):
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
82 return result 85 return result
83 return 0 86 return 0
84 87
85 class Configuration(object): 88 class Configuration(object):
86 """ 89 """
87 This class represents the configuration settings for a single repository. 90 This class represents the configuration settings for a single repository.
88 Some of these properties come from the nightly config file and can be 91 Some of these properties come from the nightly config file and can be
89 changed (latestRevision), others come from the global config and are 92 changed (latestRevision), others come from the global config and are
90 read-only (repository, repositoryName, nightliesDirectory). 93 read-only (repository, repositoryName, nightliesDirectory).
91 """ 94 """
95 def _defineProperty(name, local=False, type='', default=None):
96 def getter(self):
97 method = getattr(self.config, 'get' + type)
98 key = '%s_%s' % (self.repositoryName, name) if local else name
92 99
93 def _defineGlobalProperty(key): 100 try:
94 """ 101 return method('extensions', key)
95 Creates a property corresponding with a key in the config file 102 except NoOptionError:
96 """ 103 if default is None:
97 return property(lambda self: self.config.get('extensions', key)) 104 raise
105 return default
98 106
99 def _defineLocalProperty(key, default = None): 107 return property(getter)
100 """
101 Creates a property corresponding with a repository-specific key in the con fig file
102 """
103 def getLocalProperty(self):
104 try:
105 return self.config.get('extensions', self.repositoryName + '_' + key)
106 except NoOptionError, e:
107 if default != None:
108 return default
109 else:
110 raise e
111 return property(getLocalProperty)
112 108
113 def _defineNightlyProperty(key): 109 def _defineNightlyProperty(key):
114 """ 110 """
115 Creates a property corresponding with a key in the nightly config file 111 Creates a property corresponding with a key in the nightly config file
116 """ 112 """
117 return property(lambda self: self.nightlyConfig.get(self.repositoryName, key ), 113 return property(lambda self: self.nightlyConfig.get(self.repositoryName, key ),
118 lambda self, value: self.nightlyConfig.set(self.repositoryNa me, key, value)) 114 lambda self, value: self.nightlyConfig.set(self.repositoryNa me, key, value))
119 115
120 config = None 116 config = None
121 nightlyConfig = None 117 nightlyConfig = None
122 repositoryName = None 118 repositoryName = None
123 repository = None 119 repository = None
124 120
125 buildRepository = _defineGlobalProperty('buildRepository') 121 buildRepository = _defineProperty('buildRepository')
126 nightliesDirectory = _defineGlobalProperty('nightliesDirectory') 122 nightliesDirectory = _defineProperty('nightliesDirectory')
127 nightliesURL = _defineGlobalProperty('nightliesURL') 123 nightliesURL = _defineProperty('nightliesURL')
128 downloadsRepo = _defineGlobalProperty('downloadsRepo') 124 downloadsRepo = _defineProperty('downloadsRepo')
129 downloadsURL = _defineGlobalProperty('downloadsURL') 125 downloadsURL = _defineProperty('downloadsURL')
130 docsDirectory = _defineGlobalProperty('docsDirectory') 126 docsDirectory = _defineProperty('docsDirectory')
131 signtool = _defineGlobalProperty('signtool') 127 signtool = _defineProperty('signtool')
132 certname = _defineGlobalProperty('signtool_certname') 128 certname = _defineProperty('signtool_certname')
133 dbdir = _defineGlobalProperty('signtool_dbdir') 129 dbdir = _defineProperty('signtool_dbdir')
134 dbpass = _defineGlobalProperty('signtool_dbpass') 130 dbpass = _defineProperty('signtool_dbpass')
131 padDirectory = _defineProperty('padDirectory')
132 padURL = _defineProperty('padURL')
133 padTemplate = _defineProperty('padTemplate')
135 134
136 keyFile = _defineLocalProperty('key', '') 135 keyFile = _defineProperty('key', local=True, default='')
137 name = _defineLocalProperty('name') 136 name = _defineProperty('name', local=True)
138 galleryID = _defineLocalProperty('galleryID', '') 137 galleryID = _defineProperty('galleryID', local=True, default='')
139 devbuildGalleryID = _defineLocalProperty('devbuildGalleryID', '') 138 devbuildGalleryID = _defineProperty('devbuildGalleryID', local=True, default=' ')
140 downloadPage = _defineLocalProperty('downloadPage', '') 139 downloadPage = _defineProperty('downloadPage', local=True, default='')
141 experimental = _defineLocalProperty('experimental', '') 140 experimental = _defineProperty('experimental', local=True, default='')
142 clientID = _defineLocalProperty('clientID', '') 141 clientID = _defineProperty('clientID', local=True, default='')
143 clientSecret = _defineLocalProperty('clientSecret', '') 142 clientSecret = _defineProperty('clientSecret', local=True, default='')
144 refreshToken = _defineLocalProperty('refreshToken', '') 143 refreshToken = _defineProperty('refreshToken', local=True, default='')
144 pad = _defineProperty('pad', local=True, type='boolean', default=False)
145 145
146 latestRevision = _defineNightlyProperty('latestRevision') 146 latestRevision = _defineNightlyProperty('latestRevision')
147 147
148 def __init__(self, config, nightlyConfig, repositoryName, repository): 148 def __init__(self, config, nightlyConfig, repositoryName, repository):
149 """ 149 """
150 Creates a new Configuration instance that is bound to a particular 150 Creates a new Configuration instance that is bound to a particular
151 repository. 151 repository.
152 """ 152 """
153 153
154 self.repositoryName = repositoryName 154 self.repositoryName = repositoryName
(...skipping 19 matching lines...) Expand all
174 174
175 if self.nightlyConfig and not self.nightlyConfig.has_section(self.repository Name): 175 if self.nightlyConfig and not self.nightlyConfig.has_section(self.repository Name):
176 self.nightlyConfig.add_section(self.repositoryName) 176 self.nightlyConfig.add_section(self.repositoryName)
177 177
178 def __str__(self): 178 def __str__(self):
179 """ 179 """
180 Provides a string representation of this configuration 180 Provides a string representation of this configuration
181 """ 181 """
182 return self.repositoryName 182 return self.repositoryName
183 183
184 def listContents(self, version='tip'):
185 return subprocess.check_output(['hg', '-R', self.repository, 'locate', '-r', version]).splitlines()
186
187 def readMetadata(self, version='tip'):
188 genericFilename = 'metadata'
189 filename = '%s.%s' % (genericFilename, self.type)
190 files = self.listContents(version)
191
192 if filename not in files:
193 # some repositories like those for Android and
194 # Internet Explorer don't have metadata files
195 if genericFilename not in files:
196 return None
197
198 # Fall back to platform-independent metadata file
199 filename = genericFilename
200
201 command = ['hg', '-R', self.repository, 'cat', '-r', version, os.path.join(s elf.repository, filename)]
202 result = subprocess.check_output(command)
203
204 parser = SafeConfigParser()
205 parser.readfp(StringIO(result))
206
207 return parser
208
209 @property
210 def basename(self):
211 metadata = self.readMetadata()
212 if metadata:
213 return metadata.get('general', 'basename')
214 return os.path.basename(self.repository)
215
216 def getDownloads(self):
217 prefix = self.basename + '-'
218 command = ['hg', 'locate', '-R', self.downloadsRepo, '-r', 'default']
219
220 for filename in subprocess.check_output(command).splitlines():
221 if filename.startswith(prefix) and filename.endswith(self.packageSuffix):
222 yield (filename, filename[len(prefix):len(filename) - len(self.packageSu ffix)])
223
184 @staticmethod 224 @staticmethod
185 def getRepositoryConfigurations(nightlyConfig = None): 225 def getRepositoryConfigurations(nightlyConfig = None):
186 """ 226 """
187 Retrieves configuration settings for all repositories 227 Retrieves configuration settings for all repositories
188 from the configuration file, where existing repositories 228 from the configuration file, where existing repositories
189 are identified by an <id>_repository entry appearing 229 are identified by an <id>_repository entry appearing
190 in the configuration file. 230 in the configuration file.
191 This static method will enumerate Configuration 231 This static method will enumerate Configuration
192 objects representing the settings for each repository. 232 objects representing the settings for each repository.
193 """ 233 """
(...skipping 15 matching lines...) Expand all
209 except M2Crypto.X509.X509Error: 249 except M2Crypto.X509.X509Error:
210 raise Exception('No safari developer certificate found in chain') 250 raise Exception('No safari developer certificate found in chain')
211 251
212 subject = cert.get_subject() 252 subject = cert.get_subject()
213 for entry in subject.get_entries_by_nid(subject.nid['CN']): 253 for entry in subject.get_entries_by_nid(subject.nid['CN']):
214 m = re.match(r'Safari Developer: \((.*?)\)', entry.get_data().as_text()) 254 m = re.match(r'Safari Developer: \((.*?)\)', entry.get_data().as_text())
215 if m: 255 if m:
216 return m.group(1) 256 return m.group(1)
217 finally: 257 finally:
218 bio.close() 258 bio.close()
OLDNEW
« no previous file with comments | « sitescripts/extensions/template/pad.xml ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld