Skip to content

Commit 4bd78fe

Browse files
Support compression_level when using xz (#988)
* Support compression_level when using xz. Fixes: #987
1 parent c9cc9d0 commit 4bd78fe

File tree

4 files changed

+29
-4
lines changed

4 files changed

+29
-4
lines changed

pkg/private/tar/tar_writer.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -84,16 +84,19 @@ def __init__(self,
8484

8585
self.fileobj = None
8686
self.compressor_cmd = (compressor or '').strip()
87+
extra_tar_args = {}
8788
if self.compressor_cmd:
8889
# Some custom command has been specified: no need for further
8990
# configuration, we're just going to use it.
9091
pass
9192
# Support xz compression through xz... until we can use Py3
9293
elif compression in ['xz', 'lzma']:
94+
compression_level = min(compression_level, 9) if compression_level >= 0 else 6
9395
if HAS_LZMA:
9496
mode = 'w:xz'
97+
extra_tar_args['preset'] = compression_level
9598
else:
96-
self.compressor_cmd = 'xz -F {} -'.format(compression)
99+
self.compressor_cmd = 'xz -F {} -{} -'.format(compression, compression_level)
97100
elif compression in ['bzip2', 'bz2']:
98101
mode = 'w:bz2'
99102
else:
@@ -114,7 +117,7 @@ def __init__(self,
114117
self.name = name
115118

116119
self.tar = tarfile.open(name=name, mode=mode, fileobj=self.fileobj,
117-
format=tarfile.GNU_FORMAT)
120+
format=tarfile.GNU_FORMAT, **extra_tar_args)
118121
self.existing_members = {}
119122
self.create_parents = create_parents
120123
self.allow_dups_from_deps = allow_dups_from_deps

tests/tar/BUILD

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -486,6 +486,10 @@ py_test(
486486
":test-tar-strip_prefix-substring.tar",
487487
":test-tar-tree-artifact",
488488
":test-tar-tree-artifact-noroot",
489+
":test-tar-xz-compression_level--1",
490+
":test-tar-xz-compression_level-3",
491+
":test-tar-xz-compression_level-6",
492+
":test-tar-xz-compression_level-9",
489493
":test-tree-input-with-strip-prefix",
490494
":test_tar_leading_dotslash",
491495
":test_tar_package_dir_substitution.tar",
@@ -806,6 +810,20 @@ verify_archive_test(
806810
9,
807811
]]
808812

813+
[pkg_tar(
814+
name = "test-tar-xz-compression_level-%s" % compression_level,
815+
compression_level = compression_level,
816+
extension = "tar.xz",
817+
deps = [
818+
"//tests:testdata/tar_xz_test.tar",
819+
],
820+
) for compression_level in [
821+
-1,
822+
3,
823+
6,
824+
9,
825+
]]
826+
809827
[pkg_tar(
810828
name = "test-tar-preserve_mode-%s" % state,
811829
srcs = [

tests/tar/pkg_tar_test.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -295,13 +295,17 @@ def test_externally_defined_duplicate_structure(self):
295295
self.assertTarFileContent('test-respect-externally-defined-duplicates.tar', content)
296296

297297
def test_compression_level(self):
298-
sizes = [
298+
cases = [
299299
('test-tar-compression_level--1.tgz', 179),
300300
('test-tar-compression_level-3.tgz', 230),
301301
('test-tar-compression_level-6.tgz', 178),
302302
('test-tar-compression_level-9.tgz', 167),
303+
('test-tar-xz-compression_level--1.tar.xz', 67216),
304+
('test-tar-xz-compression_level-3.tar.xz', 67264),
305+
('test-tar-xz-compression_level-6.tar.xz', 67216),
306+
('test-tar-xz-compression_level-9.tar.xz', 67156),
303307
]
304-
for file_name, expected_size in sizes:
308+
for file_name, expected_size in cases:
305309
file_path = runfiles.Create().Rlocation('rules_pkg/tests/tar/' + file_name)
306310
file_size = os.stat(file_path).st_size
307311
self.assertEqual(file_size, expected_size, 'size error for ' + file_name)

tests/testdata/tar_xz_test.tar

30 MB
Binary file not shown.

0 commit comments

Comments
 (0)