def create(self, path, mails, compression='xz', server=None): path = Path.cwd() / path with TemporaryDirectory(prefix="mailarchive-") as tmpdir: with tmp_chdir(tmpdir), tmp_umask(0o077): basedir = Path(path.name.split('.')[0]) maildir = Maildir(basedir, create=True) self.mailindex = MailIndex(server=server) last_folder = None for folder, msgbytes in mails: if folder != last_folder: mailfolder = maildir.add_folder(folder) last_folder = folder sha256 = hashlib.sha256(msgbytes).hexdigest() key = mailfolder.add(msgbytes) msg = mailfolder.get_message(key) idx_item = { "Date": msg.get("Date"), "From": msg.get("From"), "MessageId": msg.get("Message-Id"), "Subject": msg.get("Subject"), "To": msg.get("To"), "checksum": { "sha256": sha256 }, "folder": folder, "key": key, } self.mailindex.append(idx_item) with TemporaryFile(dir=tmpdir) as tmpf: self.mailindex.write(tmpf) tmpf.seek(0) self.add_metadata(".mailindex.yaml", tmpf) super().create(path, compression, [basedir]) return self
def test_dir(tmpdir): with tmp_chdir(tmpdir): rel_paths = archive_paths(Path(""), False) abs_paths = archive_paths(Path(""), True) for i, data in enumerate(testdata): base = next(filter(lambda e: e.type == 'd', data)).path setup_testdata(tmpdir, data) Archive().create(rel_paths[i], "bz2", [base]) Archive().create(abs_paths[i], "bz2", [tmpdir / base]) shutil.rmtree(base) return tmpdir
def create(self, path, compression, paths, basedir=None, workdir=None, excludes=None, dedup=DedupMode.LINK, tags=None): if sys.version_info < (3, 5): # The 'x' (exclusive creation) mode was added to tarfile # in Python 3.5. mode = 'w:' + compression else: mode = 'x:' + compression if workdir: with tmp_chdir(workdir): self._create(workdir / path, mode, paths, basedir, excludes, dedup, tags) else: self._create(path, mode, paths, basedir, excludes, dedup, tags) return self
def test_dir(tmpdir): setup_testdata(tmpdir, testdata) with tmp_chdir(tmpdir): Archive().create(Path("archive-rel.tar"), "", [Path("base")]) Archive().create(Path("archive-abs.tar"), "", [tmpdir / "base"]) return tmpdir