Commit ce34ba6e authored by Serhiy Storchaka's avatar Serhiy Storchaka

Issue #16601: Restarting iteration over tarfile no more continues from where

it left off.  Patch by Michael Birtwell.
parent 673770c5
......@@ -2462,15 +2462,17 @@ class TarIter:
# Fix for SF #1100429: Under rare circumstances it can
# happen that getmembers() is called during iteration,
# which will cause TarIter to stop prematurely.
if not self.tarfile._loaded:
if self.index == 0 and self.tarfile.firstmember is not None:
tarinfo = self.tarfile.next()
elif self.index < len(self.tarfile.members):
tarinfo = self.tarfile.members[self.index]
elif not self.tarfile._loaded:
tarinfo = self.tarfile.next()
if not tarinfo:
self.tarfile._loaded = True
raise StopIteration
else:
try:
tarinfo = self.tarfile.members[self.index]
except IndexError:
raise StopIteration
self.index += 1
return tarinfo
......
......@@ -345,6 +345,14 @@ class MiscReadTest(CommonReadTest):
finally:
os.remove(empty)
def test_parallel_iteration(self):
# Issue #16601: Restarting iteration over tarfile continued
# from where it left off.
with tarfile.open(self.tarname) as tar:
for m1, m2 in zip(tar, tar):
self.assertEqual(m1.offset, m2.offset)
self.assertEqual(m1.name, m2.name)
class StreamReadTest(CommonReadTest):
......
......@@ -96,6 +96,7 @@ Natalia B. Bidart
David Binger
Dominic Binks
Philippe Biondi
Michael Birtwell
Stuart Bishop
Roy Bixler
Jonathan Black
......
......@@ -26,6 +26,9 @@ Core and Builtins
Library
-------
- Issue #16601: Restarting iteration over tarfile no more continues from where
it left off. Patch by Michael Birtwell.
- Issue 16584: in filecomp._cmp, catch IOError as well as os.error.
Patch by Till Maas.
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment