diff options
author | Lars Wirzenius <liw@gytha> | 2008-04-20 22:11:12 +0300 |
---|---|---|
committer | Lars Wirzenius <liw@gytha> | 2008-04-20 22:11:12 +0300 |
commit | d1886040b13cb2b02fec45c69f430c06a4ebd25f (patch) | |
tree | 08f4f46654a51e3d69c4a1cb398dfb8d743ac4b2 /obnam | |
parent | 141b3496205a12ec7cba6d291aae9f7fa15a7002 (diff) | |
download | obnam-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.py | 34 |
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: |