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

Side by Side Diff: build.py

Issue 9259023: Use platform-dependent metadata files to allow multiple builds from the same repository (Closed)
Patch Set: The -t command line flag is now properly documented in the help output, it`s still a very special c… Created Jan. 25, 2013, 8:22 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 | packager.py » ('j') | 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 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 73 matching lines...) Expand 10 before | Expand all | Expand 10 after
104 106
105 def usage(scriptName, type, commandName=None): 107 def usage(scriptName, type, commandName=None):
106 if commandName == None: 108 if commandName == None:
107 global commandsList 109 global commandsList
108 descriptions = [] 110 descriptions = []
109 for command in commandsList: 111 for command in commandsList:
110 if not command.isSupported(type): 112 if not command.isSupported(type):
111 continue 113 continue
112 commandText = ('%s %s' % (command.name, command.params)).ljust(39) 114 commandText = ('%s %s' % (command.name, command.params)).ljust(39)
113 descriptionParts = splitByLength(command.shortDescription, 29) 115 descriptionParts = splitByLength(command.shortDescription, 29)
114 descriptions.append(' %s %s %s' % (scriptName, commandText, descriptionPa rts[0])) 116 descriptions.append(' %s [-t %s] %s %s' % (scriptName, type, commandText, descriptionParts[0]))
115 for part in descriptionParts[1:]: 117 for part in descriptionParts[1:]:
116 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))
117 print '''Usage: 119 print '''Usage:
118 120
119 %(descriptions)s 121 %(descriptions)s
120 122
121 For details on a command run: 123 For details on a command run:
122 124
123 %(scriptName)s <command> --help 125 %(scriptName)s [-t %(type)s] <command> --help
124 ''' % { 126 ''' % {
125 'scriptName': scriptName, 127 'scriptName': scriptName,
128 'type': type,
126 'descriptions': '\n'.join(descriptions) 129 'descriptions': '\n'.join(descriptions)
127 } 130 }
128 else: 131 else:
129 global commands 132 global commands
130 command = commands[commandName] 133 command = commands[commandName]
131 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')))
132 options = [] 135 options = []
133 for descr, short, long, value, types in command.options: 136 for descr, short, long, value, types in command.options:
134 if types != None and type not in types: 137 if types != None and type not in types:
135 continue 138 continue
136 if short == None: 139 if short == None:
137 shortText = '' 140 shortText = ''
138 elif value == None: 141 elif value == None:
139 shortText = '-%s' % short 142 shortText = '-%s' % short
140 else: 143 else:
141 shortText = '-%s %s' % (short, value) 144 shortText = '-%s %s' % (short, value)
142 if long == None: 145 if long == None:
143 longText = '' 146 longText = ''
144 elif value == None: 147 elif value == None:
145 longText = '--%s' % long 148 longText = '--%s' % long
146 else: 149 else:
147 longText = '--%s=%s' % (long, value) 150 longText = '--%s=%s' % (long, value)
148 descrParts = splitByLength(descr, 46) 151 descrParts = splitByLength(descr, 46)
149 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]))
150 for part in descrParts[1:]: 153 for part in descrParts[1:]:
151 options.append(' %s %s %s' % (' ' * 11, ' ' * 19, part)) 154 options.append(' %s %s %s' % (' ' * 11, ' ' * 19, part))
152 print '''%(scriptName)s %(name)s %(params)s 155 print '''%(scriptName)s [-t %(type)s] %(name)s %(params)s
153 156
154 %(description)s 157 %(description)s
155 158
156 Options: 159 Options:
157 %(options)s 160 %(options)s
158 ''' % { 161 ''' % {
159 'scriptName': scriptName, 162 'scriptName': scriptName,
163 'type': type,
160 'name': command.name, 164 'name': command.name,
161 'params': command.params, 165 'params': command.params,
162 'description': description, 166 'description': description,
163 'options': '\n'.join(options) 167 'options': '\n'.join(options)
164 } 168 }
165 169
166 170
167 def runBuild(baseDir, scriptName, opts, args, type): 171 def runBuild(baseDir, scriptName, opts, args, type):
168 locales = None 172 locales = None
169 buildNum = None 173 buildNum = None
(...skipping 325 matching lines...) Expand 10 before | Expand all | Expand 10 after
495 command.shortDescription = 'Sync locales with a Firefox extension' 499 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.' 500 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>' 501 command.params = '<firefox_addon_directory>'
498 command.supportedTypes = ('chrome') 502 command.supportedTypes = ('chrome')
499 503
500 with addCommand(updatePSL, 'updatepsl') as command: 504 with addCommand(updatePSL, 'updatepsl') as command:
501 command.shortDescription = 'Updates Public Suffix List' 505 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.' 506 command.description = 'Downloads Public Suffix List (see http://publicsuffix.o rg/) and generates lib/publicSuffixList.js from it.'
503 command.supportedTypes = ('chrome') 507 command.supportedTypes = ('chrome')
504 508
505 def processArgs(baseDir, args, type='gecko'): 509 def getType(baseDir, scriptName, args):
510 # Look for an explicit type parameter (has to be the first parameter)
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
512 type = args[1]
513 del args[1]
514 del args[0]
515 if type not in knownTypes:
516 print '''
517 Unknown type %s specified, supported types are: %s
518 ''' % (type, ', '.join(knownTypes))
519 return None
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 %s -t %s build
534 ''' % (scriptName, 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, 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:
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)
OLDNEW
« no previous file with comments | « no previous file | packager.py » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld