From 817592c55e868c4a9f74b252f64dfd511f8ddd81 Mon Sep 17 00:00:00 2001 From: dannysullivan Date: Thu, 16 Apr 2020 16:09:51 -0400 Subject: [PATCH 1/3] Preserve mtimes from input tar files in TarFileWriter output tars --- pkg/archive.py | 1 - pkg/tests/archive_test.py | 14 ++++++++++++++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/pkg/archive.py b/pkg/archive.py index 2a06dcfa..c6d977cd 100644 --- a/pkg/archive.py +++ b/pkg/archive.py @@ -378,7 +378,6 @@ def add_tar(self, intar = tarfile.open(name=tar, mode=inmode) for tarinfo in intar: if name_filter is None or name_filter(tarinfo.name): - tarinfo.mtime = self.default_mtime if rootuid is not None and tarinfo.uid == rootuid: tarinfo.uid = 0 tarinfo.uname = 'root' diff --git a/pkg/tests/archive_test.py b/pkg/tests/archive_test.py index 1f13b066..47067098 100644 --- a/pkg/tests/archive_test.py +++ b/pkg/tests/archive_test.py @@ -227,6 +227,20 @@ def testMergeTarRelocated(self): f.add_tar(datafile, name_filter=lambda n: n != "./b", root="/foo") self.assertTarFileContent(self.tempfile, content) + def testPreserveInputTarMtimes(self): + input_tar_path = os.path.join(testenv.TESTDATA_PATH, "tar_test.tar") + with archive.TarFileWriter(self.tempfile) as f: + f.add_tar(input_tar_path) + + with tarfile.open(input_tar_path, "r:") as input_tar: + input_mtimes = {} + for input_file in input_tar: + input_mtimes[input_file.name] = input_file.mtime + + with tarfile.open(self.tempfile, "r:") as output_tar: + for output_file in output_tar: + self.assertEqual(input_mtimes[output_file.name], output_file.mtime) + def testAddingDirectoriesForFile(self): with archive.TarFileWriter(self.tempfile) as f: f.add_file("d/f") From 5629d294b498a1aacd6cf25d858b1d8bba8a260c Mon Sep 17 00:00:00 2001 From: dannysullivan Date: Fri, 17 Apr 2020 17:04:45 -0400 Subject: [PATCH 2/3] Provide option for overriding input tar mtimes in TarFileWriter --- pkg/archive.py | 7 ++++++- pkg/tests/archive_test.py | 34 ++++++++++++++++++++++++---------- 2 files changed, 30 insertions(+), 11 deletions(-) diff --git a/pkg/archive.py b/pkg/archive.py index c6d977cd..f15b4251 100644 --- a/pkg/archive.py +++ b/pkg/archive.py @@ -110,7 +110,8 @@ def __init__(self, name, compression='', root_directory='./', - default_mtime=None): + default_mtime=None, + preserve_tar_mtimes=True): """TarFileWriter wraps tarfile.open(). Args: @@ -120,6 +121,7 @@ def __init__(self, default_mtime: default mtime to use for elements in the archive. May be an integer or the value 'portable' to use the date 2000-01-01, which is compatible with non *nix OSes'. + preserve_tar_mtimes: if true, keep file mtimes from input tar file. """ if compression in ['bzip2', 'bz2']: mode = 'w:bz2' @@ -130,6 +132,7 @@ def __init__(self, self.xz = compression in ['xz', 'lzma'] self.name = name self.root_directory = root_directory.rstrip('/') + self.preserve_mtime = preserve_tar_mtimes if default_mtime is None: self.default_mtime = 0 elif default_mtime == 'portable': @@ -378,6 +381,8 @@ def add_tar(self, intar = tarfile.open(name=tar, mode=inmode) for tarinfo in intar: if name_filter is None or name_filter(tarinfo.name): + if not self.preserve_mtime: + tarinfo.mtime = self.default_mtime if rootuid is not None and tarinfo.uid == rootuid: tarinfo.uid = 0 tarinfo.uname = 'root' diff --git a/pkg/tests/archive_test.py b/pkg/tests/archive_test.py index 47067098..6940517b 100644 --- a/pkg/tests/archive_test.py +++ b/pkg/tests/archive_test.py @@ -227,19 +227,33 @@ def testMergeTarRelocated(self): f.add_tar(datafile, name_filter=lambda n: n != "./b", root="/foo") self.assertTarFileContent(self.tempfile, content) - def testPreserveInputTarMtimes(self): - input_tar_path = os.path.join(testenv.TESTDATA_PATH, "tar_test.tar") + def testDefaultMtimeNotProvided(self): with archive.TarFileWriter(self.tempfile) as f: - f.add_tar(input_tar_path) + self.assertEqual(f.default_mtime, 0) + + def testDefaultMtimeProvided(self): + with archive.TarFileWriter(self.tempfile, default_mtime=1234) as f: + self.assertEqual(f.default_mtime, 1234) - with tarfile.open(input_tar_path, "r:") as input_tar: - input_mtimes = {} - for input_file in input_tar: - input_mtimes[input_file.name] = input_file.mtime + def testPortableMtime(self): + with archive.TarFileWriter(self.tempfile, default_mtime="portable") as f: + self.assertEqual(f.default_mtime, 946684800) - with tarfile.open(self.tempfile, "r:") as output_tar: - for output_file in output_tar: - self.assertEqual(input_mtimes[output_file.name], output_file.mtime) + def testPreserveTarMtimesTrueByDefault(self): + with archive.TarFileWriter(self.tempfile) as f: + input_tar_path = os.path.join(testenv.TESTDATA_PATH, "tar_test.tar") + f.add_tar(input_tar_path) + input_tar = tarfile.open(input_tar_path, "r") + for file_name in f.members: + input_file = input_tar.getmember(file_name) + output_file = f.tar.getmember(file_name) + self.assertEqual(input_file.mtime, output_file.mtime) + + def testPreserveTarMtimesFalse(self): + with archive.TarFileWriter(self.tempfile, preserve_tar_mtimes=False) as f: + f.add_tar(os.path.join(testenv.TESTDATA_PATH, "tar_test.tar")) + for output_file in f.tar: + self.assertEqual(output_file.mtime, 0) def testAddingDirectoriesForFile(self): with archive.TarFileWriter(self.tempfile) as f: From 43e6c9ee4230e938c85f7637afd1b6059d9b0746 Mon Sep 17 00:00:00 2001 From: dannysullivan Date: Mon, 20 Apr 2020 13:42:01 -0400 Subject: [PATCH 3/3] Correctly set test fixture paths in archive test --- pkg/tests/archive_test.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/pkg/tests/archive_test.py b/pkg/tests/archive_test.py index 6940517b..0bf6a252 100644 --- a/pkg/tests/archive_test.py +++ b/pkg/tests/archive_test.py @@ -241,7 +241,8 @@ def testPortableMtime(self): def testPreserveTarMtimesTrueByDefault(self): with archive.TarFileWriter(self.tempfile) as f: - input_tar_path = os.path.join(testenv.TESTDATA_PATH, "tar_test.tar") + input_tar_path = self.data_files.Rlocation( + os.path.join("rules_pkg", "tests", "testdata", "tar_test.tar")) f.add_tar(input_tar_path) input_tar = tarfile.open(input_tar_path, "r") for file_name in f.members: @@ -251,7 +252,9 @@ def testPreserveTarMtimesTrueByDefault(self): def testPreserveTarMtimesFalse(self): with archive.TarFileWriter(self.tempfile, preserve_tar_mtimes=False) as f: - f.add_tar(os.path.join(testenv.TESTDATA_PATH, "tar_test.tar")) + input_tar_path = self.data_files.Rlocation( + os.path.join("rules_pkg", "tests", "testdata", "tar_test.tar")) + f.add_tar(input_tar_path) for output_file in f.tar: self.assertEqual(output_file.mtime, 0)