Fixed DeltaTar create_diff_backup and restore_backup
authorDaniel Garcia Moreno <danigm@wadobo.com>
Thu, 29 Aug 2013 12:00:20 +0000 (14:00 +0200)
committerDaniel Garcia Moreno <danigm@wadobo.com>
Thu, 29 Aug 2013 12:00:20 +0000 (14:00 +0200)
deltatar/deltatar.py
testing/test_deltatar.py

index 7eaec08..1f610ba 100644 (file)
@@ -712,8 +712,11 @@ class DeltaTar(object):
         dir_it = self._recursive_walk_dir('.')
         dir_path_it = self.jsonize_path_iterator(dir_it)
 
+        index_it = sorted(index_it, key=lambda x: x[0]['path'])
+        dir_path_it = sorted(dir_path_it, key=lambda x: x['path'])
+
         # for each file to be in the backup, do:
-        for ipath, dpath, l_no in self.collate_iterators(index_it, dir_path_it):
+        for ipath, dpath, l_no in self.collate_iterators(iter(index_it), iter(dir_path_it)):
             action = None
             # if file is not in the index, it means it's a new file, so we have
             # to take a snapshot
@@ -1030,8 +1033,12 @@ class DeltaTar(object):
             dir_it = self._recursive_walk_dir('.')
             dir_path_it = self.jsonize_path_iterator(dir_it)
 
+            index_it = sorted(index_it, key=lambda x: x[0]['path'])
+            dir_path_it = sorted(dir_path_it, key=lambda x: x['path'])
+            helper._data[0]['iterator'] = iter(index_it)
+
             # for each file to be in the backup, do:
-            for ipath, dpath, l_no in self.collate_iterators(index_it, dir_path_it):
+            for ipath, dpath, l_no in self.collate_iterators(iter(index_it), iter(dir_path_it)):
                 if not ipath:
                     upath = dpath['path']
                     op_type = dpath['type']
@@ -1057,7 +1064,8 @@ class DeltaTar(object):
                 # we have to restore the file, but first we need to delete the
                 # current existing file
                 helper.delete(upath)
-                helper.restore(ipath, l_no)
+                if ipath:
+                    helper.restore(ipath, l_no)
 
             helper.restore_directories_permissions()
             os.chdir(cwd)
@@ -1167,7 +1175,9 @@ class RestoreHelper(object):
         cur_index = 1
         while cur_index < len(self._data):
             data = self._data[cur_index]
-            it = data['iterator']
+            listit = list(data['iterator'])
+            it = iter(listit)
+            data['iterator'] = iter(listit)
 
             # find the path in the index
             d = None
@@ -1272,11 +1282,12 @@ class RestoreHelper(object):
         # seek tarfile if needed
         offset = file_data.get('offset', -1)
         if index_data['tarobj']:
-            member = index_data['tarobj'].next()
-            if member.path != index_data['tarobj']:
+            # TODO review this code...
+            #member = index_data['tarobj'].next()
+            #if member.path != index_data['tarobj']:
                 # force a seek and reopen
-                index_data['tarobj'].close()
-                index_data['tarobj'] = None
+            index_data['tarobj'].close()
+            index_data['tarobj'] = None
 
         # open the tarfile if needed
         if not index_data['tarobj']:
index 5cf7606..b85f669 100644 (file)
@@ -909,7 +909,8 @@ class DeltaTarTest(BaseTest):
         # check index items
         index_path = os.path.join("backup_dir2", prev_index_filename)
         index_it = deltatar.iterate_index_path(index_path)
-        assert [i[0]['path'] for i in index_it] == [
+        l = sorted([i[0]['path'] for i in index_it])
+        assert l == sorted([
             'list://./big',
             'snapshot://./bigdir',
             'delete://./small',
@@ -920,7 +921,7 @@ class DeltaTarTest(BaseTest):
             'list://./test/test2',
             'snapshot://./bigdir/a',
             'snapshot://./bigdir/b'
-        ]
+        ])
 
         # check the tar file
         assert os.path.exists("backup_dir2")