'''
Allows this iterator to be used with the "with" statement
'''
- self.f.close()
+ if self.f:
+ self.f.close()
self.f = None
def next(self):
Returns a tar iterator that iterates jsonized member items that contain
an additional "member" field, used by RestoreHelper.
'''
- def TarPathIterator(object):
- def __init__(self, delta_tar, index_path):
+ class TarPathIterator(object):
+ def __init__(self, delta_tar, tar_path):
self.delta_tar = delta_tar
- self.index_path = index_path
+ self.tar_path = tar_path
self.tar_obj = None
self.__enter__()
Allows this iterator to be used with the "with" statement
'''
if self.tar_obj is None:
- self.tar_obj = self.delta_tar.open_index(self.index_path, 'r')
+ self.tar_obj = tarfile.TarFile.open(self.tar_path,
+ mode='r' + self.delta_tar.mode,
+ format=tarfile.GNU_FORMAT,
+ concat_compression='#gz' in self.delta_tar.mode,
+ password=self.delta_tar.password,
+ new_volume_handler=None)
return self
def __exit__(self, type, value, tb):
'''
Allows this iterator to be used with the "with" statement
'''
- self.tar_obj.close()
+ if self.tar_obj:
+ self.tar_obj.close()
self.tar_obj = None
def next(self):
Read each member and return it as a stat dict
'''
self.last_member = tarinfo = self.tar_obj.next()
+ if not tarinfo:
+ raise StopIteration
+
ptype = 'unknown'
if tarinfo.isfile():
ptype = 'file'
u'inode': -1, # cannot restore
u'size': tarinfo.size,
u'member': tarinfo
- }
+ }, 0
+
return TarPathIterator(self, tar_path)
def jsonize_path_iterator(self, iter, strip=0):
if not os.path.exists(target_path):
os.makedirs(target_path)
+ # make backup_tar_path absolute so that iterate_tar_path works fine
+ if backup_tar_path and not os.path.isabs(backup_tar_path):
+ backup_tar_path = os.path.abspath(backup_tar_path)
+
cwd = os.getcwd()
+ os.chdir(target_path)
if mode == 'tar':
index_it = self.iterate_tar_path(backup_tar_path)
helper = RestoreHelper(self, cwd, backup_path=backup_tar_path,
- tarobj=index_it.tarobj)
+ tarobj=index_it.tar_obj)
elif mode == "diff":
helper = RestoreHelper(self, cwd, backup_indexes_paths)
index_it = self.iterate_index_path(helper._data[0]["path"])
else:
helper.delete(upath)
- helper.restore_directories_permissions()
- index_it.release()
- os.chdir(cwd)
- helper.cleanup()
+ helper.restore_directories_permissions()
+ index_it.release()
+ os.chdir(cwd)
+ helper.cleanup()
def _parse_json_line(self, f, l_no):
'''
if not os.path.isabs(backup_path):
backup_path = os.path.normpath(os.path.join(cwd, backup_path))
+ # update the new_volume_handler of tar_obj
+ tarobj.new_volume_handler = partial(self.new_volume_handler,
+ self._deltatar, self._cwd, True, os.path.dirname(backup_path))
s = dict(
curr_vol_no = None,
vol_fd = None,
iterator = None,
last_itelement = None,
last_lno = 0,
- new_volume_handler = partial(self.new_volume_handler,
- self._deltatar, self._cwd, True,
- os.path.dirname(backup_path))
+ new_volume_handler = tarobj.new_volume_handler
)
self._data.append(s)
# to preserve parent directory mtime, we save it
parent_dir = os.path.dirname(upath)
+ if not os.path.exists(parent_dir):
+ os.makedirs(parent_dir)
parent_dir_mtime = int(os.stat(parent_dir).st_mtime)
# if path is found in the first index as to be snapshotted, deal with it