fixing last two unit tests bugs, realted to multivol and tar iterator
authorEduardo Robles Elvira <edulix@wadobo.com>
Mon, 30 Sep 2013 07:58:55 +0000 (09:58 +0200)
committerEduardo Robles Elvira <edulix@wadobo.com>
Mon, 30 Sep 2013 07:58:55 +0000 (09:58 +0200)
* when a file was split in two volumes, the tarinfo from the second volume was read twice
* tar iterator failed when reading an empty volume because instead of returning None, it tried to read position 0 and when reading from _Stream thats not allowed

deltatar/deltatar.py
deltatar/tarfile.py

index 83664c6..d12938e 100644 (file)
@@ -909,6 +909,7 @@ class DeltaTar(object):
                 self.delta_tar = delta_tar
                 self.tar_path = tar_path
                 self.tar_obj = None
+                self.last_member = None
                 self.__enter__()
 
             def __iter__(self):
@@ -943,10 +944,12 @@ class DeltaTar(object):
                 '''
                 Read each member and return it as a stat dict
                 '''
-                self.last_member = tarinfo = self.tar_obj.next()
-                if not tarinfo:
+                tarinfo = self.tar_obj.next()
+                if not tarinfo or tarinfo == self.last_member:
                     raise StopIteration
 
+                self.last_member = tarinfo
+
                 ptype = 'unknown'
                 if tarinfo.isfile():
                     ptype = 'file'
index ba8737b..354d953 100644 (file)
@@ -2717,7 +2717,7 @@ class TarFile(object):
                 # to self.open_volume
                 self.volume_number += 1
                 self.new_volume_handler(self, self.base_name, self.volume_number)
-                tarinfo = self.firstmember
+                tarinfo = self.next()
                 source = self.extractfile(tarinfo)
                 iterate = True
 
@@ -2833,8 +2833,11 @@ class TarFile(object):
             self.firstmember = None
             return m
 
-        # Read the next block.
-        self.fileobj.seek(self.offset)
+        # Read the next block, unless there's none
+        if isinstance(self.fileobj, _Stream) and self.offset < self.fileobj.pos:
+            return None
+        else:
+            self.fileobj.seek(self.offset)
         tarinfo = None
         while True:
             try: