From 918747fd876e276d6a6e9476ee9e19c7d0bb469b Mon Sep 17 00:00:00 2001 From: dannysullivan Date: Thu, 26 Mar 2020 13:30:34 -0400 Subject: [PATCH] Add option to preserve input tar mtimes in TarFileWriter Also backfill unit tests of default mtime functionality --- tools/build_defs/pkg/archive.py | 10 ++++++++-- tools/build_defs/pkg/archive_test.py | 28 ++++++++++++++++++++++++++++ 2 files changed, 36 insertions(+), 2 deletions(-) diff --git a/tools/build_defs/pkg/archive.py b/tools/build_defs/pkg/archive.py index 52c26912de255b..b497a219bca070 100644 --- a/tools/build_defs/pkg/archive.py +++ b/tools/build_defs/pkg/archive.py @@ -115,7 +115,8 @@ def __init__(self, name, compression='', root_directory='./', - default_mtime=None): + default_mtime=None, + preserve_tar_mtimes=False): """TarFileWriter wraps tarfile.open(). Args: @@ -125,6 +126,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' @@ -135,6 +137,9 @@ def __init__(self, self.xz = compression in ['xz', 'lzma'] self.name = name self.root_directory = six.ensure_str(root_directory).rstrip('/') + + self.preserve_mtime = preserve_tar_mtimes + if default_mtime is None: self.default_mtime = 0 elif default_mtime == 'portable': @@ -385,7 +390,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): - tarinfo.mtime = self.default_mtime + 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/tools/build_defs/pkg/archive_test.py b/tools/build_defs/pkg/archive_test.py index a2e0df401a12fe..f5696c6207f8ab 100644 --- a/tools/build_defs/pkg/archive_test.py +++ b/tools/build_defs/pkg/archive_test.py @@ -161,6 +161,34 @@ def assertSimpleFileContent(self, names): } for n in names]) self.assertTarFileContent(self.tempfile, content) + def testDefaultMtimeNotProvided(self): + with archive.TarFileWriter(self.tempfile) as f: + 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) + + def testPortableMtime(self): + with archive.TarFileWriter(self.tempfile, default_mtime="portable") as f: + self.assertEqual(f.default_mtime, 946684800) + + def testPreserveTarMtimesTrue(self): + with archive.TarFileWriter(self.tempfile, preserve_tar_mtimes=True) 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 testAddFile(self): self.assertSimpleFileContent(["./a"]) self.assertSimpleFileContent(["./b"])