Index: packagerGecko.py |
=================================================================== |
--- a/packagerGecko.py |
+++ b/packagerGecko.py |
@@ -1,15 +1,22 @@ |
# coding: utf-8 |
# This Source Code Form is subject to the terms of the Mozilla Public |
# License, v. 2.0. If a copy of the MPL was not distributed with this |
# file, You can obtain one at http://mozilla.org/MPL/2.0/. |
-import os, sys, re, hashlib, base64, urllib, json |
+import os |
+import sys |
+import re |
+import hashlib |
+import base64 |
+import urllib |
+import json |
+import io |
from ConfigParser import SafeConfigParser |
from StringIO import StringIO |
import xml.dom.minidom as minidom |
import buildtools.localeTools as localeTools |
import packager |
from packager import readMetadata, getMetadataPath, getDefaultFileName, getBuildVersion, getTemplate, Files |
@@ -51,16 +58,19 @@ def getPackageFiles(params): |
for file in os.listdir(baseDir): |
if file.endswith('.js') or file.endswith('.xml'): |
result.add(file) |
return result |
def getIgnoredFiles(params): |
return {'.incomplete', 'meta.properties'} |
+def archive_path(path, baseDir): |
+ return '/'.join(os.path.relpath(path, baseDir).split(os.sep)) |
Sebastian Noack
2014/12/17 08:18:12
Nit: x.split(os.sep) -> os.path.split(x)
Wladimir Palant
2014/12/17 13:26:04
Done.
|
+ |
def isValidLocale(localesDir, dir, includeIncomplete=False): |
if re.search(r'[^\w\-]', dir): |
return False |
curLocaleDir = os.path.join(localesDir, dir) |
if not os.path.isdir(curLocaleDir): |
return False |
if len(os.listdir(curLocaleDir)) == 0: |
return False |
@@ -138,30 +148,59 @@ def createManifest(params): |
template = getTemplate('install.rdf.tmpl', autoEscape=True) |
templateData = dict(params) |
templateData['localeMetadata'] = readLocaleMetadata(params['baseDir'], params['locales']) |
initTranslators(templateData['localeMetadata']) |
templateData['KNOWN_APPS'] = KNOWN_APPS |
templateData['defaultLocale'] = defaultLocale |
return template.render(templateData).encode('utf-8') |
+def importLocales(params, files): |
+ SECTION = 'import_locales' |
+ if not params['metadata'].has_section(SECTION): |
+ return |
+ |
+ import localeTools |
+ |
+ for locale in params['locales']: |
+ for item in params['metadata'].items(SECTION): |
+ path, keys = item |
+ parts = [locale if p == '*' else p for p in path.split('/')] |
+ source = os.path.join(os.path.dirname(item.source), *parts) |
+ if not os.path.exists(source): |
Sebastian Noack
2014/12/17 08:18:12
Nit: I'd prefer to catch the IOError when openenin
Wladimir Palant
2014/12/17 13:26:04
Sure, but that's not a scenario where race conditi
Sebastian Noack
2014/12/17 13:59:07
Theoretically, the contents of the file system can
|
+ continue |
+ |
+ with io.open(source, 'r', encoding='utf-8') as handle: |
+ data = json.load(handle) |
+ |
+ target_name = os.path.splitext(os.path.basename(source))[0] + '.properties' |
+ target = archive_path(os.path.join(getLocalesDir(params['baseDir']), locale, target_name), params['baseDir']) |
+ |
+ files[target] = '' |
+ for key, value in sorted(data.items()): |
+ message = value['message'] |
+ files[target] += localeTools.generateStringEntry(key, message, target).encode('utf-8') |
+ |
def fixupLocales(params, files): |
global defaultLocale |
- # Read in default locale data, it might not be included in files |
+ # Read in default locale data, it might not be included in package files |
defaultLocaleDir = os.path.join(getLocalesDir(params['baseDir']), defaultLocale) |
+ reference_files = Files(getPackageFiles(params), getIgnoredFiles(params)) |
+ reference_files.read(defaultLocaleDir, archive_path(defaultLocaleDir, params['baseDir'])) |
+ reference_params = dict(params) |
+ reference_params['locales'] = [defaultLocale] |
+ importLocales(reference_params, reference_files) |
+ |
reference = {} |
- ignoredFiles = getIgnoredFiles(params) |
- for file in os.listdir(defaultLocaleDir): |
- path = os.path.join(defaultLocaleDir, file) |
- if file in ignoredFiles or not os.path.isfile(path): |
- continue |
- data = localeTools.readFile(path) |
+ for path, data in reference_files.iteritems(): |
+ filename = path.split('/')[-1] |
+ data = localeTools.parseString(data.decode('utf-8'), filename) |
if data: |
- reference[file] = data |
+ reference[filename] = data |
for locale in params['locales']: |
for file in reference.iterkeys(): |
path = 'chrome/locale/%s/%s' % (locale, file) |
if path in files: |
data = localeTools.parseString(files[path].decode('utf-8'), path) |
for key, value in reference[file].iteritems(): |
if not key in data: |
@@ -303,16 +342,17 @@ def createBuild(baseDir, type="gecko", o |
process=lambda path, data: processFile(path, data, params)) |
files['install.rdf'] = createManifest(params) |
if metadata.has_section('mapping'): |
files.readMappedFiles(metadata.items('mapping')) |
files.read(baseDir, skip=('chrome')) |
for name, path in getChromeSubdirs(baseDir, params['locales']).iteritems(): |
if os.path.isdir(path): |
files.read(path, 'chrome/%s' % name) |
+ importLocales(params, files) |
fixupLocales(params, files) |
if not 'bootstrap.js' in files: |
addMissingFiles(params, files) |
if metadata.has_section('preprocess'): |
files.preprocess([f for f, _ in metadata.items('preprocess')]) |
if keyFile: |
signFiles(files, keyFile) |
files.zip(outFile, sortKey=lambda x: '!' if x == 'META-INF/zigbert.rsa' else x) |