Left: | ||
Right: |
OLD | NEW |
---|---|
1 # coding: utf-8 | 1 # coding: utf-8 |
2 | 2 |
3 # This file is part of the Adblock Plus build tools, | 3 # This file is part of the Adblock Plus build tools, |
4 # Copyright (C) 2006-2012 Eyeo GmbH | 4 # Copyright (C) 2006-2012 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 os, sys, re, subprocess, buildtools | 18 import os, sys, re, subprocess, buildtools |
19 from getopt import getopt, GetoptError | 19 from getopt import getopt, GetoptError |
20 | 20 |
21 knownTypes = ('gecko', 'chrome') | |
22 | |
21 class Command(object): | 23 class Command(object): |
22 name = property(lambda self: self._name) | 24 name = property(lambda self: self._name) |
23 shortDescription = property(lambda self: self._shortDescription, | 25 shortDescription = property(lambda self: self._shortDescription, |
24 lambda self, value: self.__dict__.update({'_shortDescription': value})) | 26 lambda self, value: self.__dict__.update({'_shortDescription': value})) |
25 description = property(lambda self: self._description, | 27 description = property(lambda self: self._description, |
26 lambda self, value: self.__dict__.update({'_description': value})) | 28 lambda self, value: self.__dict__.update({'_description': value})) |
27 params = property(lambda self: self._params, | 29 params = property(lambda self: self._params, |
28 lambda self, value: self.__dict__.update({'_params': value})) | 30 lambda self, value: self.__dict__.update({'_params': value})) |
29 supportedTypes = property(lambda self: self._supportedTypes, | 31 supportedTypes = property(lambda self: self._supportedTypes, |
30 lambda self, value: self.__dict__.update({'_supportedTypes': value})) | 32 lambda self, value: self.__dict__.update({'_supportedTypes': value})) |
(...skipping 317 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
348 | 350 |
349 def generateDocs(baseDir, scriptName, opts, args, type): | 351 def generateDocs(baseDir, scriptName, opts, args, type): |
350 if len(args) == 0: | 352 if len(args) == 0: |
351 print 'No target directory specified for the documentation' | 353 print 'No target directory specified for the documentation' |
352 usage(scriptName, type, 'docs') | 354 usage(scriptName, type, 'docs') |
353 return | 355 return |
354 targetDir = args[0] | 356 targetDir = args[0] |
355 | 357 |
356 toolkit = None | 358 toolkit = None |
357 for option, value in opts: | 359 for option, value in opts: |
358 if option in ('-t', '--toolkit'): | 360 if option in ('-k', '--toolkit'): |
359 toolkit = value | 361 toolkit = value |
360 | 362 |
361 if toolkit == None: | 363 if toolkit == None: |
362 toolkit = os.path.join(baseDir, 'jsdoc-toolkit') | 364 toolkit = os.path.join(baseDir, 'jsdoc-toolkit') |
363 if not os.path.exists(toolkit): | 365 if not os.path.exists(toolkit): |
364 subprocess.Popen(['hg', 'clone', 'https://hg.adblockplus.org/jsdoc-toolkit /', toolkit]).communicate() | 366 subprocess.Popen(['hg', 'clone', 'https://hg.adblockplus.org/jsdoc-toolkit /', toolkit]).communicate() |
365 | 367 |
366 command = [sys.executable, | 368 command = [sys.executable, |
367 os.path.join(toolkit, 'jsrun.py'), | 369 os.path.join(toolkit, 'jsrun.py'), |
368 '-t=' + os.path.join(toolkit, 'templates', 'jsdoc'), | 370 '-t=' + os.path.join(toolkit, 'templates', 'jsdoc'), |
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
469 with addCommand(showDescriptions, 'showdesc') as command: | 471 with addCommand(showDescriptions, 'showdesc') as command: |
470 command.shortDescription = 'Print description strings for all locales' | 472 command.shortDescription = 'Print description strings for all locales' |
471 command.description = 'Display description strings for all locales as specifie d in the corresponding meta.properties files.' | 473 command.description = 'Display description strings for all locales as specifie d in the corresponding meta.properties files.' |
472 command.addOption('Only include the given locales', short='l', long='locales', value='l1,l2,l3') | 474 command.addOption('Only include the given locales', short='l', long='locales', value='l1,l2,l3') |
473 command.params = '[options]' | 475 command.params = '[options]' |
474 command.supportedTypes = ('gecko') | 476 command.supportedTypes = ('gecko') |
475 | 477 |
476 with addCommand(generateDocs, 'docs') as command: | 478 with addCommand(generateDocs, 'docs') as command: |
477 command.shortDescription = 'Generate documentation' | 479 command.shortDescription = 'Generate documentation' |
478 command.description = 'Generate documentation files and write them into the sp ecified directory.' | 480 command.description = 'Generate documentation files and write them into the sp ecified directory.' |
479 command.addOption('JsDoc Toolkit location', short='t', long='toolkit', value=' dir') | 481 command.addOption('JsDoc Toolkit location', short='k', long='toolkit', value=' dir') |
480 command.params = '[options] <directory>' | 482 command.params = '[options] <directory>' |
481 command.supportedTypes = ('gecko') | 483 command.supportedTypes = ('gecko') |
482 | 484 |
483 with addCommand(runReleaseAutomation, 'release') as command: | 485 with addCommand(runReleaseAutomation, 'release') as command: |
484 command.shortDescription = 'Run release automation' | 486 command.shortDescription = 'Run release automation' |
485 command.description = 'Note: If you are not the project owner then you '\ | 487 command.description = 'Note: If you are not the project owner then you '\ |
486 'probably don\'t want to run this!\n\n'\ | 488 'probably don\'t want to run this!\n\n'\ |
487 'Runs release automation: creates downloads for the new version, tags '\ | 489 'Runs release automation: creates downloads for the new version, tags '\ |
488 'source code repository as well as downloads and buildtools repository.' | 490 'source code repository as well as downloads and buildtools repository.' |
489 command.addOption('File containing private key and certificates required to si gn the release', short='k', long='key', value='file', types=('gecko')) | 491 command.addOption('File containing private key and certificates required to si gn the release', short='k', long='key', value='file', types=('gecko')) |
490 command.addOption('Directory containing downloads repository (if omitted ../do wnloads is assumed)', short='d', long='downloads', value='dir') | 492 command.addOption('Directory containing downloads repository (if omitted ../do wnloads is assumed)', short='d', long='downloads', value='dir') |
491 command.params = '[options] <version>' | 493 command.params = '[options] <version>' |
492 command.supportedTypes = ('gecko') | 494 command.supportedTypes = ('gecko') |
493 | 495 |
494 with addCommand(syncLocales, 'synclocales') as command: | 496 with addCommand(syncLocales, 'synclocales') as command: |
495 command.shortDescription = 'Sync locales with a Firefox extension' | 497 command.shortDescription = 'Sync locales with a Firefox extension' |
496 command.description = 'Updates locale files with strings from a Firefox extens ion corresponding to the entries in [locale_sync] metadata section.' | 498 command.description = 'Updates locale files with strings from a Firefox extens ion corresponding to the entries in [locale_sync] metadata section.' |
497 command.params = '<firefox_addon_directory>' | 499 command.params = '<firefox_addon_directory>' |
498 command.supportedTypes = ('chrome') | 500 command.supportedTypes = ('chrome') |
499 | 501 |
500 with addCommand(updatePSL, 'updatepsl') as command: | 502 with addCommand(updatePSL, 'updatepsl') as command: |
501 command.shortDescription = 'Updates Public Suffix List' | 503 command.shortDescription = 'Updates Public Suffix List' |
502 command.description = 'Downloads Public Suffix List (see http://publicsuffix.o rg/) and generates lib/publicSuffixList.js from it.' | 504 command.description = 'Downloads Public Suffix List (see http://publicsuffix.o rg/) and generates lib/publicSuffixList.js from it.' |
503 command.supportedTypes = ('chrome') | 505 command.supportedTypes = ('chrome') |
504 | 506 |
505 def processArgs(baseDir, args, type='gecko'): | 507 def getType(baseDir, args): |
508 # Look for an explicit type parameter | |
509 for i in range(len(args)): | |
510 if args[i] == '-t' and i < len(args) - 1: | |
Felix Dahlke
2013/01/25 07:49:43
While there doesn't seem to be a problem with this
Wladimir Palant
2013/01/25 08:23:10
Yes, that would be nice indeed. The problem is tha
| |
511 type = args[i + 1] | |
512 del args[i + 1] | |
513 del args[i] | |
514 if type not in knownTypes: | |
515 print ''' | |
516 Unknown type %s specified, supported types are: %s | |
517 ''' % (type, ', '.join(knownTypes)) | |
518 return None | |
519 else: | |
Felix Dahlke
2013/01/25 07:49:43
The Mozilla Coding Style says: "Don't put an else
| |
520 return type | |
521 | |
522 # Try to guess repository type | |
523 types = [] | |
524 for t in knownTypes: | |
525 if os.path.exists(os.path.join(baseDir, 'metadata.%s' % t)): | |
526 types.append(t) | |
527 | |
528 if len(types) == 1: | |
529 return types[0] | |
530 elif len(types) > 1: | |
531 print ''' | |
532 Ambiguous repository type, please specify -t parameter explicitly, e.g. | |
533 -t %s | |
534 ''' % types[0] | |
535 return None | |
536 else: | |
537 print ''' | |
538 No metadata file found in this repository, a metadata file like | |
539 metadata.%s is required. | |
540 ''' % knownTypes[0] | |
541 return None | |
542 | |
543 def processArgs(baseDir, args): | |
506 global commands | 544 global commands |
507 | 545 |
508 scriptName = os.path.basename(args[0]) | 546 scriptName = os.path.basename(args[0]) |
509 args = args[1:] | 547 args = args[1:] |
548 type = getType(baseDir, args) | |
549 if type == None: | |
550 return | |
551 | |
510 if len(args) == 0: | 552 if len(args) == 0: |
511 args = ['build'] | 553 args = ['build'] |
512 print ''' | 554 print ''' |
513 No command given, assuming "build". For a list of commands run: | 555 No command given, assuming "build". For a list of commands run: |
514 | 556 |
515 %s help | 557 %s help |
516 ''' % scriptName | 558 ''' % scriptName |
517 | 559 |
518 command = args[0] | 560 command = args[0] |
519 if command in commands: | 561 if command in commands: |
520 if commands[command].isSupported(type): | 562 if commands[command].isSupported(type): |
521 try: | 563 try: |
522 opts, args = commands[command].parseArgs(type, args[1:]) | 564 opts, args = commands[command].parseArgs(type, args[1:]) |
523 except GetoptError, e: | 565 except GetoptError, e: |
524 print str(e) | 566 print str(e) |
525 usage(scriptName, type, command) | 567 usage(scriptName, type, command) |
526 sys.exit(2) | 568 sys.exit(2) |
527 for option, value in opts: | 569 for option, value in opts: |
528 if option in ('-h', '--help'): | 570 if option in ('-h', '--help'): |
529 usage(scriptName, type, command) | 571 usage(scriptName, type, command) |
530 sys.exit() | 572 sys.exit() |
531 commands[command](baseDir, scriptName, opts, args, type) | 573 commands[command](baseDir, scriptName, opts, args, type) |
532 else: | 574 else: |
533 print 'Command %s is not supported for this application type' % command | 575 print 'Command %s is not supported for this application type' % command |
534 usage(scriptName, type) | 576 usage(scriptName, type) |
535 else: | 577 else: |
536 print 'Command %s is unrecognized' % command | 578 print 'Command %s is unrecognized' % command |
537 usage(scriptName, type) | 579 usage(scriptName, type) |
OLD | NEW |