Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 8 additions & 2 deletions tools/build_defs/pkg/archive.py
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand All @@ -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'
Expand All @@ -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':
Expand Down Expand Up @@ -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'
Expand Down
28 changes: 28 additions & 0 deletions tools/build_defs/pkg/archive_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -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"])
Expand Down