Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/gdatastore/datastore.py
diff options
context:
space:
mode:
Diffstat (limited to 'gdatastore/datastore.py')
-rw-r--r--gdatastore/datastore.py31
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)]