Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Specify tar file format explicitly #17679

Closed
wants to merge 2 commits into from
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
6 changes: 4 additions & 2 deletions tools/build_defs/pkg/archive.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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([])

Expand Down
6 changes: 6 additions & 0 deletions tools/build_defs/pkg/archive_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -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()
22 changes: 19 additions & 3 deletions tools/build_defs/pkg/build_tar.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
import argparse
import os
import sys
import tarfile

# Do not edit this line. Copybara replaces it with PY2 migration helper.

Expand All @@ -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):
Expand Down Expand Up @@ -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',
Expand All @@ -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)
Expand Down