diff --git a/tools/build_defs/pkg/archive.py b/tools/build_defs/pkg/archive.py index 8d3fac6c94259f..7bb85892f11d0b 100644 --- a/tools/build_defs/pkg/archive.py +++ b/tools/build_defs/pkg/archive.py @@ -32,13 +32,15 @@ class Error(Exception): def __init__(self, name, root_directory='./', - preserve_tar_mtimes=False): + preserve_tar_mtimes=False, + tar_format=tarfile.DEFAULT_FORMAT): """TarFileWriter wraps tarfile.open(). Args: name: the tar file name. root_directory: virtual root to prepend to elements in the archive. preserve_tar_mtimes: if true, keep file mtimes from input tar file. + tar_format: format of tarfile. """ mode = 'w:' self.name = name @@ -47,7 +49,7 @@ def __init__(self, self.preserve_mtime = preserve_tar_mtimes self.fileobj = None - self.tar = tarfile.open(name=name, mode=mode, fileobj=self.fileobj) + self.tar = tarfile.open(name=name, mode=mode, fileobj=self.fileobj, format=tar_format) self.members = set([]) self.directories = set([]) diff --git a/tools/build_defs/pkg/archive_test.py b/tools/build_defs/pkg/archive_test.py index c11216981b761a..bef73564b87cf5 100644 --- a/tools/build_defs/pkg/archive_test.py +++ b/tools/build_defs/pkg/archive_test.py @@ -219,5 +219,11 @@ def testChangingRootDirectory(self): ] self.assertTarFileContent(self.tempfile, content) + def testTarFileFormat(self): + for format_ in (tarfile.USTAR_FORMAT, tarfile.PAX_FORMAT, tarfile.GNU_FORMAT): + with archive.TarFileWriter(self.tempfile, tar_format=format_) as f: + pass + self.assertEqual(f.tar.format, format_) + if __name__ == "__main__": unittest.main() diff --git a/tools/build_defs/pkg/build_tar.py b/tools/build_defs/pkg/build_tar.py index a4eb5acd681bd1..816157405846a8 100644 --- a/tools/build_defs/pkg/build_tar.py +++ b/tools/build_defs/pkg/build_tar.py @@ -16,6 +16,7 @@ import argparse import os import sys +import tarfile # Do not edit this line. Copybara replaces it with PY2 migration helper. @@ -28,13 +29,15 @@ class TarFile(object): class DebError(Exception): pass - def __init__(self, output, directory, root_directory): + def __init__(self, output, directory, root_directory, tar_format=tarfile.DEFAULT_FORMAT): self.directory = directory self.output = output self.root_directory = root_directory + self.format = tar_format def __enter__(self): - self.tarfile = archive.TarFileWriter(self.output, self.root_directory) + self.tarfile = archive.TarFileWriter(self.output, self.root_directory, + tar_format=self.format) return self def __exit__(self, t, v, traceback): @@ -93,6 +96,7 @@ def unquote_and_split(arg, c): def main(): parser = argparse.ArgumentParser( description='Helper for building tar packages', + formatter_class=argparse.RawTextHelpFormatter, fromfile_prefix_chars='@') parser.add_argument( '--output', @@ -109,10 +113,22 @@ def main(): '--root_directory', default='./', help='Default root directory is named "."') + parser.add_argument( + '--format', + default=tarfile.DEFAULT_FORMAT, + help='''Format of tar file. (DEFAULT: %(default)s). +{} - POSIX.1-1988 (ustar) format +{} - GNU tar format +{} - POSIX.1-2001 (pax) format'''.format(tarfile.USTAR_FORMAT, + tarfile.GNU_FORMAT, + tarfile.PAX_FORMAT), + type=int, + choices=[tarfile.USTAR_FORMAT, tarfile.GNU_FORMAT, tarfile.PAX_FORMAT], + ) opts = parser.parse_args() # Add objects to the tar file - with TarFile(opts.output, opts.directory, opts.root_directory) as output: + with TarFile(opts.output, opts.directory, opts.root_directory, opts.format) as output: for f in opts.file: (inf, tof) = unquote_and_split(f, '=') output.add_file(inf, tof)