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")
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')
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)
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)
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")