| OLD | NEW |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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': |
| 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: |
| 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: |
| 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: |
| 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 import buildtools.packagerGecko as packager |
| 235 localesDir = packager.getLocalesDir(baseDir) | 299 localesDir = packager.getLocalesDir(baseDir) |
| 236 basename = packager.readMetadata(baseDir).get('general', 'baseName') | 300 basename = packager.readMetadata(baseDir).get('general', 'baseName') |
| 237 | 301 |
| 238 import buildtools.localeTools as localeTools | 302 import buildtools.localeTools as localeTools |
| 239 localeTools.getTranslations(localesDir, packager.defaultLocale, basename, key) | 303 localeTools.getTranslations(localesDir, packager.defaultLocale, basename, key) |
| 240 | 304 |
| 241 | 305 |
| 242 def showDescriptions(baseDir, scriptName, opts, args, type): | 306 def showDescriptions(baseDir, scriptName, opts, args, type): |
| 243 locales = None | 307 locales = None |
| 244 for option, value in opts: | 308 for option, value in opts: |
| 245 if option in ('-l', '--locales'): | 309 if option in ('-l', '--locales'): |
| 246 locales = value.split(',') | 310 locales = value.split(',') |
| 247 | 311 |
| 248 import buildtools.packager as packager | 312 import buildtools.packagerGecko as packager |
| 249 if locales == None: | 313 if locales == None: |
| 250 locales = packager.getLocales(baseDir) | 314 locales = packager.getLocales(baseDir) |
| 251 elif locales == 'all': | 315 elif locales == 'all': |
| 252 locales = packager.getLocales(baseDir, True) | 316 locales = packager.getLocales(baseDir, True) |
| 253 | 317 |
| 254 data = packager.readLocaleMetadata(baseDir, locales) | 318 data = packager.readLocaleMetadata(baseDir, locales) |
| 255 localeCodes = data.keys() | 319 localeCodes = data.keys() |
| 256 localeCodes.sort() | 320 localeCodes.sort() |
| 257 for localeCode in localeCodes: | 321 for localeCode in localeCodes: |
| 258 locale = data[localeCode] | 322 locale = data[localeCode] |
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 315 return | 379 return |
| 316 version = args[0] | 380 version = args[0] |
| 317 if re.search(r'[^\w\.]', version): | 381 if re.search(r'[^\w\.]', version): |
| 318 print 'Wrong version number format' | 382 print 'Wrong version number format' |
| 319 usage(scriptName, type, 'release') | 383 usage(scriptName, type, 'release') |
| 320 return | 384 return |
| 321 | 385 |
| 322 if keyFile == None: | 386 if keyFile == None: |
| 323 print 'Warning: no key file specified, creating an unsigned release build\
n' | 387 print 'Warning: no key file specified, creating an unsigned release build\
n' |
| 324 | 388 |
| 325 import buildtools.releaseAutomation as releaseAutomation | 389 import buildtools.releaseAutomationGecko as releaseAutomation |
| 326 releaseAutomation.run(baseDir, version, keyFile, downloadsRepo, buildtoolsRe
po) | 390 releaseAutomation.run(baseDir, version, keyFile, downloadsRepo, buildtoolsRe
po) |
| 327 else: | 391 else: |
| 328 import buildtools.releaseAutomationKMeleon as releaseAutomationKMeleon | 392 import buildtools.releaseAutomationKMeleon as releaseAutomation |
| 329 releaseAutomationKMeleon.run(baseDir, downloadsRepo, buildtoolsRepo) | 393 releaseAutomation.run(baseDir, downloadsRepo, buildtoolsRepo) |
| 394 |
| 395 def syncLocales(baseDir, scriptName, opts, args, type): |
| 396 if len(args) == 0: |
| 397 print 'Please specify the directory of the source Firefox extension as a par
ameter' |
| 398 usage(scriptName, type, 'synclocales') |
| 399 return |
| 400 sourceDir = args[0] |
| 401 |
| 402 import buildtools.localeSyncChrome as localeSync |
| 403 localeSync.run(baseDir, sourceDir) |
| 404 |
| 405 def updatePSL(baseDir, scriptName, opts, args, type): |
| 406 import buildtools.publicSuffixListUpdater as publicSuffixListUpdater |
| 407 publicSuffixListUpdater.updatePSL(baseDir) |
| 330 | 408 |
| 331 with addCommand(lambda baseDir, scriptName, opts, args, type: usage(scriptName,
type), ('help', '-h', '--help')) as command: | 409 with addCommand(lambda baseDir, scriptName, opts, args, type: usage(scriptName,
type), ('help', '-h', '--help')) as command: |
| 332 command.shortDescription = 'Show this message' | 410 command.shortDescription = 'Show this message' |
| 333 | 411 |
| 334 with addCommand(runBuild, 'build') as command: | 412 with addCommand(runBuild, 'build') as command: |
| 335 command.shortDescription = 'Create a build' | 413 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.' | 414 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]' | 415 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') | 416 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') | 417 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') | 418 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') | 419 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') | 420 command.addOption('Create a release build', short='r', long='release') |
| 343 command.addOption('Create a build for Babelzilla', long='babelzilla') | 421 command.addOption('Enable use of experimental APIs', long='experimental') |
| 344 command.supportedTypes = ('gecko', 'kmeleon') | 422 command.addOption('Create a build for Babelzilla', long='babelzilla', types=('
gecko')) |
| 423 command.supportedTypes = ('gecko', 'kmeleon', 'chrome') |
| 345 | 424 |
| 346 with addCommand(runAutoInstall, 'autoinstall') as command: | 425 with addCommand(runAutoInstall, 'autoinstall') as command: |
| 347 command.shortDescription = 'Install extension automatically' | 426 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.' | 427 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>' | 428 command.params = '[<host>:]<port>' |
| 350 command.addOption('Create a build for leak testing', short='m', long='multi-co
mpartment') | 429 command.addOption('Create a build for leak testing', short='m', long='multi-co
mpartment') |
| 351 command.supportedTypes = ('gecko') | 430 command.supportedTypes = ('gecko') |
| 352 | 431 |
| 353 with addCommand(setupTranslations, 'setuptrans') as command: | 432 with addCommand(setupTranslations, 'setuptrans') as command: |
| 354 command.shortDescription = 'Sets up translation languages' | 433 command.shortDescription = 'Sets up translation languages' |
| 355 command.description = 'Sets up translation languages for the project on crowdi
n.net.' | 434 command.description = 'Sets up translation languages for the project on crowdi
n.net.' |
| 356 command.params = '[options] project-key' | 435 command.params = '[options] project-key' |
| 357 command.supportedTypes = ('gecko') | 436 command.supportedTypes = ('gecko', 'chrome') |
| 358 | 437 |
| 359 with addCommand(updateTranslationMaster, 'translate') as command: | 438 with addCommand(updateTranslationMaster, 'translate') as command: |
| 360 command.shortDescription = 'Updates translation master files' | 439 command.shortDescription = 'Updates translation master files' |
| 361 command.description = 'Updates the translation master files in the project on
crowdin.net.' | 440 command.description = 'Updates the translation master files in the project on
crowdin.net.' |
| 362 command.params = '[options] project-key' | 441 command.params = '[options] project-key' |
| 363 command.supportedTypes = ('gecko') | 442 command.supportedTypes = ('gecko', 'chrome') |
| 443 |
| 444 with addCommand(uploadTranslations, 'uploadtrans') as command: |
| 445 command.shortDescription = 'Uploads existing translations' |
| 446 command.description = 'Uploads already existing translations to the project on
crowdin.net.' |
| 447 command.params = '[options] project-key' |
| 448 command.supportedTypes = ('gecko', 'chrome') |
| 364 | 449 |
| 365 with addCommand(getTranslations, 'gettranslations') as command: | 450 with addCommand(getTranslations, 'gettranslations') as command: |
| 366 command.shortDescription = 'Downloads translation updates' | 451 command.shortDescription = 'Downloads translation updates' |
| 367 command.description = 'Downloads updated translations from crowdin.net.' | 452 command.description = 'Downloads updated translations from crowdin.net.' |
| 368 command.params = '[options] project-key' | 453 command.params = '[options] project-key' |
| 369 command.supportedTypes = ('gecko') | 454 command.supportedTypes = ('gecko') |
| 370 | 455 |
| 371 with addCommand(showDescriptions, 'showdesc') as command: | 456 with addCommand(showDescriptions, 'showdesc') as command: |
| 372 command.shortDescription = 'Print description strings for all locales' | 457 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.' | 458 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') | 459 command.addOption('Only include the given locales', short='l', long='locales',
value='l1,l2,l3') |
| 375 command.params = '[options]' | 460 command.params = '[options]' |
| 376 command.supportedTypes = ('gecko') | 461 command.supportedTypes = ('gecko') |
| 377 | 462 |
| 378 with addCommand(generateDocs, 'docs') as command: | 463 with addCommand(generateDocs, 'docs') as command: |
| 379 command.shortDescription = 'Generate documentation' | 464 command.shortDescription = 'Generate documentation' |
| 380 command.description = 'Generate documentation files and write them into the sp
ecified directory.' | 465 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') | 466 command.addOption('JsDoc Toolkit location', short='t', long='toolkit', value='
dir') |
| 382 command.params = '[options] <directory>' | 467 command.params = '[options] <directory>' |
| 383 command.supportedTypes = ('gecko') | 468 command.supportedTypes = ('gecko') |
| 384 | 469 |
| 385 with addCommand(runReleaseAutomation, 'release') as command: | 470 with addCommand(runReleaseAutomation, 'release') as command: |
| 386 command.shortDescription = 'Run release automation' | 471 command.shortDescription = 'Run release automation' |
| 387 command.description = 'Note: If you are not the project owner then you '\ | 472 command.description = 'Note: If you are not the project owner then you '\ |
| 388 'probably don\'t want to run this!\n\n'\ | 473 'probably don\'t want to run this!\n\n'\ |
| 389 'Runs release automation: creates downloads for the new version, tags '\ | 474 'Runs release automation: creates downloads for the new version, tags '\ |
| 390 'source code repository as well as downloads and buildtools repository.' | 475 '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') | 476 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') | 477 command.addOption('Directory containing downloads repository (if omitted ../do
wnloads is assumed)', short='d', long='downloads', value='dir') |
| 393 command.params = '[options] <version>' | 478 command.params = '[options] <version>' |
| 394 command.supportedTypes = ('gecko', 'kmeleon') | 479 command.supportedTypes = ('gecko', 'kmeleon') |
| 395 | 480 |
| 481 with addCommand(syncLocales, 'synclocales') as command: |
| 482 command.shortDescription = 'Sync locales with a Firefox extension' |
| 483 command.description = 'Updates locale files with strings from a Firefox extens
ion corresponding to the entries in [locale_sync] metadata section.' |
| 484 command.params = '<firefox_addon_directory>' |
| 485 command.supportedTypes = ('chrome') |
| 486 |
| 487 with addCommand(updatePSL, 'updatepsl') as command: |
| 488 command.shortDescription = 'Updates Public Suffix List' |
| 489 command.description = 'Downloads Public Suffix List (see http://publicsuffix.o
rg/) and generates lib/publicSuffixList.js from it.' |
| 490 command.supportedTypes = ('chrome') |
| 491 |
| 396 def processArgs(baseDir, args, type='gecko'): | 492 def processArgs(baseDir, args, type='gecko'): |
| 397 global commands | 493 global commands |
| 398 | 494 |
| 399 scriptName = os.path.basename(args[0]) | 495 scriptName = os.path.basename(args[0]) |
| 400 args = args[1:] | 496 args = args[1:] |
| 401 if len(args) == 0: | 497 if len(args) == 0: |
| 402 args = ['build'] | 498 args = ['build'] |
| 403 print ''' | 499 print ''' |
| 404 No command given, assuming "build". For a list of commands run: | 500 No command given, assuming "build". For a list of commands run: |
| 405 | 501 |
| 406 %s help | 502 %s help |
| 407 ''' % scriptName | 503 ''' % scriptName |
| 408 | 504 |
| 409 command = args[0] | 505 command = args[0] |
| 410 if command in commands: | 506 if command in commands: |
| 411 if commands[command].isSupported(type): | 507 if commands[command].isSupported(type): |
| 412 try: | 508 try: |
| 413 opts, args = commands[command].parseArgs(args[1:]) | 509 opts, args = commands[command].parseArgs(type, args[1:]) |
| 414 except GetoptError, e: | 510 except GetoptError, e: |
| 415 print str(e) | 511 print str(e) |
| 416 usage(scriptName, type, command) | 512 usage(scriptName, type, command) |
| 417 sys.exit(2) | 513 sys.exit(2) |
| 418 for option, value in opts: | 514 for option, value in opts: |
| 419 if option in ('-h', '--help'): | 515 if option in ('-h', '--help'): |
| 420 usage(scriptName, type, command) | 516 usage(scriptName, type, command) |
| 421 sys.exit() | 517 sys.exit() |
| 422 commands[command](baseDir, scriptName, opts, args, type) | 518 commands[command](baseDir, scriptName, opts, args, type) |
| 423 else: | 519 else: |
| 424 print 'Command %s is not supported for this application type' % command | 520 print 'Command %s is not supported for this application type' % command |
| 425 usage(scriptName, type) | 521 usage(scriptName, type) |
| 426 else: | 522 else: |
| 427 print 'Command %s is unrecognized' % command | 523 print 'Command %s is unrecognized' % command |
| 428 usage(scriptName, type) | 524 usage(scriptName, type) |
| OLD | NEW |