| OLD | NEW |
| 1 # coding: utf-8 | 1 # coding: utf-8 |
| 2 | 2 |
| 3 # This Source Code Form is subject to the terms of the Mozilla Public | 3 # This Source Code Form is subject to the terms of the Mozilla Public |
| 4 # License, v. 2.0. If a copy of the MPL was not distributed with this | 4 # License, v. 2.0. If a copy of the MPL was not distributed with this |
| 5 # file, You can obtain one at http://mozilla.org/MPL/2.0/. | 5 # file, You can obtain one at http://mozilla.org/MPL/2.0/. |
| 6 | 6 |
| 7 import os, sys, re, hashlib, base64, urllib, json | 7 import os |
| 8 import sys |
| 9 import re |
| 10 import hashlib |
| 11 import base64 |
| 12 import urllib |
| 13 import json |
| 14 import io |
| 8 from ConfigParser import SafeConfigParser | 15 from ConfigParser import SafeConfigParser |
| 9 from StringIO import StringIO | 16 from StringIO import StringIO |
| 10 import xml.dom.minidom as minidom | 17 import xml.dom.minidom as minidom |
| 11 import buildtools.localeTools as localeTools | 18 import buildtools.localeTools as localeTools |
| 12 | 19 |
| 13 import packager | 20 import packager |
| 14 from packager import readMetadata, getMetadataPath, getDefaultFileName, getBuild
Version, getTemplate, Files | 21 from packager import readMetadata, getMetadataPath, getDefaultFileName, getBuild
Version, getTemplate, Files |
| 15 | 22 |
| 16 KNOWN_APPS = { | 23 KNOWN_APPS = { |
| 17 'conkeror': '{a79fe89b-6662-4ff4-8e88-09950ad4dfde}', | 24 'conkeror': '{a79fe89b-6662-4ff4-8e88-09950ad4dfde}', |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 49 | 56 |
| 50 baseDir = params['baseDir'] | 57 baseDir = params['baseDir'] |
| 51 for file in os.listdir(baseDir): | 58 for file in os.listdir(baseDir): |
| 52 if file.endswith('.js') or file.endswith('.xml'): | 59 if file.endswith('.js') or file.endswith('.xml'): |
| 53 result.add(file) | 60 result.add(file) |
| 54 return result | 61 return result |
| 55 | 62 |
| 56 def getIgnoredFiles(params): | 63 def getIgnoredFiles(params): |
| 57 return {'.incomplete', 'meta.properties'} | 64 return {'.incomplete', 'meta.properties'} |
| 58 | 65 |
| 66 def archive_path(path, baseDir): |
| 67 return '/'.join(os.path.split(os.path.relpath(path, baseDir))) |
| 68 |
| 59 def isValidLocale(localesDir, dir, includeIncomplete=False): | 69 def isValidLocale(localesDir, dir, includeIncomplete=False): |
| 60 if re.search(r'[^\w\-]', dir): | 70 if re.search(r'[^\w\-]', dir): |
| 61 return False | 71 return False |
| 62 curLocaleDir = os.path.join(localesDir, dir) | 72 curLocaleDir = os.path.join(localesDir, dir) |
| 63 if not os.path.isdir(curLocaleDir): | 73 if not os.path.isdir(curLocaleDir): |
| 64 return False | 74 return False |
| 65 if len(os.listdir(curLocaleDir)) == 0: | 75 if len(os.listdir(curLocaleDir)) == 0: |
| 66 return False | 76 return False |
| 67 if not includeIncomplete and os.path.exists(os.path.join(localesDir, dir, '.in
complete')): | 77 if not includeIncomplete and os.path.exists(os.path.join(localesDir, dir, '.in
complete')): |
| 68 return False | 78 return False |
| (...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 136 def createManifest(params): | 146 def createManifest(params): |
| 137 global KNOWN_APPS, defaultLocale | 147 global KNOWN_APPS, defaultLocale |
| 138 template = getTemplate('install.rdf.tmpl', autoEscape=True) | 148 template = getTemplate('install.rdf.tmpl', autoEscape=True) |
| 139 templateData = dict(params) | 149 templateData = dict(params) |
| 140 templateData['localeMetadata'] = readLocaleMetadata(params['baseDir'], params[
'locales']) | 150 templateData['localeMetadata'] = readLocaleMetadata(params['baseDir'], params[
'locales']) |
| 141 initTranslators(templateData['localeMetadata']) | 151 initTranslators(templateData['localeMetadata']) |
| 142 templateData['KNOWN_APPS'] = KNOWN_APPS | 152 templateData['KNOWN_APPS'] = KNOWN_APPS |
| 143 templateData['defaultLocale'] = defaultLocale | 153 templateData['defaultLocale'] = defaultLocale |
| 144 return template.render(templateData).encode('utf-8') | 154 return template.render(templateData).encode('utf-8') |
| 145 | 155 |
| 156 def importLocales(params, files): |
| 157 SECTION = 'import_locales' |
| 158 if not params['metadata'].has_section(SECTION): |
| 159 return |
| 160 |
| 161 import localeTools |
| 162 |
| 163 for locale in params['locales']: |
| 164 for item in params['metadata'].items(SECTION): |
| 165 path, keys = item |
| 166 parts = [locale if p == '*' else p for p in path.split('/')] |
| 167 source = os.path.join(os.path.dirname(item.source), *parts) |
| 168 if not os.path.exists(source): |
| 169 continue |
| 170 |
| 171 with io.open(source, 'r', encoding='utf-8') as handle: |
| 172 data = json.load(handle) |
| 173 |
| 174 target_name = os.path.splitext(os.path.basename(source))[0] + '.properties
' |
| 175 target = archive_path(os.path.join(getLocalesDir(params['baseDir']), local
e, target_name), params['baseDir']) |
| 176 |
| 177 files[target] = '' |
| 178 for key, value in sorted(data.items()): |
| 179 message = value['message'] |
| 180 files[target] += localeTools.generateStringEntry(key, message, target).e
ncode('utf-8') |
| 181 |
| 146 def fixupLocales(params, files): | 182 def fixupLocales(params, files): |
| 147 global defaultLocale | 183 global defaultLocale |
| 148 | 184 |
| 149 # Read in default locale data, it might not be included in files | 185 # Read in default locale data, it might not be included in package files |
| 150 defaultLocaleDir = os.path.join(getLocalesDir(params['baseDir']), defaultLocal
e) | 186 defaultLocaleDir = os.path.join(getLocalesDir(params['baseDir']), defaultLocal
e) |
| 187 reference_files = Files(getPackageFiles(params), getIgnoredFiles(params)) |
| 188 reference_files.read(defaultLocaleDir, archive_path(defaultLocaleDir, params['
baseDir'])) |
| 189 reference_params = dict(params) |
| 190 reference_params['locales'] = [defaultLocale] |
| 191 importLocales(reference_params, reference_files) |
| 192 |
| 151 reference = {} | 193 reference = {} |
| 152 ignoredFiles = getIgnoredFiles(params) | 194 for path, data in reference_files.iteritems(): |
| 153 for file in os.listdir(defaultLocaleDir): | 195 filename = path.split('/')[-1] |
| 154 path = os.path.join(defaultLocaleDir, file) | 196 data = localeTools.parseString(data.decode('utf-8'), filename) |
| 155 if file in ignoredFiles or not os.path.isfile(path): | |
| 156 continue | |
| 157 data = localeTools.readFile(path) | |
| 158 if data: | 197 if data: |
| 159 reference[file] = data | 198 reference[filename] = data |
| 160 | 199 |
| 161 for locale in params['locales']: | 200 for locale in params['locales']: |
| 162 for file in reference.iterkeys(): | 201 for file in reference.iterkeys(): |
| 163 path = 'chrome/locale/%s/%s' % (locale, file) | 202 path = 'chrome/locale/%s/%s' % (locale, file) |
| 164 if path in files: | 203 if path in files: |
| 165 data = localeTools.parseString(files[path].decode('utf-8'), path) | 204 data = localeTools.parseString(files[path].decode('utf-8'), path) |
| 166 for key, value in reference[file].iteritems(): | 205 for key, value in reference[file].iteritems(): |
| 167 if not key in data: | 206 if not key in data: |
| 168 files[path] += localeTools.generateStringEntry(key, value, path).enc
ode('utf-8') | 207 files[path] += localeTools.generateStringEntry(key, value, path).enc
ode('utf-8') |
| 169 else: | 208 else: |
| (...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 301 | 340 |
| 302 files = Files(getPackageFiles(params), getIgnoredFiles(params), | 341 files = Files(getPackageFiles(params), getIgnoredFiles(params), |
| 303 process=lambda path, data: processFile(path, data, params)) | 342 process=lambda path, data: processFile(path, data, params)) |
| 304 files['install.rdf'] = createManifest(params) | 343 files['install.rdf'] = createManifest(params) |
| 305 if metadata.has_section('mapping'): | 344 if metadata.has_section('mapping'): |
| 306 files.readMappedFiles(metadata.items('mapping')) | 345 files.readMappedFiles(metadata.items('mapping')) |
| 307 files.read(baseDir, skip=('chrome')) | 346 files.read(baseDir, skip=('chrome')) |
| 308 for name, path in getChromeSubdirs(baseDir, params['locales']).iteritems(): | 347 for name, path in getChromeSubdirs(baseDir, params['locales']).iteritems(): |
| 309 if os.path.isdir(path): | 348 if os.path.isdir(path): |
| 310 files.read(path, 'chrome/%s' % name) | 349 files.read(path, 'chrome/%s' % name) |
| 350 importLocales(params, files) |
| 311 fixupLocales(params, files) | 351 fixupLocales(params, files) |
| 312 if not 'bootstrap.js' in files: | 352 if not 'bootstrap.js' in files: |
| 313 addMissingFiles(params, files) | 353 addMissingFiles(params, files) |
| 314 if metadata.has_section('preprocess'): | 354 if metadata.has_section('preprocess'): |
| 315 files.preprocess([f for f, _ in metadata.items('preprocess')]) | 355 files.preprocess([f for f, _ in metadata.items('preprocess')]) |
| 316 if keyFile: | 356 if keyFile: |
| 317 signFiles(files, keyFile) | 357 signFiles(files, keyFile) |
| 318 files.zip(outFile, sortKey=lambda x: '!' if x == 'META-INF/zigbert.rsa' else x
) | 358 files.zip(outFile, sortKey=lambda x: '!' if x == 'META-INF/zigbert.rsa' else x
) |
| 319 | 359 |
| 320 def autoInstall(baseDir, type, host, port, multicompartment=False): | 360 def autoInstall(baseDir, type, host, port, multicompartment=False): |
| 321 fileBuffer = StringIO() | 361 fileBuffer = StringIO() |
| 322 createBuild(baseDir, type=type, outFile=fileBuffer, multicompartment=multicomp
artment) | 362 createBuild(baseDir, type=type, outFile=fileBuffer, multicompartment=multicomp
artment) |
| 323 urllib.urlopen('http://%s:%s/' % (host, port), data=fileBuffer.getvalue()) | 363 urllib.urlopen('http://%s:%s/' % (host, port), data=fileBuffer.getvalue()) |
| OLD | NEW |