Example #1
0
 def test_dest(self):
     dest = Dest(self.tmppath("dest"))
     self.assertFalse(dest.exists())
     dest.write(b"foo")
     self.assertTrue(dest.exists())
     dest.write(b"foo")
     self.assertEqual(dest.read(4), b"foof")
     self.assertEqual(dest.read(), b"oo")
     self.assertEqual(dest.read(), b"")
     dest.write(b"bar")
     self.assertEqual(dest.read(4), b"bar")
     dest.close()
     self.assertEqual(dest.read(), b"bar")
     dest.write(b"foo")
     dest.close()
     dest.write(b"qux")
     self.assertEqual(dest.read(), b"qux")
Example #2
0
 def test_dest(self):
     dest = Dest(self.tmppath('dest'))
     self.assertFalse(dest.exists())
     dest.write('foo')
     self.assertTrue(dest.exists())
     dest.write('foo')
     self.assertEqual(dest.read(4), 'foof')
     self.assertEqual(dest.read(), 'oo')
     self.assertEqual(dest.read(), '')
     dest.write('bar')
     self.assertEqual(dest.read(4), 'bar')
     dest.close()
     self.assertEqual(dest.read(), 'bar')
     dest.write('foo')
     dest.close()
     dest.write('qux')
     self.assertEqual(dest.read(), 'qux')
Example #3
0
    def copy(self, dest, skip_if_older=True):
        '''
        Pack all registered files in the given destination jar. The given
        destination jar may be a path to jar file, or a Dest instance for
        a jar file.
        If the destination jar file exists, its (compressed) contents are used
        instead of the registered BaseFile instances when appropriate.
        '''
        class DeflaterDest(Dest):
            '''
            Dest-like class, reading from a file-like object initially, but
            switching to a Deflater object if written to.

                dest = DeflaterDest(original_file)
                dest.read()      # Reads original_file
                dest.write(data) # Creates a Deflater and write data there
                dest.read()      # Re-opens the Deflater and reads from it
            '''
            def __init__(self, orig=None, compress=True):
                self.mode = None
                self.deflater = orig
                self.compress = compress

            def read(self, length=-1):
                if self.mode != 'r':
                    assert self.mode is None
                    self.mode = 'r'
                return self.deflater.read(length)

            def write(self, data):
                if self.mode != 'w':
                    from mozpack.mozjar import Deflater
                    self.deflater = Deflater(self.compress)
                    self.mode = 'w'
                self.deflater.write(data)

            def exists(self):
                return self.deflater is not None

        if isinstance(dest, basestring):
            dest = Dest(dest)
        assert isinstance(dest, Dest)

        from mozpack.mozjar import JarWriter, JarReader
        try:
            old_jar = JarReader(fileobj=dest)
        except Exception:
            old_jar = []

        old_contents = dict([(f.filename, f) for f in old_jar])

        with JarWriter(fileobj=dest,
                       compress=self.compress,
                       optimize=self.optimize) as jar:
            for path, file in self:
                compress = self._compress_options.get(path, self.compress)

                if path in old_contents:
                    deflater = DeflaterDest(old_contents[path], compress)
                else:
                    deflater = DeflaterDest(compress=compress)
                file.copy(deflater, skip_if_older)
                jar.add(path,
                        deflater.deflater,
                        mode=file.mode,
                        compress=compress)
            if self._preload:
                jar.preload(self._preload)
Example #4
0
 def test_dest(self):
     dest = Dest(self.tmppath('dest'))
     self.assertFalse(dest.exists())
     dest.write('foo')
     self.assertTrue(dest.exists())
     dest.write('foo')
     self.assertEqual(dest.read(4), 'foof')
     self.assertEqual(dest.read(), 'oo')
     self.assertEqual(dest.read(), '')
     dest.write('bar')
     self.assertEqual(dest.read(4), 'bar')
     dest.close()
     self.assertEqual(dest.read(), 'bar')
     dest.write('foo')
     dest.close()
     dest.write('qux')
     self.assertEqual(dest.read(), 'qux')
Example #5
0
    def copy(self, dest, skip_if_older=True):
        '''
        Pack all registered files in the given destination jar. The given
        destination jar may be a path to jar file, or a Dest instance for
        a jar file.
        If the destination jar file exists, its (compressed) contents are used
        instead of the registered BaseFile instances when appropriate.
        '''
        class DeflaterDest(Dest):
            '''
            Dest-like class, reading from a file-like object initially, but
            switching to a Deflater object if written to.

                dest = DeflaterDest(original_file)
                dest.read()      # Reads original_file
                dest.write(data) # Creates a Deflater and write data there
                dest.read()      # Re-opens the Deflater and reads from it
            '''
            def __init__(self, orig=None, compress=True):
                self.mode = None
                self.deflater = orig
                self.compress = compress

            def read(self, length=-1):
                if self.mode != 'r':
                    assert self.mode is None
                    self.mode = 'r'
                return self.deflater.read(length)

            def write(self, data):
                if self.mode != 'w':
                    from mozpack.mozjar import Deflater
                    self.deflater = Deflater(self.compress)
                    self.mode = 'w'
                self.deflater.write(data)

            def exists(self):
                return self.deflater is not None

        if isinstance(dest, basestring):
            dest = Dest(dest)
        assert isinstance(dest, Dest)

        from mozpack.mozjar import JarWriter, JarReader, JAR_BROTLI
        try:
            old_jar = JarReader(fileobj=dest)
        except Exception:
            old_jar = []

        old_contents = dict([(f.filename, f) for f in old_jar])

        with JarWriter(fileobj=dest, compress=self.compress) as jar:
            for path, file in self:
                compress = self._compress_options.get(path, self.compress)
                # Temporary: Because l10n repacks can't handle brotli just yet,
                # but need to be able to decompress those files, per
                # UnpackFinder and formatters, we force deflate on them.
                if compress == JAR_BROTLI and (isinstance(file, ManifestFile)
                                               or mozpath.basename(path)
                                               == 'install.rdf'):
                    compress = True

                # If the added content already comes from a jar file, we just add
                # the raw data from the original jar file to the new one.
                if isinstance(file, DeflatedFile):
                    jar.add(path,
                            file.file,
                            mode=file.mode,
                            compress=file.file.compress)
                    continue
                # If the file is already in the old contents for this jar,
                # we avoid compressing when the contents match, which requires
                # decompressing the old content. But for e.g. l10n repacks,
                # which can't decompress brotli, we skip this.
                elif path in old_contents and old_contents[
                        path].compress != JAR_BROTLI:
                    deflater = DeflaterDest(old_contents[path], compress)
                else:
                    deflater = DeflaterDest(compress=compress)
                file.copy(deflater, skip_if_older)
                jar.add(path,
                        deflater.deflater,
                        mode=file.mode,
                        compress=compress)
            if self._preload:
                jar.preload(self._preload)
Example #6
0
 def test_dest(self):
     dest = Dest(self.tmppath("dest"))
     self.assertFalse(dest.exists())
     dest.write("foo")
     self.assertTrue(dest.exists())
     dest.write("foo")
     self.assertEqual(dest.read(4), "foof")
     self.assertEqual(dest.read(), "oo")
     self.assertEqual(dest.read(), "")
     dest.write("bar")
     self.assertEqual(dest.read(4), "bar")
     dest.close()
     self.assertEqual(dest.read(), "bar")
     dest.write("foo")
     dest.close()
     dest.write("qux")
     self.assertEqual(dest.read(), "qux")