Kaydet (Commit) b3c5d856 authored tarafından Serhiy Storchaka's avatar Serhiy Storchaka

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

it left off.  Patch by Michael Birtwell.
......@@ -2397,16 +2397,18 @@ 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
raise StopIteration
self.index += 1
return tarinfo
......
......@@ -415,6 +415,14 @@ class MiscReadTest(CommonReadTest):
finally:
support.unlink(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.get_info(), m2.get_info())
class StreamReadTest(CommonReadTest):
......
......@@ -118,6 +118,7 @@ Adrian von Bidder
David Binger
Dominic Binks
Philippe Biondi
Michael Birtwell
Stuart Bishop
Roy Bixler
Daniel Black
......
......@@ -86,6 +86,9 @@ Core and Builtins
Library
-------
- Issue #16601: Restarting iteration over tarfile no more continues from where
it left off. Patch by Michael Birtwell.
- Issue #17289: The readline module now plays nicer with external modules
or applications changing the rl_completer_word_break_characters global
variable. Initial patch by Bradley Froehle.
......
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