Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSascha Silbe <sascha-pgp@silbe.org>2011-10-11 22:01:05 (GMT)
committer Sascha Silbe <sascha-pgp@silbe.org>2011-10-11 22:01:05 (GMT)
commitd249b8c9a8627fcf65a219ea5512ad5dae3673b6 (patch)
treea651cc56e6d3cc185e903582429d1f8ca70cd54d
parentd8e3d402038074fbf4791b827c7c260f6dcf1d20 (diff)
Fix metadata-only updates for Sugar v2 API
path='' means the caller wants to update only the metadata and "inherit" the data from the previous version.
-rw-r--r--gdatastore/datastore.py21
1 files changed, 12 insertions, 9 deletions
diff --git a/gdatastore/datastore.py b/gdatastore/datastore.py
index 3b77828..e85cc4f 100644
--- a/gdatastore/datastore.py
+++ b/gdatastore/datastore.py
@@ -268,7 +268,7 @@ class DBusApiSugarV2(dbus.service.Object):
parent = latest_versions[0]
object_id = parent['tree_id'], parent['version_id']
- if self._compare_checksums(parent, file_path):
+ if self._check_identical(parent, file_path):
self._internal_api.change_metadata(object_id, props)
return success_cb(uid, None)
@@ -366,19 +366,22 @@ class DBusApiSugarV2(dbus.service.Object):
return self._internal_api.find({'tree_id': uid},
{'limit': 1, 'order_by': ['+timestamp']})[0]
- def _compare_checksums(self, parent, child_data_path):
+ def _check_identical(self, parent, child_data_path):
+ """Check whether the new version contains the same data as the parent
+
+ If child_data_path is empty, but the parent contains data, that's
+ interpreted as wanting to do a metadata-only update (emulating
+ sugar-datastore behaviour).
+ """
parent_object_id = (parent['tree_id'], parent['version_id'])
parent_data_path = self._internal_api.get_data_path(parent_object_id)
- if bool(child_data_path) ^ bool(parent_data_path):
- return False
- elif not child_data_path:
+ if not child_data_path:
return True
+ elif child_data_path and not parent_data_path:
+ return False
+ # TODO: compare checksums?
return False
- parent_checksum = self._internal_api.get_data_checksum(
- parent_object_id)
- child_checksum = calculate_checksum(child_data_path)
- return parent_checksum == child_checksum
def __change_metadata_cb(self, (tree_id, version_id), metadata):
self.Updated(tree_id)