Issue #1531: Read fileobj from the current offset, do not seek to
the start. (backport from r59260)
This commit is contained in:
parent
8334a4fc31
commit
7cc9c8bbe1
|
@ -1065,7 +1065,8 @@ class TarFile(object):
|
||||||
self.closed = False
|
self.closed = False
|
||||||
self.members = [] # list of members as TarInfo objects
|
self.members = [] # list of members as TarInfo objects
|
||||||
self._loaded = False # flag if all members have been read
|
self._loaded = False # flag if all members have been read
|
||||||
self.offset = 0L # current position in the archive file
|
self.offset = self.fileobj.tell()
|
||||||
|
# current position in the archive file
|
||||||
self.inodes = {} # dictionary caching the inodes of
|
self.inodes = {} # dictionary caching the inodes of
|
||||||
# archive members already added
|
# archive members already added
|
||||||
|
|
||||||
|
|
|
@ -260,6 +260,38 @@ class ReadStreamAsteriskTest(ReadStreamTest):
|
||||||
mode = self.mode + self.sep + "*"
|
mode = self.mode + self.sep + "*"
|
||||||
self.tar = tarfile.open(tarname(self.comp), mode)
|
self.tar = tarfile.open(tarname(self.comp), mode)
|
||||||
|
|
||||||
|
class ReadFileobjTest(BaseTest):
|
||||||
|
|
||||||
|
def test_fileobj_with_offset(self):
|
||||||
|
# Skip the first member and store values from the second member
|
||||||
|
# of the testtar.
|
||||||
|
self.tar.next()
|
||||||
|
t = self.tar.next()
|
||||||
|
name = t.name
|
||||||
|
offset = t.offset
|
||||||
|
data = self.tar.extractfile(t).read()
|
||||||
|
self.tar.close()
|
||||||
|
|
||||||
|
# Open the testtar and seek to the offset of the second member.
|
||||||
|
if self.comp == "gz":
|
||||||
|
_open = gzip.GzipFile
|
||||||
|
elif self.comp == "bz2":
|
||||||
|
_open = bz2.BZ2File
|
||||||
|
else:
|
||||||
|
_open = open
|
||||||
|
fobj = _open(tarname(self.comp), "rb")
|
||||||
|
fobj.seek(offset)
|
||||||
|
|
||||||
|
# Test if the tarfile starts with the second member.
|
||||||
|
self.tar = tarfile.open(tarname(self.comp), "r:", fileobj=fobj)
|
||||||
|
t = self.tar.next()
|
||||||
|
self.assertEqual(t.name, name)
|
||||||
|
# Read to the end of fileobj and test if seeking back to the
|
||||||
|
# beginning works.
|
||||||
|
self.tar.getmembers()
|
||||||
|
self.assertEqual(self.tar.extractfile(t).read(), data,
|
||||||
|
"seek back did not work")
|
||||||
|
|
||||||
class WriteTest(BaseTest):
|
class WriteTest(BaseTest):
|
||||||
mode = 'w'
|
mode = 'w'
|
||||||
|
|
||||||
|
@ -624,6 +656,8 @@ class ReadAsteriskTestGzip(ReadAsteriskTest):
|
||||||
comp = "gz"
|
comp = "gz"
|
||||||
class ReadStreamAsteriskTestGzip(ReadStreamAsteriskTest):
|
class ReadStreamAsteriskTestGzip(ReadStreamAsteriskTest):
|
||||||
comp = "gz"
|
comp = "gz"
|
||||||
|
class ReadFileobjTestGzip(ReadFileobjTest):
|
||||||
|
comp = "gz"
|
||||||
|
|
||||||
# Filemode test cases
|
# Filemode test cases
|
||||||
|
|
||||||
|
@ -680,6 +714,8 @@ if bz2:
|
||||||
comp = "bz2"
|
comp = "bz2"
|
||||||
class ReadStreamAsteriskTestBzip2(ReadStreamAsteriskTest):
|
class ReadStreamAsteriskTestBzip2(ReadStreamAsteriskTest):
|
||||||
comp = "bz2"
|
comp = "bz2"
|
||||||
|
class ReadFileobjTestBzip2(ReadFileobjTest):
|
||||||
|
comp = "bz2"
|
||||||
|
|
||||||
# If importing gzip failed, discard the Gzip TestCases.
|
# If importing gzip failed, discard the Gzip TestCases.
|
||||||
if not gzip:
|
if not gzip:
|
||||||
|
@ -713,6 +749,7 @@ def test_main():
|
||||||
ReadDetectFileobjTest,
|
ReadDetectFileobjTest,
|
||||||
ReadAsteriskTest,
|
ReadAsteriskTest,
|
||||||
ReadStreamAsteriskTest,
|
ReadStreamAsteriskTest,
|
||||||
|
ReadFileobjTest,
|
||||||
WriteTest,
|
WriteTest,
|
||||||
Write100Test,
|
Write100Test,
|
||||||
WriteSize0Test,
|
WriteSize0Test,
|
||||||
|
@ -730,7 +767,8 @@ def test_main():
|
||||||
ReadTestGzip, ReadStreamTestGzip,
|
ReadTestGzip, ReadStreamTestGzip,
|
||||||
WriteTestGzip, WriteStreamTestGzip,
|
WriteTestGzip, WriteStreamTestGzip,
|
||||||
ReadDetectTestGzip, ReadDetectFileobjTestGzip,
|
ReadDetectTestGzip, ReadDetectFileobjTestGzip,
|
||||||
ReadAsteriskTestGzip, ReadStreamAsteriskTestGzip
|
ReadAsteriskTestGzip, ReadStreamAsteriskTestGzip,
|
||||||
|
ReadFileobjTestGzip
|
||||||
])
|
])
|
||||||
|
|
||||||
if bz2:
|
if bz2:
|
||||||
|
@ -738,7 +776,8 @@ def test_main():
|
||||||
ReadTestBzip2, ReadStreamTestBzip2,
|
ReadTestBzip2, ReadStreamTestBzip2,
|
||||||
WriteTestBzip2, WriteStreamTestBzip2,
|
WriteTestBzip2, WriteStreamTestBzip2,
|
||||||
ReadDetectTestBzip2, ReadDetectFileobjTestBzip2,
|
ReadDetectTestBzip2, ReadDetectFileobjTestBzip2,
|
||||||
ReadAsteriskTestBzip2, ReadStreamAsteriskTestBzip2
|
ReadAsteriskTestBzip2, ReadStreamAsteriskTestBzip2,
|
||||||
|
ReadFileobjTestBzip2
|
||||||
])
|
])
|
||||||
try:
|
try:
|
||||||
test_support.run_unittest(*tests)
|
test_support.run_unittest(*tests)
|
||||||
|
|
|
@ -46,6 +46,9 @@ Core and builtins
|
||||||
Library
|
Library
|
||||||
-------
|
-------
|
||||||
|
|
||||||
|
- Issue #1531: tarfile.py: Read fileobj from the current offset, do not
|
||||||
|
seek to the start.
|
||||||
|
|
||||||
- Issue 1429818: patch for trace and doctest modules so they play nicely
|
- Issue 1429818: patch for trace and doctest modules so they play nicely
|
||||||
together.
|
together.
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue