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

it left off.  Patch by Michael Birtwell.
This commit is contained in:
Serhiy Storchaka 2013-05-09 14:22:26 +03:00
parent 6bcc0f1b51
commit 263fab94ee
4 changed files with 19 additions and 5 deletions

View file

@ -2398,16 +2398,18 @@ class TarIter:
# Fix for SF #1100429: Under rare circumstances it can # Fix for SF #1100429: Under rare circumstances it can
# happen that getmembers() is called during iteration, # happen that getmembers() is called during iteration,
# which will cause TarIter to stop prematurely. # 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() tarinfo = self.tarfile.next()
if not tarinfo: if not tarinfo:
self.tarfile._loaded = True self.tarfile._loaded = True
raise StopIteration raise StopIteration
else: else:
try: raise StopIteration
tarinfo = self.tarfile.members[self.index]
except IndexError:
raise StopIteration
self.index += 1 self.index += 1
return tarinfo return tarinfo

View file

@ -415,6 +415,14 @@ class MiscReadTest(CommonReadTest):
finally: finally:
support.unlink(empty) 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): class StreamReadTest(CommonReadTest):

View file

@ -117,6 +117,7 @@ Adrian von Bidder
David Binger David Binger
Dominic Binks Dominic Binks
Philippe Biondi Philippe Biondi
Michael Birtwell
Stuart Bishop Stuart Bishop
Roy Bixler Roy Bixler
Jonathan Black Jonathan Black

View file

@ -47,6 +47,9 @@ Core and Builtins
Library 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 - Issue #17289: The readline module now plays nicer with external modules
or applications changing the rl_completer_word_break_characters global or applications changing the rl_completer_word_break_characters global
variable. Initial patch by Bradley Froehle. variable. Initial patch by Bradley Froehle.