| 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-2014 Eyeo GmbH | 4 # Copyright (C) 2006-2014 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 270 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 281 'pt': 'pt_PT', | 281 'pt': 'pt_PT', |
| 282 } | 282 } |
| 283 for chromeLocale, operaLocale in operaMapping.iteritems(): | 283 for chromeLocale, operaLocale in operaMapping.iteritems(): |
| 284 chromeFile = '_locales/%s/messages.json' % chromeLocale | 284 chromeFile = '_locales/%s/messages.json' % chromeLocale |
| 285 operaFile = '_locales/%s/messages.json' % operaLocale if operaLocale != No ne else None | 285 operaFile = '_locales/%s/messages.json' % operaLocale if operaLocale != No ne else None |
| 286 if chromeFile in files: | 286 if chromeFile in files: |
| 287 if operaFile != None: | 287 if operaFile != None: |
| 288 files[operaFile] = files[chromeFile] | 288 files[operaFile] = files[chromeFile] |
| 289 del files[chromeFile] | 289 del files[chromeFile] |
| 290 | 290 |
| 291 def fixMissingTranslations(files): | 291 def truncate(text, length_limit): |
| 292 # Chrome requires messages used in manifest.json to be given in all languages | 292 if len(text) <= length_limit: |
| 293 return text | |
| 294 return text[:length_limit - 1].rstrip() + u"\u2026" | |
|
Sebastian Noack
2014/09/03 18:53:37
I think we should at least generate a warning when
Wladimir Palant
2014/09/03 19:05:22
I considered doing that. However, the main effect
Sebastian Noack
2014/09/03 19:13:03
Perfect. Even better would be to have proper monit
Wladimir Palant
2014/09/03 21:21:31
Not at all. It should spam you because you are the
Sebastian Noack
2014/09/04 10:40:02
So I feel this is the wrong place to address that
Wladimir Palant
2014/09/04 13:27:03
That's what you did originally. But that means tha
Sebastian Noack
2014/09/04 13:29:55
I agree, but that isn't what I meant to suggest. g
Wladimir Palant
2014/09/04 13:47:43
Take care how exactly? Do you speak Telugu? I don'
Sebastian Noack
2014/09/04 14:00:58
In the worst case one can still decide to truncate
| |
| 295 | |
| 296 def fixTranslationsForCWS(files): | |
| 297 # Chrome Web Store requires messages used in manifest.json to be present in | |
| 298 # all languages. It also enforces length limits for extension names and | |
| 299 # descriptions. | |
| 293 defaults = {} | 300 defaults = {} |
| 294 data = json.loads(files['_locales/%s/messages.json' % defaultLocale]) | 301 data = json.loads(files['_locales/%s/messages.json' % defaultLocale]) |
| 295 for match in re.finditer(r'__MSG_(\S+)__', files['manifest.json']): | 302 for match in re.finditer(r'__MSG_(\S+)__', files['manifest.json']): |
| 296 name = match.group(1) | 303 name = match.group(1) |
| 297 defaults[name] = data[name] | 304 defaults[name] = data[name] |
| 298 | 305 |
| 306 limits = {} | |
| 307 manifest = json.loads(files['manifest.json']) | |
| 308 for key, limit in (('name', 45), ('description', 132), ('short_name', 12)): | |
| 309 match = re.search(r'__MSG_(\S+)__', manifest.get(key, "")) | |
| 310 if match: | |
| 311 limits[match.group(1)] = limit | |
| 312 | |
| 299 for filename in files: | 313 for filename in files: |
| 300 if not filename.startswith('_locales/') or not filename.endswith('/messages. json'): | 314 if not filename.startswith('_locales/') or not filename.endswith('/messages. json'): |
| 301 continue | 315 continue |
| 302 | 316 |
| 303 data = json.loads(files[filename]) | 317 data = json.loads(files[filename]) |
| 304 for name, info in defaults.iteritems(): | 318 for name, info in defaults.iteritems(): |
| 305 data.setdefault(name, info) | 319 data.setdefault(name, info) |
| 306 | 320 for name, limit in limits.iteritems(): |
| 321 if name in data: | |
| 322 data[name]['message'] = truncate(data[name]['message'], limit) | |
| 307 files[filename] = toJson(data) | 323 files[filename] = toJson(data) |
| 308 | 324 |
| 309 def signBinary(zipdata, keyFile): | 325 def signBinary(zipdata, keyFile): |
| 310 import M2Crypto | 326 import M2Crypto |
| 311 if not os.path.exists(keyFile): | 327 if not os.path.exists(keyFile): |
| 312 M2Crypto.RSA.gen_key(1024, 65537, callback=lambda x: None).save_key(keyFile, cipher=None) | 328 M2Crypto.RSA.gen_key(1024, 65537, callback=lambda x: None).save_key(keyFile, cipher=None) |
| 313 key = M2Crypto.EVP.load_key(keyFile) | 329 key = M2Crypto.EVP.load_key(keyFile) |
| 314 key.sign_init() | 330 key.sign_init() |
| 315 key.sign_update(zipdata) | 331 key.sign_update(zipdata) |
| 316 return key.final() | 332 return key.final() |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 364 if metadata.has_section('preprocess'): | 380 if metadata.has_section('preprocess'): |
| 365 files.preprocess( | 381 files.preprocess( |
| 366 [f for f, _ in metadata.items('preprocess')], | 382 [f for f, _ in metadata.items('preprocess')], |
| 367 {'needsExt': True} | 383 {'needsExt': True} |
| 368 ) | 384 ) |
| 369 | 385 |
| 370 if metadata.has_section('import_locales'): | 386 if metadata.has_section('import_locales'): |
| 371 importGeckoLocales(params, files) | 387 importGeckoLocales(params, files) |
| 372 | 388 |
| 373 files['manifest.json'] = createManifest(params, files) | 389 files['manifest.json'] = createManifest(params, files) |
| 374 fixMissingTranslations(files) | 390 if type == 'chrome': |
| 391 fixTranslationsForCWS(files) | |
| 375 | 392 |
| 376 if devenv: | 393 if devenv: |
| 377 import buildtools | 394 import buildtools |
| 378 import random | 395 import random |
| 379 files.read(os.path.join(buildtools.__path__[0], 'chromeDevenvPoller__.js'), relpath='devenvPoller__.js') | 396 files.read(os.path.join(buildtools.__path__[0], 'chromeDevenvPoller__.js'), relpath='devenvPoller__.js') |
| 380 files['devenvVersion__'] = str(random.random()) | 397 files['devenvVersion__'] = str(random.random()) |
| 381 | 398 |
| 382 if (metadata.has_option('general', 'backgroundScripts') and | 399 if (metadata.has_option('general', 'backgroundScripts') and |
| 383 'lib/info.js' in re.split(r'\s+', metadata.get('general', 'backgroundScrip ts')) and | 400 'lib/info.js' in re.split(r'\s+', metadata.get('general', 'backgroundScrip ts')) and |
| 384 'lib/info.js' not in files): | 401 'lib/info.js' not in files): |
| 385 files['lib/info.js'] = createInfoModule(params) | 402 files['lib/info.js'] = createInfoModule(params) |
| 386 | 403 |
| 387 zipdata = files.zipToString() | 404 zipdata = files.zipToString() |
| 388 signature = None | 405 signature = None |
| 389 pubkey = None | 406 pubkey = None |
| 390 if keyFile != None: | 407 if keyFile != None: |
| 391 signature = signBinary(zipdata, keyFile) | 408 signature = signBinary(zipdata, keyFile) |
| 392 pubkey = getPublicKey(keyFile) | 409 pubkey = getPublicKey(keyFile) |
| 393 writePackage(outFile, pubkey, signature, zipdata) | 410 writePackage(outFile, pubkey, signature, zipdata) |
| 394 | 411 |
| 395 def createDevEnv(baseDir, type): | 412 def createDevEnv(baseDir, type): |
| 396 fileBuffer = StringIO() | 413 fileBuffer = StringIO() |
| 397 createBuild(baseDir, type=type, outFile=fileBuffer, devenv=True, releaseBuild= True) | 414 createBuild(baseDir, type=type, outFile=fileBuffer, devenv=True, releaseBuild= True) |
| 398 | 415 |
| 399 from zipfile import ZipFile | 416 from zipfile import ZipFile |
| 400 zip = ZipFile(StringIO(fileBuffer.getvalue()), 'r') | 417 zip = ZipFile(StringIO(fileBuffer.getvalue()), 'r') |
| 401 zip.extractall(os.path.join(baseDir, 'devenv')) | 418 zip.extractall(os.path.join(baseDir, 'devenv')) |
| 402 zip.close() | 419 zip.close() |
| OLD | NEW |