def test_tarfile(contents=[], **kwargs): """Create a tarfile with the given contents, then re-open it for reading. This context manager creates a tarfile with the given contents, then reopens it for reading and yields it for use in a with block. When the block ends the tarfile will be closed. The contents can be specified as a list of tuples of (path, contents), where if the path ends with '/' it is considered to be a directory and the contents ignored. :param contents: the contents to put in the tarball, defaults to the empty list. :type contents: a list of tuples of (str, str) :param kwargs: keyword arguments for the better_tarfile.TarFile constructor. """ backing_file = StringIO() with writeable_tarfile(backing_file, **kwargs) as tf: for path, content in contents: if path[-1] == "/": tf.create_dir(path) else: tf.create_file_from_string(path, content) if contents: backing_file.seek(0) tf = tarfile.TarFile.open(mode="r", fileobj=backing_file) try: yield tf finally: tf.close()
def create_simple_tarball(self, contents, **kwargs): backing_file = StringIO() with writeable_tarfile(backing_file, **kwargs) as tf: for path, content in contents: if path[-1] == '/': tf.create_dir(path) else: tf.create_file_from_string(path, content) return backing_file
def to_file(self, fileobj): """Write the hwpack to a file object. The full hardware pack will be written to the file object in gzip compressed tarball form as the spec requires. :param fileobj: the file object to write to. :type fileobj: a file-like object :return: None """ kwargs = {} kwargs["default_uid"] = 1000 kwargs["default_gid"] = 1000 kwargs["default_uname"] = "user" kwargs["default_gname"] = "group" kwargs["default_mtime"] = time.time() with writeable_tarfile(fileobj, mode="w:gz", **kwargs) as tf: tf.create_file_from_string( self.FORMAT_FILENAME, "%s\n" % self.format) tf.create_file_from_string( self.METADATA_FILENAME, str(self.metadata)) for fs_file_name, arc_file_name in self.files: tf.add(fs_file_name, arcname=arc_file_name) tf.create_dir(self.PACKAGES_DIRNAME) for package in self.packages: if package.content is not None: tf.create_file_from_string( self.PACKAGES_DIRNAME + "/" + package.filename, package.content.read()) tf.create_file_from_string( self.MANIFEST_FILENAME, self.manifest_text()) tf.create_file_from_string( self.PACKAGES_FILENAME, get_packages_file( [p for p in self.packages if p.content is not None])) tf.create_dir(self.SOURCES_LIST_DIRNAME) for source_name, source_info in self.sources.items(): url_parsed = urlparse.urlsplit(source_info) # Don't output sources with passwords in them if not url_parsed.password: tf.create_file_from_string( (self.SOURCES_LIST_DIRNAME + "/" + source_name + ".list"), "deb " + source_info + "\n") # TODO: include sources keys etc. tf.create_dir(self.SOURCES_LIST_GPG_DIRNAME)
def test_creates_empty_tarfile(self): backing_file = StringIO() with writeable_tarfile(backing_file): pass with standard_tarfile(backing_file, seek=False) as tf: self.assertEqual([], tf.getnames())