summaryrefslogtreecommitdiff
path: root/obnam
diff options
context:
space:
mode:
authorLars Wirzenius <liw@gytha>2008-04-20 22:11:12 +0300
committerLars Wirzenius <liw@gytha>2008-04-20 22:11:12 +0300
commitd1886040b13cb2b02fec45c69f430c06a4ebd25f (patch)
tree08f4f46654a51e3d69c4a1cb398dfb8d743ac4b2 /obnam
parent141b3496205a12ec7cba6d291aae9f7fa15a7002 (diff)
downloadobnam-d1886040b13cb2b02fec45c69f430c06a4ebd25f.tar.gz
Compute delta from previous generation, for files that exist in the previous generation.
Diffstat (limited to 'obnam')
-rw-r--r--obnam/app.py34
1 files changed, 30 insertions, 4 deletions
diff --git a/obnam/app.py b/obnam/app.py
index 38261f96..0d517462 100644
--- a/obnam/app.py
+++ b/obnam/app.py
@@ -254,9 +254,34 @@ class Application:
old_file.first_string_by_kind(obnam.cmp.SIGREF),
old_file.first_string_by_kind(obnam.cmp.DELTAREF))
- def _compute_delta(self, filename):
- # FIXME: This should compute a delta.
- return self._backup_new(filename)
+ def _get_old_sig(self, old_file):
+ old_sigref = old_file.first_string_by_kind(obnam.cmp.SIGREF)
+ if not old_sigref:
+ return None
+ old_sig = self.get_store().get_object(old_sigref)
+ if not old_sig:
+ return None
+ return old_sig.first_string_by_kind(obnam.cmp.SIGDATA)
+
+ def _compute_delta(self, old_file, filename):
+ old_sig_data = self._get_old_sig(old_file)
+ if old_sig_data:
+ old_contref = old_file.first_string_by_kind(obnam.cmp.CONTREF)
+ old_deltaref = old_file.first_string_by_kind(obnam.cmp.DELTAREF)
+ deltapart_ids = obnam.rsync.compute_delta(self.get_context(),
+ old_sig_data, filename)
+ delta_id = obnam.obj.object_id_new()
+ delta = obnam.obj.DeltaObject(id=delta_id,
+ deltapart_refs=deltapart_ids,
+ cont_ref=old_contref,
+ delta_ref=old_deltaref)
+ self.get_store().queue_object(delta)
+
+ sig = self.compute_signature(filename)
+
+ return None, sig.get_id(), delta.get_id()
+ else:
+ return self._backup_new(filename)
def _backup_new(self, filename):
contref = obnam.io.create_file_contents_object(self._context,
@@ -279,7 +304,8 @@ class Application:
if self.file_is_unchanged(old_st, st):
contref, sigref, deltaref = self._reuse_existing(old_file)
else:
- contref, sigref, deltaref = self._compute_delta(filename)
+ contref, sigref, deltaref = self._compute_delta(old_file,
+ filename)
else:
contref, sigref, deltaref = self._backup_new(filename)
else: