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

Side by Side Diff: build.py

Issue 8627097: Moved Chrome extension scripts to buildtools repository (Closed)
Patch Set: Added build.py gettranslations support for Chrome Created Oct. 22, 2012, 11:25 a.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 | « no previous file | localeSyncChrome.py » ('j') | localeTools.py » ('J')
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 Source Code is subject to the terms of the Mozilla Public License 3 # This Source Code is subject to the terms of the Mozilla Public License
4 # version 2.0 (the "License"). You can obtain a copy of the License at 4 # version 2.0 (the "License"). You can obtain a copy of the License at
5 # http://mozilla.org/MPL/2.0/. 5 # http://mozilla.org/MPL/2.0/.
6 6
7 import os, sys, re, subprocess, buildtools 7 import os, sys, re, subprocess, buildtools
8 from getopt import getopt, GetoptError 8 from getopt import getopt, GetoptError
9 9
10 class Command(object): 10 class Command(object):
(...skipping 23 matching lines...) Expand all
34 34
35 def __exit__(self, exc_type, exc_value, traceback): 35 def __exit__(self, exc_type, exc_value, traceback):
36 pass 36 pass
37 37
38 def __call__(self, baseDir, scriptName, opts, args, type): 38 def __call__(self, baseDir, scriptName, opts, args, type):
39 return self._handler(baseDir, scriptName, opts, args, type) 39 return self._handler(baseDir, scriptName, opts, args, type)
40 40
41 def isSupported(self, type): 41 def isSupported(self, type):
42 return self._supportedTypes == None or type in self._supportedTypes 42 return self._supportedTypes == None or type in self._supportedTypes
43 43
44 def addOption(self, description, short=None, long=None, value=None): 44 def addOption(self, description, short=None, long=None, value=None, types=None ):
45 self._options.append((description, short, long, value)) 45 self._options.append((description, short, long, value, types))
46 46
47 def parseArgs(self, args): 47 def parseArgs(self, type, args):
48 shortOptions = map(lambda o: o[1]+':' if o[3] != None else o[1], filter(lamb da o: o[1] != None, self._options)) 48 shortOptions = map(
49 longOptions = map(lambda o: o[2]+'=' if o[3] != None else o[2], filter(lambd a o: o[2] != None, self._options)) 49 lambda o: o[1]+':' if o[3] != None else o[1],
50 filter(
51 lambda o: o[1] != None and (o[4] == None or type in o[4]),
52 self._options
53 )
54 )
55 longOptions = map(
56 lambda o: o[2]+'=' if o[3] != None else o[2],
57 filter(
58 lambda o: o[2] != None and (o[4] == None or type in o[4]),
59 self._options
60 )
61 )
50 return getopt(args, ''.join(shortOptions), longOptions) 62 return getopt(args, ''.join(shortOptions), longOptions)
51 63
52 64
53 commandsList = [] 65 commandsList = []
54 commands = {} 66 commands = {}
55 def addCommand(handler, name): 67 def addCommand(handler, name):
56 if isinstance(name, basestring): 68 if isinstance(name, basestring):
57 aliases = () 69 aliases = ()
58 else: 70 else:
59 name, aliases = (name[0], name[1:]) 71 name, aliases = (name[0], name[1:])
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
100 %(scriptName)s <command> --help 112 %(scriptName)s <command> --help
101 ''' % { 113 ''' % {
102 'scriptName': scriptName, 114 'scriptName': scriptName,
103 'descriptions': '\n'.join(descriptions) 115 'descriptions': '\n'.join(descriptions)
104 } 116 }
105 else: 117 else:
106 global commands 118 global commands
107 command = commands[commandName] 119 command = commands[commandName]
108 description = '\n'.join(map(lambda s: '\n'.join(splitByLength(s, 80)), comma nd.description.split('\n'))) 120 description = '\n'.join(map(lambda s: '\n'.join(splitByLength(s, 80)), comma nd.description.split('\n')))
109 options = [] 121 options = []
110 for descr, short, long, value in command.options: 122 for descr, short, long, value, types in command.options:
123 if types != None and type not in types:
124 continue
111 if short == None: 125 if short == None:
112 shortText = '' 126 shortText = ''
113 elif value == None: 127 elif value == None:
114 shortText = '-%s' % short 128 shortText = '-%s' % short
115 else: 129 else:
116 shortText = '-%s %s' % (short, value) 130 shortText = '-%s %s' % (short, value)
117 if long == None: 131 if long == None:
118 longText = '' 132 longText = ''
119 elif value == None: 133 elif value == None:
120 longText = '--%s' % long 134 longText = '--%s' % long
(...skipping 18 matching lines...) Expand all
139 } 153 }
140 154
141 155
142 def runBuild(baseDir, scriptName, opts, args, type): 156 def runBuild(baseDir, scriptName, opts, args, type):
143 locales = None 157 locales = None
144 buildNum = None 158 buildNum = None
145 multicompartment = False 159 multicompartment = False
146 releaseBuild = False 160 releaseBuild = False
147 keyFile = None 161 keyFile = None
148 limitMetadata = False 162 limitMetadata = False
163 experimentalAPI = False
149 for option, value in opts: 164 for option, value in opts:
150 if option in ('-l', '--locales'): 165 if option in ('-l', '--locales'):
151 locales = value.split(',') 166 locales = value.split(',')
152 elif option in ('-b', '--build'): 167 elif option in ('-b', '--build'):
153 buildNum = int(value) 168 buildNum = int(value)
154 elif option in ('-k', '--key'): 169 elif option in ('-k', '--key'):
155 keyFile = value 170 keyFile = value
156 elif option in ('-m', '--multi-compartment'): 171 elif option in ('-m', '--multi-compartment'):
157 multicompartment = True 172 multicompartment = True
158 elif option in ('-r', '--release'): 173 elif option in ('-r', '--release'):
159 releaseBuild = True 174 releaseBuild = True
175 elif option == '--experimental':
176 experimentalAPI = True
160 elif option == '--babelzilla': 177 elif option == '--babelzilla':
161 locales = 'all' 178 locales = 'all'
162 limitMetadata = True 179 limitMetadata = True
163 outFile = args[0] if len(args) > 0 else None 180 outFile = args[0] if len(args) > 0 else None
164 181
165 if type == 'gecko': 182 if type == 'gecko':
166 import buildtools.packager as packager 183 import buildtools.packagerGecko as packager
167 packager.createBuild(baseDir, outFile=outFile, locales=locales, buildNum=bui ldNum, 184 packager.createBuild(baseDir, outFile=outFile, locales=locales, buildNum=bui ldNum,
168 releaseBuild=releaseBuild, keyFile=keyFile, 185 releaseBuild=releaseBuild, keyFile=keyFile,
169 limitMetadata=limitMetadata, multicompartment=multicomp artment) 186 limitMetadata=limitMetadata, multicompartment=multicomp artment)
187 elif type == 'chrome':
188 import buildtools.packagerChrome as packager
189 packager.createBuild(baseDir, outFile=outFile, buildNum=buildNum,
190 releaseBuild=releaseBuild, keyFile=keyFile,
191 experimentalAPI=experimentalAPI)
170 elif type == 'kmeleon': 192 elif type == 'kmeleon':
Felix Dahlke 2013/01/10 16:36:20 Shouldn't we get rid of this while we're at it?
Wladimir Palant 2013/01/16 14:20:15 This was done in a separate batch of changes.
171 import buildtools.packagerKMeleon as packagerKMeleon 193 import buildtools.packagerKMeleon as packager
172 packagerKMeleon.createBuild(baseDir, outFile=outFile, locales=locales, 194 packager.createBuild(baseDir, outFile=outFile, locales=locales,
173 buildNum=buildNum, releaseBuild=releaseBuild) 195 buildNum=buildNum, releaseBuild=releaseBuild)
174 196
175 def runAutoInstall(baseDir, scriptName, opts, args, type): 197 def runAutoInstall(baseDir, scriptName, opts, args, type):
176 if len(args) == 0: 198 if len(args) == 0:
177 print 'Port of the Extension Auto-Installer needs to be specified' 199 print 'Port of the Extension Auto-Installer needs to be specified'
178 usage(scriptName, type, 'autoinstall') 200 usage(scriptName, type, 'autoinstall')
179 return 201 return
180 202
181 multicompartment = False 203 multicompartment = False
182 for option, value in opts: 204 for option, value in opts:
183 if option in ('-m', '--multi-compartment'): 205 if option in ('-m', '--multi-compartment'):
184 multicompartment = True 206 multicompartment = True
185 207
186 if ':' in args[0]: 208 if ':' in args[0]:
187 host, port = args[0].rsplit(':', 1) 209 host, port = args[0].rsplit(':', 1)
188 else: 210 else:
189 host, port = ('localhost', args[0]) 211 host, port = ('localhost', args[0])
190 212
191 import buildtools.packager as packager 213 import buildtools.packagerGecko as packager
192 packager.autoInstall(baseDir, host, port, multicompartment=multicompartment) 214 packager.autoInstall(baseDir, host, port, multicompartment=multicompartment)
193 215
194 216
195 def setupTranslations(baseDir, scriptName, opts, args, type): 217 def setupTranslations(baseDir, scriptName, opts, args, type):
196 if len(args) < 1: 218 if len(args) < 1:
197 print 'Project key is required to update translation master files.' 219 print 'Project key is required to update translation master files.'
198 usage(scriptName, type, 'setuptrans') 220 usage(scriptName, type, 'setuptrans')
199 return 221 return
200 222
201 key = args[0] 223 key = args[0]
202 224
203 import buildtools.packager as packager 225 if type == 'chrome':
204 locales = packager.getLocales(baseDir, True) 226 import buildtools.packagerChrome as packager
205 basename = packager.readMetadata(baseDir).get('general', 'baseName') 227 locales = os.listdir(os.path.join(baseDir, '_locales'))
228 locales = map(lambda locale: locale.replace('_', '-'), locales)
229 basename = packager.readMetadata(baseDir).get('general', 'baseName')
230 else:
Felix Dahlke 2013/01/10 16:36:20 Shouldn't we check for the type here as well and h
Wladimir Palant 2013/01/16 14:20:15 Yes, that command is only available for the chrome
231 import buildtools.packagerGecko as packager
232 locales = packager.getLocales(baseDir, True)
233 basename = packager.readMetadata(baseDir).get('general', 'baseName')
206 234
207 import buildtools.localeTools as localeTools 235 import buildtools.localeTools as localeTools
208 localeTools.setupTranslations(locales, basename, key) 236 localeTools.setupTranslations(type, locales, basename, key)
209 237
210 238
211 def updateTranslationMaster(baseDir, scriptName, opts, args, type): 239 def updateTranslationMaster(baseDir, scriptName, opts, args, type):
212 if len(args) < 1: 240 if len(args) < 1:
213 print 'Project key is required to update translation master files.' 241 print 'Project key is required to update translation master files.'
214 usage(scriptName, type, 'translate') 242 usage(scriptName, type, 'translate')
215 return 243 return
216 244
217 key = args[0] 245 key = args[0]
218 246
219 import buildtools.packager as packager 247 if type == 'chrome':
220 defaultLocaleDir = os.path.join(packager.getLocalesDir(baseDir), packager.defa ultLocale) 248 import buildtools.packagerChrome as packager
221 basename = packager.readMetadata(baseDir).get('general', 'baseName') 249 defaultLocaleDir = os.path.join(baseDir, '_locales', packager.defaultLocale)
250 metadata = packager.readMetadata(baseDir)
251 basename = metadata.get('general', 'baseName')
252 else:
Felix Dahlke 2013/01/10 16:36:20 Same as above.
253 import buildtools.packagerGecko as packager
254 defaultLocaleDir = os.path.join(packager.getLocalesDir(baseDir), packager.de faultLocale)
255 metadata = packager.readMetadata(baseDir)
256 basename = metadata.get('general', 'baseName')
222 257
223 import buildtools.localeTools as localeTools 258 import buildtools.localeTools as localeTools
224 localeTools.updateTranslationMaster(defaultLocaleDir, packager.defaultLocale, basename, key) 259 localeTools.updateTranslationMaster(type, metadata, defaultLocaleDir, basename , key)
260
261
262 def uploadTranslations(baseDir, scriptName, opts, args, type):
263 if len(args) < 1:
264 print 'Project key is required to upload existing translations.'
265 usage(scriptName, type, 'uploadtrans')
266 return
267
268 key = args[0]
269
270 if type == 'chrome':
271 import buildtools.packagerChrome as packager
272 localesDir = os.path.join(baseDir, '_locales')
273 locales = os.listdir(localesDir)
274 locales = map(lambda locale: (locale.replace('_', '-'), os.path.join(locales Dir, locale)), locales)
275 metadata = packager.readMetadata(baseDir)
276 basename = metadata.get('general', 'baseName')
277 else:
Felix Dahlke 2013/01/10 16:36:20 Same as above.
278 import buildtools.packagerGecko as packager
279 localesDir = packager.getLocalesDir(baseDir)
280 locales = packager.getLocales(baseDir, True)
281 locales = map(lambda locale: (locale, os.path.join(localesDir, locale)), loc ales)
282 metadata = packager.readMetadata(baseDir)
283 basename = metadata.get('general', 'baseName')
284
285 import buildtools.localeTools as localeTools
286 for locale, localeDir in locales:
287 if locale != packager.defaultLocale:
288 localeTools.uploadTranslations(type, metadata, localeDir, locale, basename , key)
225 289
226 290
227 def getTranslations(baseDir, scriptName, opts, args, type): 291 def getTranslations(baseDir, scriptName, opts, args, type):
228 if len(args) < 1: 292 if len(args) < 1:
229 print 'Project key is required to update translation master files.' 293 print 'Project key is required to update translation master files.'
230 usage(scriptName, type, 'translate') 294 usage(scriptName, type, 'translate')
231 return 295 return
232 296
233 key = args[0] 297 key = args[0]
234 import buildtools.packager as packager 298 if type == 'chrome':
Felix Dahlke 2013/01/10 16:36:20 Same as above.
235 localesDir = packager.getLocalesDir(baseDir) 299 import buildtools.packagerChrome as packager
236 basename = packager.readMetadata(baseDir).get('general', 'baseName') 300 localesDir = os.path.join(baseDir, '_locales')
301 else:
302 import buildtools.packagerGecko as packager
303 localesDir = packager.getLocalesDir(baseDir)
237 304
238 import buildtools.localeTools as localeTools 305 import buildtools.localeTools as localeTools
239 localeTools.getTranslations(localesDir, packager.defaultLocale, basename, key) 306 basename = packager.readMetadata(baseDir).get('general', 'baseName')
307 localeTools.getTranslations(type, localesDir, packager.defaultLocale.replace(' _', '-'), basename, key)
240 308
241 309
242 def showDescriptions(baseDir, scriptName, opts, args, type): 310 def showDescriptions(baseDir, scriptName, opts, args, type):
243 locales = None 311 locales = None
244 for option, value in opts: 312 for option, value in opts:
245 if option in ('-l', '--locales'): 313 if option in ('-l', '--locales'):
246 locales = value.split(',') 314 locales = value.split(',')
247 315
248 import buildtools.packager as packager 316 import buildtools.packagerGecko as packager
249 if locales == None: 317 if locales == None:
250 locales = packager.getLocales(baseDir) 318 locales = packager.getLocales(baseDir)
251 elif locales == 'all': 319 elif locales == 'all':
252 locales = packager.getLocales(baseDir, True) 320 locales = packager.getLocales(baseDir, True)
253 321
254 data = packager.readLocaleMetadata(baseDir, locales) 322 data = packager.readLocaleMetadata(baseDir, locales)
255 localeCodes = data.keys() 323 localeCodes = data.keys()
256 localeCodes.sort() 324 localeCodes.sort()
257 for localeCode in localeCodes: 325 for localeCode in localeCodes:
258 locale = data[localeCode] 326 locale = data[localeCode]
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
315 return 383 return
316 version = args[0] 384 version = args[0]
317 if re.search(r'[^\w\.]', version): 385 if re.search(r'[^\w\.]', version):
318 print 'Wrong version number format' 386 print 'Wrong version number format'
319 usage(scriptName, type, 'release') 387 usage(scriptName, type, 'release')
320 return 388 return
321 389
322 if keyFile == None: 390 if keyFile == None:
323 print 'Warning: no key file specified, creating an unsigned release build\ n' 391 print 'Warning: no key file specified, creating an unsigned release build\ n'
324 392
325 import buildtools.releaseAutomation as releaseAutomation 393 import buildtools.releaseAutomationGecko as releaseAutomation
326 releaseAutomation.run(baseDir, version, keyFile, downloadsRepo, buildtoolsRe po) 394 releaseAutomation.run(baseDir, version, keyFile, downloadsRepo, buildtoolsRe po)
327 else: 395 else:
328 import buildtools.releaseAutomationKMeleon as releaseAutomationKMeleon 396 import buildtools.releaseAutomationKMeleon as releaseAutomation
329 releaseAutomationKMeleon.run(baseDir, downloadsRepo, buildtoolsRepo) 397 releaseAutomation.run(baseDir, downloadsRepo, buildtoolsRepo)
398
399 def syncLocales(baseDir, scriptName, opts, args, type):
400 if len(args) == 0:
401 print 'Please specify the directory of the source Firefox extension as a par ameter'
402 usage(scriptName, type, 'synclocales')
403 return
404 sourceDir = args[0]
405
406 import buildtools.localeSyncChrome as localeSync
407 localeSync.run(baseDir, sourceDir)
408
409 def updatePSL(baseDir, scriptName, opts, args, type):
410 import buildtools.publicSuffixListUpdater as publicSuffixListUpdater
411 publicSuffixListUpdater.updatePSL(baseDir)
330 412
331 with addCommand(lambda baseDir, scriptName, opts, args, type: usage(scriptName, type), ('help', '-h', '--help')) as command: 413 with addCommand(lambda baseDir, scriptName, opts, args, type: usage(scriptName, type), ('help', '-h', '--help')) as command:
332 command.shortDescription = 'Show this message' 414 command.shortDescription = 'Show this message'
333 415
334 with addCommand(runBuild, 'build') as command: 416 with addCommand(runBuild, 'build') as command:
335 command.shortDescription = 'Create a build' 417 command.shortDescription = 'Create a build'
336 command.description = 'Creates an extension build with given file name. If out put_file is missing a default name will be chosen.' 418 command.description = 'Creates an extension build with given file name. If out put_file is missing a default name will be chosen.'
337 command.params = '[options] [output_file]' 419 command.params = '[options] [output_file]'
338 command.addOption('Only include the given locales (if omitted: all locales not marked as incomplete)', short='l', long='locales', value='l1,l2,l3') 420 command.addOption('Only include the given locales (if omitted: all locales not marked as incomplete)', short='l', long='locales', value='l1,l2,l3', types=('ge cko', 'kmeleon'))
339 command.addOption('Use given build number (if omitted the build number will be retrieved from Mercurial)', short='b', long='build', value='num') 421 command.addOption('Use given build number (if omitted the build number will be retrieved from Mercurial)', short='b', long='build', value='num')
340 command.addOption('File containing private key and certificates required to si gn the package', short='k', long='key', value='file') 422 command.addOption('File containing private key and certificates required to si gn the package', short='k', long='key', value='file', types=('gecko', 'chrome'))
341 command.addOption('Create a build for leak testing', short='m', long='multi-co mpartment') 423 command.addOption('Create a build for leak testing', short='m', long='multi-co mpartment', types=('gecko'))
342 command.addOption('Create a release build', short='r', long='release') 424 command.addOption('Create a release build', short='r', long='release')
343 command.addOption('Create a build for Babelzilla', long='babelzilla') 425 command.addOption('Enable use of experimental APIs', long='experimental')
344 command.supportedTypes = ('gecko', 'kmeleon') 426 command.addOption('Create a build for Babelzilla', long='babelzilla', types=(' gecko'))
427 command.supportedTypes = ('gecko', 'kmeleon', 'chrome')
345 428
346 with addCommand(runAutoInstall, 'autoinstall') as command: 429 with addCommand(runAutoInstall, 'autoinstall') as command:
347 command.shortDescription = 'Install extension automatically' 430 command.shortDescription = 'Install extension automatically'
348 command.description = 'Will automatically install the extension in a browser r unning Extension Auto-Installer. If host parameter is omitted assumes that the b rowser runs on localhost.' 431 command.description = 'Will automatically install the extension in a browser r unning Extension Auto-Installer. If host parameter is omitted assumes that the b rowser runs on localhost.'
349 command.params = '[<host>:]<port>' 432 command.params = '[<host>:]<port>'
350 command.addOption('Create a build for leak testing', short='m', long='multi-co mpartment') 433 command.addOption('Create a build for leak testing', short='m', long='multi-co mpartment')
351 command.supportedTypes = ('gecko') 434 command.supportedTypes = ('gecko')
352 435
353 with addCommand(setupTranslations, 'setuptrans') as command: 436 with addCommand(setupTranslations, 'setuptrans') as command:
354 command.shortDescription = 'Sets up translation languages' 437 command.shortDescription = 'Sets up translation languages'
355 command.description = 'Sets up translation languages for the project on crowdi n.net.' 438 command.description = 'Sets up translation languages for the project on crowdi n.net.'
356 command.params = '[options] project-key' 439 command.params = '[options] project-key'
357 command.supportedTypes = ('gecko') 440 command.supportedTypes = ('gecko', 'chrome')
358 441
359 with addCommand(updateTranslationMaster, 'translate') as command: 442 with addCommand(updateTranslationMaster, 'translate') as command:
360 command.shortDescription = 'Updates translation master files' 443 command.shortDescription = 'Updates translation master files'
361 command.description = 'Updates the translation master files in the project on crowdin.net.' 444 command.description = 'Updates the translation master files in the project on crowdin.net.'
362 command.params = '[options] project-key' 445 command.params = '[options] project-key'
363 command.supportedTypes = ('gecko') 446 command.supportedTypes = ('gecko', 'chrome')
447
448 with addCommand(uploadTranslations, 'uploadtrans') as command:
449 command.shortDescription = 'Uploads existing translations'
450 command.description = 'Uploads already existing translations to the project on crowdin.net.'
451 command.params = '[options] project-key'
452 command.supportedTypes = ('gecko', 'chrome')
364 453
365 with addCommand(getTranslations, 'gettranslations') as command: 454 with addCommand(getTranslations, 'gettranslations') as command:
366 command.shortDescription = 'Downloads translation updates' 455 command.shortDescription = 'Downloads translation updates'
367 command.description = 'Downloads updated translations from crowdin.net.' 456 command.description = 'Downloads updated translations from crowdin.net.'
368 command.params = '[options] project-key' 457 command.params = '[options] project-key'
369 command.supportedTypes = ('gecko') 458 command.supportedTypes = ('gecko', 'chrome')
370 459
371 with addCommand(showDescriptions, 'showdesc') as command: 460 with addCommand(showDescriptions, 'showdesc') as command:
372 command.shortDescription = 'Print description strings for all locales' 461 command.shortDescription = 'Print description strings for all locales'
373 command.description = 'Display description strings for all locales as specifie d in the corresponding meta.properties files.' 462 command.description = 'Display description strings for all locales as specifie d in the corresponding meta.properties files.'
374 command.addOption('Only include the given locales', short='l', long='locales', value='l1,l2,l3') 463 command.addOption('Only include the given locales', short='l', long='locales', value='l1,l2,l3')
375 command.params = '[options]' 464 command.params = '[options]'
376 command.supportedTypes = ('gecko') 465 command.supportedTypes = ('gecko')
377 466
378 with addCommand(generateDocs, 'docs') as command: 467 with addCommand(generateDocs, 'docs') as command:
379 command.shortDescription = 'Generate documentation' 468 command.shortDescription = 'Generate documentation'
380 command.description = 'Generate documentation files and write them into the sp ecified directory.' 469 command.description = 'Generate documentation files and write them into the sp ecified directory.'
381 command.addOption('JsDoc Toolkit location', short='t', long='toolkit', value=' dir') 470 command.addOption('JsDoc Toolkit location', short='t', long='toolkit', value=' dir')
382 command.params = '[options] <directory>' 471 command.params = '[options] <directory>'
383 command.supportedTypes = ('gecko') 472 command.supportedTypes = ('gecko')
384 473
385 with addCommand(runReleaseAutomation, 'release') as command: 474 with addCommand(runReleaseAutomation, 'release') as command:
386 command.shortDescription = 'Run release automation' 475 command.shortDescription = 'Run release automation'
387 command.description = 'Note: If you are not the project owner then you '\ 476 command.description = 'Note: If you are not the project owner then you '\
388 'probably don\'t want to run this!\n\n'\ 477 'probably don\'t want to run this!\n\n'\
389 'Runs release automation: creates downloads for the new version, tags '\ 478 'Runs release automation: creates downloads for the new version, tags '\
390 'source code repository as well as downloads and buildtools repository.' 479 'source code repository as well as downloads and buildtools repository.'
391 command.addOption('File containing private key and certificates required to si gn the release', short='k', long='key', value='file') 480 command.addOption('File containing private key and certificates required to si gn the release', short='k', long='key', value='file', types=('gecko'))
392 command.addOption('Directory containing downloads repository (if omitted ../do wnloads is assumed)', short='d', long='downloads', value='dir') 481 command.addOption('Directory containing downloads repository (if omitted ../do wnloads is assumed)', short='d', long='downloads', value='dir')
393 command.params = '[options] <version>' 482 command.params = '[options] <version>'
394 command.supportedTypes = ('gecko', 'kmeleon') 483 command.supportedTypes = ('gecko', 'kmeleon')
395 484
485 with addCommand(syncLocales, 'synclocales') as command:
486 command.shortDescription = 'Sync locales with a Firefox extension'
487 command.description = 'Updates locale files with strings from a Firefox extens ion corresponding to the entries in [locale_sync] metadata section.'
488 command.params = '<firefox_addon_directory>'
489 command.supportedTypes = ('chrome')
490
491 with addCommand(updatePSL, 'updatepsl') as command:
492 command.shortDescription = 'Updates Public Suffix List'
493 command.description = 'Downloads Public Suffix List (see http://publicsuffix.o rg/) and generates lib/publicSuffixList.js from it.'
494 command.supportedTypes = ('chrome')
495
396 def processArgs(baseDir, args, type='gecko'): 496 def processArgs(baseDir, args, type='gecko'):
397 global commands 497 global commands
398 498
399 scriptName = os.path.basename(args[0]) 499 scriptName = os.path.basename(args[0])
400 args = args[1:] 500 args = args[1:]
401 if len(args) == 0: 501 if len(args) == 0:
402 args = ['build'] 502 args = ['build']
403 print ''' 503 print '''
404 No command given, assuming "build". For a list of commands run: 504 No command given, assuming "build". For a list of commands run:
405 505
406 %s help 506 %s help
407 ''' % scriptName 507 ''' % scriptName
408 508
409 command = args[0] 509 command = args[0]
410 if command in commands: 510 if command in commands:
411 if commands[command].isSupported(type): 511 if commands[command].isSupported(type):
412 try: 512 try:
413 opts, args = commands[command].parseArgs(args[1:]) 513 opts, args = commands[command].parseArgs(type, args[1:])
414 except GetoptError, e: 514 except GetoptError, e:
415 print str(e) 515 print str(e)
416 usage(scriptName, type, command) 516 usage(scriptName, type, command)
417 sys.exit(2) 517 sys.exit(2)
418 for option, value in opts: 518 for option, value in opts:
419 if option in ('-h', '--help'): 519 if option in ('-h', '--help'):
420 usage(scriptName, type, command) 520 usage(scriptName, type, command)
421 sys.exit() 521 sys.exit()
422 commands[command](baseDir, scriptName, opts, args, type) 522 commands[command](baseDir, scriptName, opts, args, type)
423 else: 523 else:
424 print 'Command %s is not supported for this application type' % command 524 print 'Command %s is not supported for this application type' % command
425 usage(scriptName, type) 525 usage(scriptName, type)
426 else: 526 else:
427 print 'Command %s is unrecognized' % command 527 print 'Command %s is unrecognized' % command
428 usage(scriptName, type) 528 usage(scriptName, type)
OLDNEW
« no previous file with comments | « no previous file | localeSyncChrome.py » ('j') | localeTools.py » ('J')

Powered by Google App Engine
This is Rietveld