Left: | ||
Right: |
LEFT | RIGHT |
---|---|
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, |
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
106 | 106 |
107 def usage(scriptName, type, commandName=None): | 107 def usage(scriptName, type, commandName=None): |
108 if commandName == None: | 108 if commandName == None: |
109 global commandsList | 109 global commandsList |
110 descriptions = [] | 110 descriptions = [] |
111 for command in commandsList: | 111 for command in commandsList: |
112 if not command.isSupported(type): | 112 if not command.isSupported(type): |
113 continue | 113 continue |
114 commandText = ('%s %s' % (command.name, command.params)).ljust(39) | 114 commandText = ('%s %s' % (command.name, command.params)).ljust(39) |
115 descriptionParts = splitByLength(command.shortDescription, 29) | 115 descriptionParts = splitByLength(command.shortDescription, 29) |
116 descriptions.append(' %s %s %s' % (scriptName, commandText, descriptionPa rts[0])) | 116 descriptions.append(' %s [-t %s] %s %s' % (scriptName, type, commandText, descriptionParts[0])) |
117 for part in descriptionParts[1:]: | 117 for part in descriptionParts[1:]: |
118 descriptions.append(' %s %s %s' % (' ' * len(scriptName), ' ' * len(com mandText), part)) | 118 descriptions.append(' %s %s %s %s' % (' ' * len(scriptName), ' ' * len(type), ' ' * len(commandText), part)) |
119 print '''Usage: | 119 print '''Usage: |
120 | 120 |
121 %(descriptions)s | 121 %(descriptions)s |
122 | 122 |
123 For details on a command run: | 123 For details on a command run: |
124 | 124 |
125 %(scriptName)s <command> --help | 125 %(scriptName)s [-t %(type)s] <command> --help |
126 ''' % { | 126 ''' % { |
127 'scriptName': scriptName, | 127 'scriptName': scriptName, |
128 'type': type, | |
128 'descriptions': '\n'.join(descriptions) | 129 'descriptions': '\n'.join(descriptions) |
129 } | 130 } |
130 else: | 131 else: |
131 global commands | 132 global commands |
132 command = commands[commandName] | 133 command = commands[commandName] |
133 description = '\n'.join(map(lambda s: '\n'.join(splitByLength(s, 80)), comma nd.description.split('\n'))) | 134 description = '\n'.join(map(lambda s: '\n'.join(splitByLength(s, 80)), comma nd.description.split('\n'))) |
134 options = [] | 135 options = [] |
135 for descr, short, long, value, types in command.options: | 136 for descr, short, long, value, types in command.options: |
136 if types != None and type not in types: | 137 if types != None and type not in types: |
137 continue | 138 continue |
138 if short == None: | 139 if short == None: |
139 shortText = '' | 140 shortText = '' |
140 elif value == None: | 141 elif value == None: |
141 shortText = '-%s' % short | 142 shortText = '-%s' % short |
142 else: | 143 else: |
143 shortText = '-%s %s' % (short, value) | 144 shortText = '-%s %s' % (short, value) |
144 if long == None: | 145 if long == None: |
145 longText = '' | 146 longText = '' |
146 elif value == None: | 147 elif value == None: |
147 longText = '--%s' % long | 148 longText = '--%s' % long |
148 else: | 149 else: |
149 longText = '--%s=%s' % (long, value) | 150 longText = '--%s=%s' % (long, value) |
150 descrParts = splitByLength(descr, 46) | 151 descrParts = splitByLength(descr, 46) |
151 options.append(' %s %s %s' % (shortText.ljust(11), longText.ljust(19), de scrParts[0])) | 152 options.append(' %s %s %s' % (shortText.ljust(11), longText.ljust(19), de scrParts[0])) |
152 for part in descrParts[1:]: | 153 for part in descrParts[1:]: |
153 options.append(' %s %s %s' % (' ' * 11, ' ' * 19, part)) | 154 options.append(' %s %s %s' % (' ' * 11, ' ' * 19, part)) |
154 print '''%(scriptName)s %(name)s %(params)s | 155 print '''%(scriptName)s [-t %(type)s] %(name)s %(params)s |
155 | 156 |
156 %(description)s | 157 %(description)s |
157 | 158 |
158 Options: | 159 Options: |
159 %(options)s | 160 %(options)s |
160 ''' % { | 161 ''' % { |
161 'scriptName': scriptName, | 162 'scriptName': scriptName, |
163 'type': type, | |
162 'name': command.name, | 164 'name': command.name, |
163 'params': command.params, | 165 'params': command.params, |
164 'description': description, | 166 'description': description, |
165 'options': '\n'.join(options) | 167 'options': '\n'.join(options) |
166 } | 168 } |
167 | 169 |
168 | 170 |
169 def runBuild(baseDir, scriptName, opts, args, type): | 171 def runBuild(baseDir, scriptName, opts, args, type): |
170 locales = None | 172 locales = None |
171 buildNum = None | 173 buildNum = None |
(...skipping 178 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
350 | 352 |
351 def generateDocs(baseDir, scriptName, opts, args, type): | 353 def generateDocs(baseDir, scriptName, opts, args, type): |
352 if len(args) == 0: | 354 if len(args) == 0: |
353 print 'No target directory specified for the documentation' | 355 print 'No target directory specified for the documentation' |
354 usage(scriptName, type, 'docs') | 356 usage(scriptName, type, 'docs') |
355 return | 357 return |
356 targetDir = args[0] | 358 targetDir = args[0] |
357 | 359 |
358 toolkit = None | 360 toolkit = None |
359 for option, value in opts: | 361 for option, value in opts: |
360 if option in ('-k', '--toolkit'): | 362 if option in ('-t', '--toolkit'): |
361 toolkit = value | 363 toolkit = value |
362 | 364 |
363 if toolkit == None: | 365 if toolkit == None: |
364 toolkit = os.path.join(baseDir, 'jsdoc-toolkit') | 366 toolkit = os.path.join(baseDir, 'jsdoc-toolkit') |
365 if not os.path.exists(toolkit): | 367 if not os.path.exists(toolkit): |
366 subprocess.Popen(['hg', 'clone', 'https://hg.adblockplus.org/jsdoc-toolkit /', toolkit]).communicate() | 368 subprocess.Popen(['hg', 'clone', 'https://hg.adblockplus.org/jsdoc-toolkit /', toolkit]).communicate() |
367 | 369 |
368 command = [sys.executable, | 370 command = [sys.executable, |
369 os.path.join(toolkit, 'jsrun.py'), | 371 os.path.join(toolkit, 'jsrun.py'), |
370 '-t=' + os.path.join(toolkit, 'templates', 'jsdoc'), | 372 '-t=' + os.path.join(toolkit, 'templates', 'jsdoc'), |
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
471 with addCommand(showDescriptions, 'showdesc') as command: | 473 with addCommand(showDescriptions, 'showdesc') as command: |
472 command.shortDescription = 'Print description strings for all locales' | 474 command.shortDescription = 'Print description strings for all locales' |
473 command.description = 'Display description strings for all locales as specifie d in the corresponding meta.properties files.' | 475 command.description = 'Display description strings for all locales as specifie d in the corresponding meta.properties files.' |
474 command.addOption('Only include the given locales', short='l', long='locales', value='l1,l2,l3') | 476 command.addOption('Only include the given locales', short='l', long='locales', value='l1,l2,l3') |
475 command.params = '[options]' | 477 command.params = '[options]' |
476 command.supportedTypes = ('gecko') | 478 command.supportedTypes = ('gecko') |
477 | 479 |
478 with addCommand(generateDocs, 'docs') as command: | 480 with addCommand(generateDocs, 'docs') as command: |
479 command.shortDescription = 'Generate documentation' | 481 command.shortDescription = 'Generate documentation' |
480 command.description = 'Generate documentation files and write them into the sp ecified directory.' | 482 command.description = 'Generate documentation files and write them into the sp ecified directory.' |
481 command.addOption('JsDoc Toolkit location', short='k', long='toolkit', value=' dir') | 483 command.addOption('JsDoc Toolkit location', short='t', long='toolkit', value=' dir') |
482 command.params = '[options] <directory>' | 484 command.params = '[options] <directory>' |
483 command.supportedTypes = ('gecko') | 485 command.supportedTypes = ('gecko') |
484 | 486 |
485 with addCommand(runReleaseAutomation, 'release') as command: | 487 with addCommand(runReleaseAutomation, 'release') as command: |
486 command.shortDescription = 'Run release automation' | 488 command.shortDescription = 'Run release automation' |
487 command.description = 'Note: If you are not the project owner then you '\ | 489 command.description = 'Note: If you are not the project owner then you '\ |
488 'probably don\'t want to run this!\n\n'\ | 490 'probably don\'t want to run this!\n\n'\ |
489 'Runs release automation: creates downloads for the new version, tags '\ | 491 'Runs release automation: creates downloads for the new version, tags '\ |
490 'source code repository as well as downloads and buildtools repository.' | 492 'source code repository as well as downloads and buildtools repository.' |
491 command.addOption('File containing private key and certificates required to si gn the release', short='k', long='key', value='file', types=('gecko')) | 493 command.addOption('File containing private key and certificates required to si gn the release', short='k', long='key', value='file', types=('gecko')) |
492 command.addOption('Directory containing downloads repository (if omitted ../do wnloads is assumed)', short='d', long='downloads', value='dir') | 494 command.addOption('Directory containing downloads repository (if omitted ../do wnloads is assumed)', short='d', long='downloads', value='dir') |
493 command.params = '[options] <version>' | 495 command.params = '[options] <version>' |
494 command.supportedTypes = ('gecko') | 496 command.supportedTypes = ('gecko') |
495 | 497 |
496 with addCommand(syncLocales, 'synclocales') as command: | 498 with addCommand(syncLocales, 'synclocales') as command: |
497 command.shortDescription = 'Sync locales with a Firefox extension' | 499 command.shortDescription = 'Sync locales with a Firefox extension' |
498 command.description = 'Updates locale files with strings from a Firefox extens ion corresponding to the entries in [locale_sync] metadata section.' | 500 command.description = 'Updates locale files with strings from a Firefox extens ion corresponding to the entries in [locale_sync] metadata section.' |
499 command.params = '<firefox_addon_directory>' | 501 command.params = '<firefox_addon_directory>' |
500 command.supportedTypes = ('chrome') | 502 command.supportedTypes = ('chrome') |
501 | 503 |
502 with addCommand(updatePSL, 'updatepsl') as command: | 504 with addCommand(updatePSL, 'updatepsl') as command: |
503 command.shortDescription = 'Updates Public Suffix List' | 505 command.shortDescription = 'Updates Public Suffix List' |
504 command.description = 'Downloads Public Suffix List (see http://publicsuffix.o rg/) and generates lib/publicSuffixList.js from it.' | 506 command.description = 'Downloads Public Suffix List (see http://publicsuffix.o rg/) and generates lib/publicSuffixList.js from it.' |
505 command.supportedTypes = ('chrome') | 507 command.supportedTypes = ('chrome') |
506 | 508 |
507 def getType(baseDir, args): | 509 def getType(baseDir, scriptName, args): |
508 # Look for an explicit type parameter | 510 # Look for an explicit type parameter (has to be the first parameter) |
509 for i in range(len(args)): | 511 if len(args) >= 2 and args[0] == '-t': |
Felix Dahlke
2013/01/25 08:30:49
Hard coding that -t needs to be the very first par
| |
510 if args[i] == '-t' and i < len(args) - 1: | 512 type = 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] | 513 del args[1] |
512 del args[i + 1] | 514 del args[0] |
513 del args[i] | 515 if type not in knownTypes: |
514 if type not in knownTypes: | 516 print ''' |
515 print ''' | |
516 Unknown type %s specified, supported types are: %s | 517 Unknown type %s specified, supported types are: %s |
517 ''' % (type, ', '.join(knownTypes)) | 518 ''' % (type, ', '.join(knownTypes)) |
518 return None | 519 return None |
519 else: | 520 return type |
Felix Dahlke
2013/01/25 07:49:43
The Mozilla Coding Style says: "Don't put an else
| |
520 return type | |
521 | 521 |
522 # Try to guess repository type | 522 # Try to guess repository type |
523 types = [] | 523 types = [] |
524 for t in knownTypes: | 524 for t in knownTypes: |
525 if os.path.exists(os.path.join(baseDir, 'metadata.%s' % t)): | 525 if os.path.exists(os.path.join(baseDir, 'metadata.%s' % t)): |
526 types.append(t) | 526 types.append(t) |
527 | 527 |
528 if len(types) == 1: | 528 if len(types) == 1: |
529 return types[0] | 529 return types[0] |
530 elif len(types) > 1: | 530 elif len(types) > 1: |
531 print ''' | 531 print ''' |
532 Ambiguous repository type, please specify -t parameter explicitly, e.g. | 532 Ambiguous repository type, please specify -t parameter explicitly, e.g. |
533 -t %s | 533 %s -t %s build |
534 ''' % types[0] | 534 ''' % (scriptName, types[0]) |
535 return None | 535 return None |
536 else: | 536 else: |
537 print ''' | 537 print ''' |
538 No metadata file found in this repository, a metadata file like | 538 No metadata file found in this repository, a metadata file like |
539 metadata.%s is required. | 539 metadata.%s is required. |
540 ''' % knownTypes[0] | 540 ''' % knownTypes[0] |
541 return None | 541 return None |
542 | 542 |
543 def processArgs(baseDir, args): | 543 def processArgs(baseDir, args): |
544 global commands | 544 global commands |
545 | 545 |
546 scriptName = os.path.basename(args[0]) | 546 scriptName = os.path.basename(args[0]) |
547 args = args[1:] | 547 args = args[1:] |
548 type = getType(baseDir, args) | 548 type = getType(baseDir, scriptName, args) |
Felix Dahlke
2013/01/25 08:30:49
There's a rogue white space before "args". Utter n
Wladimir Palant
2013/01/25 10:23:49
Fixed that before pushing.
| |
549 if type == None: | 549 if type == None: |
550 return | 550 return |
551 | 551 |
552 if len(args) == 0: | 552 if len(args) == 0: |
553 args = ['build'] | 553 args = ['build'] |
554 print ''' | 554 print ''' |
555 No command given, assuming "build". For a list of commands run: | 555 No command given, assuming "build". For a list of commands run: |
556 | 556 |
557 %s help | 557 %s help |
558 ''' % scriptName | 558 ''' % scriptName |
(...skipping 11 matching lines...) Expand all Loading... | |
570 if option in ('-h', '--help'): | 570 if option in ('-h', '--help'): |
571 usage(scriptName, type, command) | 571 usage(scriptName, type, command) |
572 sys.exit() | 572 sys.exit() |
573 commands[command](baseDir, scriptName, opts, args, type) | 573 commands[command](baseDir, scriptName, opts, args, type) |
574 else: | 574 else: |
575 print 'Command %s is not supported for this application type' % command | 575 print 'Command %s is not supported for this application type' % command |
576 usage(scriptName, type) | 576 usage(scriptName, type) |
577 else: | 577 else: |
578 print 'Command %s is unrecognized' % command | 578 print 'Command %s is unrecognized' % command |
579 usage(scriptName, type) | 579 usage(scriptName, type) |
LEFT | RIGHT |