| Index: packager.py | 
| =================================================================== | 
| --- a/packager.py | 
| +++ b/packager.py | 
| @@ -3,17 +3,16 @@ | 
| # file, You can obtain one at http://mozilla.org/MPL/2.0/. | 
|  | 
| # Note: These are the base functions common to all packagers, the actual | 
| # packagers are implemented in packagerGecko and packagerChrome. | 
|  | 
| import sys | 
| import os | 
| import re | 
| -import codecs | 
| import subprocess | 
| import json | 
| import zipfile | 
| from StringIO import StringIO | 
| from chainedconfigparser import ChainedConfigParser | 
|  | 
| import buildtools | 
|  | 
| @@ -65,21 +64,22 @@ | 
| version += '.0' | 
| version += '.' + buildNum | 
| return version | 
|  | 
|  | 
| def getTemplate(template, autoEscape=False): | 
| import jinja2 | 
|  | 
| -    templatePath = buildtools.__path__[0] | 
| +    template_path = os.path.join(buildtools.__path__[0], 'templates') | 
| +    loader = jinja2.FileSystemLoader(template_path) | 
| if autoEscape: | 
| -        env = jinja2.Environment(loader=jinja2.FileSystemLoader(templatePath), autoescape=True) | 
| +        env = jinja2.Environment(loader=loader, autoescape=True) | 
| else: | 
| -        env = jinja2.Environment(loader=jinja2.FileSystemLoader(templatePath)) | 
| +        env = jinja2.Environment(loader=loader) | 
| env.filters.update({'json': json.dumps}) | 
| return env.get_template(template) | 
|  | 
|  | 
| class Files(dict): | 
| def __init__(self, includedFiles, ignoredFiles, process=None): | 
| self.includedFiles = includedFiles | 
| self.ignoredFiles = ignoredFiles | 
| @@ -129,20 +129,17 @@ | 
| import jinja2 | 
| env = jinja2.Environment() | 
|  | 
| for filename in filenames: | 
| env.autoescape = os.path.splitext(filename)[1].lower() in ('.html', '.xml') | 
| template = env.from_string(self[filename].decode('utf-8')) | 
| self[filename] = template.render(params).encode('utf-8') | 
|  | 
| -    def zip(self, outFile, sortKey=None): | 
| -        zip = zipfile.ZipFile(outFile, 'w', zipfile.ZIP_DEFLATED) | 
| -        names = self.keys() | 
| -        names.sort(key=sortKey) | 
| -        for name in names: | 
| -            zip.writestr(name, self[name]) | 
| -        zip.close() | 
| +    def zip(self, outFile, sortKey=None, compression=zipfile.ZIP_DEFLATED): | 
| +        with zipfile.ZipFile(outFile, 'w', compression) as zf: | 
| +            for name in sorted(self, key=sortKey): | 
| +                zf.writestr(name, self[name]) | 
|  | 
| def zipToString(self, sortKey=None): | 
| buffer = StringIO() | 
| self.zip(buffer, sortKey=sortKey) | 
| return buffer.getvalue() | 
|  |