diff --git a/python-stdlib/tarfile/manifest.py b/python-stdlib/tarfile/manifest.py index 9940bb051..c379837c7 100644 --- a/python-stdlib/tarfile/manifest.py +++ b/python-stdlib/tarfile/manifest.py @@ -1,4 +1,4 @@ -metadata(description="Read-only implementation of Python's tarfile.", version="0.4.1") +metadata(description="Read-only implementation of Python's tarfile.", version="0.4.2") # Originally written by Paul Sokolovsky. diff --git a/python-stdlib/tarfile/tarfile/__init__.py b/python-stdlib/tarfile/tarfile/__init__.py index 4bb95af30..00b271137 100644 --- a/python-stdlib/tarfile/tarfile/__init__.py +++ b/python-stdlib/tarfile/tarfile/__init__.py @@ -55,9 +55,12 @@ def skip(self): if sz: buf = bytearray(16) while sz: - s = min(sz, 16) - self.f.readinto(buf, s) - sz -= s + if sz >= 16: + self.f.readinto(buf) + sz -= 16 + else: + self.f.read(sz) + sz = 0 class TarInfo: diff --git a/python-stdlib/tarfile/test.tar b/python-stdlib/tarfile/test.tar new file mode 100644 index 000000000..7fa0604d7 Binary files /dev/null and b/python-stdlib/tarfile/test.tar differ diff --git a/python-stdlib/tarfile/test_tarfile.py b/python-stdlib/tarfile/test_tarfile.py new file mode 100644 index 000000000..7acd61af7 --- /dev/null +++ b/python-stdlib/tarfile/test_tarfile.py @@ -0,0 +1,45 @@ +import tarfile +import unittest + + +test_tar_contents = ( + ("a", "file", 2), + ("b", "file", 2), + ("dir/", "dir", 0), + ("dir/c", "file", 2), + ("dir/d", "file", 2), + ("tar.tar", "file", 10240), +) + +test_sub_tar_contents = ( + ("e", "file", 2), + ("f", "file", 2), +) + + +class TestTarFile(unittest.TestCase): + def check_contents(self, expected, tf): + for i, file in enumerate(tf): + name, type, size = expected[i] + self.assertEqual(file.name, name) + self.assertEqual(file.type, type) + self.assertEqual(file.size, size) + + def test_iter(self): + tf = tarfile.TarFile("test.tar") + for _ in range(6): + self.assertIsInstance(next(tf), tarfile.TarInfo) + with self.assertRaises(StopIteration): + next(tf) + + def test_contents(self): + tf = tarfile.TarFile("test.tar") + self.check_contents(test_tar_contents, tf) + + def test_nested_tar(self): + tf = tarfile.TarFile("test.tar") + for file in tf: + if file.name == "tar.tar": + subf = tf.extractfile(file) + subtf = tarfile.TarFile(fileobj=subf) + self.check_contents(test_sub_tar_contents, subtf) diff --git a/tools/ci.sh b/tools/ci.sh index 6689e8aa4..abe83b563 100755 --- a/tools/ci.sh +++ b/tools/ci.sh @@ -90,6 +90,7 @@ function ci_package_tests_run { python-stdlib/pathlib \ python-stdlib/quopri \ python-stdlib/shutil \ + python-stdlib/tarfile \ python-stdlib/tempfile \ python-stdlib/time \ python-stdlib/unittest/tests \