diff options
Diffstat (limited to 'rdiff-backup/rdiff_backup')
-rw-r--r-- | rdiff-backup/rdiff_backup/Main.py | 4 | ||||
-rw-r--r-- | rdiff-backup/rdiff_backup/restore.py | 33 |
2 files changed, 29 insertions, 8 deletions
diff --git a/rdiff-backup/rdiff_backup/Main.py b/rdiff-backup/rdiff_backup/Main.py index 638f137..f9cb252 100644 --- a/rdiff-backup/rdiff_backup/Main.py +++ b/rdiff-backup/rdiff_backup/Main.py @@ -571,7 +571,7 @@ def CalculateAverage(rps): def RemoveOlderThan(rootrp): """Remove all increment files older than a certain time""" - rom_check_dir(rootrp) + rot_check_dir(rootrp) try: time = Time.genstrtotime(remove_older_than_string) except Time.TimeException, exc: Log.FatalError(str(exc)) timep = Time.timetopretty(time) @@ -596,7 +596,7 @@ def RemoveOlderThan(rootrp): else: Log("Deleting increments at times:\n" + inc_pretty_time, 3) manage.delete_earlier_than(Globals.rbdir, time) -def rom_check_dir(rootrp): +def rot_check_dir(rootrp): """Check destination dir before RemoveOlderThan""" SetConnections.UpdateGlobal('rbdir', rootrp.append_path("rdiff-backup-data")) diff --git a/rdiff-backup/rdiff_backup/restore.py b/rdiff-backup/rdiff_backup/restore.py index 7094a3b..f4add16 100644 --- a/rdiff-backup/rdiff_backup/restore.py +++ b/rdiff-backup/rdiff_backup/restore.py @@ -289,28 +289,43 @@ class CachedRF: return "\n".join((s1, s2, s3)) def get_rf(self, index): - """Return RestoreFile of given index""" + """Return RestoreFile of given index, or None""" while 1: - if not self.rf_list: self.add_rfs(index) + if not self.rf_list: + if not self.add_rfs(index): return None rf = self.rf_list.pop(0) if rf.index < index: continue elif rf.index == index: return rf self.rf_list.insert(0, rf) - self.add_rfs(index) + if not self.add_rfs(index): return None def get_fp(self, index): """Return the file object (for reading) of given index""" + rf = self.get_rf(index) + if not rf: + log.Log("""Error: Unable to retrieve data for file %s! +The cause is probably data loss from the destination directory.""" % + (index and "/".join(index) or '.',), 2) + return cStringIO.StringIO('') return self.get_rf(index).get_restore_fp() def add_rfs(self, index): - """Given index, add the rfs in that same directory""" + """Given index, add the rfs in that same directory + + Returns false if no rfs are available, which usually indicates + an error. + + """ if not index: return self.root_rf parent_index = index[:-1] temp_rf = RestoreFile(self.root_rf.mirror_rp.new_index(parent_index), self.root_rf.inc_rp.new_index(parent_index), []) new_rfs = list(temp_rf.yield_sub_rfs()) - assert new_rfs, "No RFs added for index %s" % index + if not new_rfs: + log.Log("Warning: No RFs added for index %s" % (index,), 2) + return 0 self.rf_list[0:0] = new_rfs + return 1 class RestoreFile: @@ -434,7 +449,13 @@ rdiff-backup destination directory, or a bug in rdiff-backup""" % def yield_sub_rfs(self): """Return RestoreFiles under current RestoreFile (which is dir)""" - assert self.mirror_rp.isdir() or self.inc_rp.isdir() + if not self.mirror_rp.isdir() and not self.inc_rp.isdir(): + log.Log("""Warning: directory %s seems to be missing from backup! + +This is probably due to files being deleted manually from the +rdiff-backup destination directory. In general you shouldn't do this, +as data loss may result.\n""" % (self.mirror_rp.get_indexpath(),), 2) + return if self.mirror_rp.isdir(): mirror_iter = self.yield_mirrorrps(self.mirror_rp) else: mirror_iter = iter([]) |