| Index: packagerChrome.py |
| =================================================================== |
| --- a/packagerChrome.py |
| +++ b/packagerChrome.py |
| @@ -12,34 +12,35 @@ |
| # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| # GNU General Public License for more details. |
| # |
| # You should have received a copy of the GNU General Public License |
| # along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>. |
| import sys, os, re, json, struct |
| from StringIO import StringIO |
| -from zipfile import ZipFile, ZIP_DEFLATED |
| -from packager import getDefaultFileName, readMetadata, getBuildVersion, getTemplate |
| +from packager import getDefaultFileName, readMetadata, getBuildVersion, getTemplate, Files |
| defaultLocale = 'en_US' |
| def getIgnoredFiles(params): |
| - return ['store.description'] |
| + return set(('store.description',)) |
| def getPackageFiles(params): |
| + result = set(('_locales', 'icons', 'jquery-ui', 'lib', 'skin', 'ui',)) |
| + |
| + if params['devenv']: |
| + result.add('qunit') |
| + |
| baseDir = params['baseDir'] |
| - for file in ('_locales', 'icons', 'jquery-ui', 'lib', 'skin', 'ui'): |
| - yield os.path.join(baseDir, file) |
| - if params['devenv']: |
| - yield os.path.join(baseDir, 'qunit') |
| for file in os.listdir(baseDir): |
| if file.endswith('.js') or file.endswith('.html') or file.endswith('.xml'): |
| - yield os.path.join(baseDir, file) |
| + result.add(file) |
| + return result |
| def createManifest(params): |
| template = getTemplate('manifest.json.tmpl') |
| templateData = dict(params) |
| baseDir = templateData['baseDir'] |
| metadata = templateData['metadata'] |
| @@ -97,63 +98,37 @@ def createManifest(params): |
| manifest = json.dumps(data, sort_keys=True, indent=2) |
| return manifest.encode('utf-8') |
| def createPoller(params): |
| template = getTemplate('chromeDevenvPoller__.js.tmpl') |
| return template.render(params).encode('utf-8'); |
| -def readFile(params, files, path): |
| - ignoredFiles = getIgnoredFiles(params) |
| - if os.path.isdir(path): |
| - for file in os.listdir(path): |
| - if file in ignoredFiles: |
| - continue |
| - readFile(params, files, os.path.join(path, file)) |
| - else: |
| - file = open(path, 'rb') |
| - data = file.read() |
| - file.close() |
| - |
| - name = os.path.relpath(path, params['baseDir']).replace('\\', '/') |
| - files[name] = data |
| - |
| def convertJS(params, files): |
| from jshydra.abp_rewrite import doRewrite |
| baseDir = params['baseDir'] |
| for file, sources in params['metadata'].items('convert_js'): |
| - dirsep = file.find('/') |
| - if dirsep >= 0: |
| - # Not a top-level file, make sure it is inside an included directory |
| - dirname = file[0:dirsep] |
| - if os.path.join(baseDir, dirname) not in getPackageFiles(params): |
| - continue |
| + # Make sure the file is inside an included directory |
| + if '/' in file and not files.isIncluded(file): |
| + continue |
| sourceFiles = re.split(r'\s+', sources) |
| args = [] |
| try: |
| argsStart = sourceFiles.index('--arg') |
| args = sourceFiles[argsStart + 1:] |
| sourceFiles = sourceFiles[0:argsStart] |
| except ValueError: |
| pass |
| sourceFiles = map(lambda f: os.path.abspath(os.path.join(baseDir, f)), sourceFiles) |
| files[file] = doRewrite(sourceFiles, args) |
| -def packFiles(files): |
| - buffer = StringIO() |
| - zip = ZipFile(buffer, 'w', ZIP_DEFLATED) |
| - for file, data in files.iteritems(): |
| - zip.writestr(file, data) |
| - zip.close() |
| - return buffer.getvalue() |
| - |
| def signBinary(zipdata, keyFile): |
| import M2Crypto |
| if not os.path.exists(keyFile): |
| M2Crypto.RSA.gen_key(1024, 65537, callback=lambda x: None).save_key(keyFile, cipher=None) |
| key = M2Crypto.EVP.load_key(keyFile) |
| key.sign_init() |
| key.sign_update(zipdata) |
| return key.final() |
| @@ -184,39 +159,39 @@ def createBuild(baseDir, outFile=None, b |
| 'baseDir': baseDir, |
| 'releaseBuild': releaseBuild, |
| 'version': version, |
| 'experimentalAPI': experimentalAPI, |
| 'devenv': devenv, |
| 'metadata': metadata, |
| } |
| - files = {} |
| + files = Files(getPackageFiles(params), getIgnoredFiles(params)) |
| files['manifest.json'] = createManifest(params) |
| - for path in getPackageFiles(params): |
| - if os.path.exists(path): |
| - readFile(params, files, path) |
| + files.read(baseDir) |
| if metadata.has_section('convert_js'): |
| convertJS(params, files) |
| if devenv: |
| files['devenvPoller__.js'] = createPoller(params) |
| - zipdata = packFiles(files) |
| + zipdata = files.zipToString() |
| signature = None |
| pubkey = None |
| if keyFile != None: |
| signature = signBinary(zipdata, keyFile) |
| pubkey = getPublicKey(keyFile) |
| writePackage(outFile, pubkey, signature, zipdata) |
| def createDevEnv(baseDir): |
| fileBuffer = StringIO() |
| createBuild(baseDir, outFile=fileBuffer, devenv=True, releaseBuild=True) |
| + |
| + from zipfile import ZipFile |
| zip = ZipFile(StringIO(fileBuffer.getvalue()), 'r') |
| zip.extractall(os.path.join(baseDir, 'devenv')) |
| zip.close() |
| print 'Development environment created, waiting for connections from active extensions...' |
| metadata = readMetadata(baseDir) |
| connections = [0] |