diff options
Diffstat (limited to 'gdatastore/datastore.py')
-rw-r--r-- | gdatastore/datastore.py | 31 |
1 files changed, 19 insertions, 12 deletions
diff --git a/gdatastore/datastore.py b/gdatastore/datastore.py index a33aca8..345ca77 100644 --- a/gdatastore/datastore.py +++ b/gdatastore/datastore.py @@ -542,8 +542,8 @@ class InternalApi(object): old_metadata = self._index.retrieve(object_id)['metadata'] metadata['creation_time'] = old_metadata['creation_time'] - self._update_metadata_in_git(object_id, metadata) - self._index.store(object_id, metadata) + commit_id = self._update_metadata_in_git(object_id, metadata) + self._index.store(object_id, metadata, commit_id) self._invoke_callbacks('change_metadata', object_id, metadata) def delete(self, object_id): @@ -653,8 +653,9 @@ class InternalApi(object): # TODO: check metadata for validity first (index?) self._log_store((tree_id, child_id)) - self._store_entry_in_git(tree_id, child_id, parent_id, path, metadata) - self._index.store((tree_id, child_id), metadata) + commit_id = self._store_entry_in_git(tree_id, child_id, parent_id, + path, metadata) + self._index.store((tree_id, child_id), metadata, commit_id) self._invoke_callbacks('save', tree_id, child_id, parent_id, metadata) if delete_after and path: @@ -733,15 +734,17 @@ class InternalApi(object): Log the last object after finishing the rebuild. """ last_object_id = None - for object_id in self._get_object_ids_from_git(): + for object_id, commit_id in self._get_object_ids_from_git(): last_object_id = object_id - logging.debug('reindex(): checking entry %r', object_id) - if self._index.contains(object_id): + logging.debug('reindex(): checking entry %r (commit %r)', + object_id, commit_id) + if self._index.contains(object_id, commit_id): continue - logging.debug('reindex(): adding entry %r from git', object_id) + logging.debug('reindex(): (re-)adding entry %r from git', + object_id) metadata = self._get_metadata_from_git(object_id) - self._index.store(object_id, metadata) + self._index.store(object_id, metadata, commit_id) if last_object_id: self._log_store(last_object_id) @@ -801,6 +804,7 @@ class InternalApi(object): input=commit_message).strip() self._git_call('update-ref', [_format_ref(tree_id, version_id), commit_hash]) + return commit_hash def _write_tree(self, path): if not path: @@ -823,6 +827,7 @@ class InternalApi(object): commit_hash = self._git_call('commit-tree', ['-p', ref, tree_hash], input=commit_message).strip() self._git_call('update-ref', [ref, commit_hash]) + return commit_hash def _get_tree_hash(self, object_id): args = ['commit', _format_ref(*object_id)] @@ -830,10 +835,12 @@ class InternalApi(object): return self._git_call('cat-file', args).split('\n', 1)[0].split(' ')[1] def _get_object_ids_from_git(self): - args = ['--sort=committerdate', '--format=%(refname)', + args = ['--sort=committerdate', '--format=%(refname) %(objectname)', 'refs/gdatastore/*/*'] - return [tuple(line.rsplit('/', 2)[1:]) - for line in self._git_call('for-each-ref', args).split()] + lines = self._git_call('for-each-ref', args).strip().split('\n') + ref_commits = [line.split(' ') for line in lines] + return [(tuple(ref.rsplit('/', 2)[1:]), commit_id) + for ref, commit_id in ref_commits] def _get_metadata_from_git(self, object_id): args = ['commit', _format_ref(*object_id)] |