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-04-09 10:19:26 (GMT)
committer Sascha Silbe <sascha-pgp@silbe.org>2011-04-09 10:19:26 (GMT)
commitf4d217831054b8fb63181697efce07c9147c8a25 (patch)
tree4e7d6daf9aed9735e4a58c063f35d1d1d3e60d37
parentc7d8a1b1864116159d82e6fc90fe1bac218cd8f9 (diff)
initialise git repository
-rw-r--r--src/gdatastore/datastore.py33
1 files changed, 33 insertions, 0 deletions
diff --git a/src/gdatastore/datastore.py b/src/gdatastore/datastore.py
index 5593432..f4cd79e 100644
--- a/src/gdatastore/datastore.py
+++ b/src/gdatastore/datastore.py
@@ -18,6 +18,8 @@ Gdatastore D-Bus service API
import hashlib
import logging
+import os
+from subprocess import Popen, PIPE
import uuid
import dbus
@@ -32,6 +34,18 @@ DS_DBUS_INTERFACE_SUGAR_V2 = 'org.laptop.sugar.DataStore2'
DS_OBJECT_PATH_SUGAR_V2 = '/org/laptop/sugar/DataStore2'
+class GitError(Exception):
+ def __init__(self, rc, stderr):
+ self.rc = rc
+ self.stderr = unicode(stderr)
+
+ def __unicode__(self):
+ return u'Git returned with exit code #%d: %s' % (self.rc, self.stderr)
+
+ def __str__(self):
+ return self.__unicode__()
+
+
class DBusApiSugarV1(dbus.service.Object):
"""Compatibility layer for the old Sugar data store D-Bus API
"""
@@ -198,10 +212,12 @@ class DBusApiSugarV1(dbus.service.Object):
class InternalApi(object):
def __init__(self, base_dir):
self._base_dir = base_dir
+ self._git_dir = os.path.join(base_dir, 'git')
gconf_client = gconf.client_get_default()
self._max_versions = gconf_client.get_int(
'/desktop/sugar/datastore/max_versions')
logging.debug('max_versions=%r', self._max_versions)
+ self._migrate()
def stop(self):
return
@@ -237,6 +253,23 @@ class InternalApi(object):
def delete(self, (tree_id, version_id)):
logging.debug('delete((%r, %r))', tree_id, version_id)
+ def _migrate(self):
+ if not os.path.exists(self._git_dir):
+ return self._create_repo()
+
+ def _create_repo(self):
+ os.makedirs(self._git_dir)
+ self._git_call('init', ['-q', '--bare'])
+
+ def _git_call(self, command, args=[], input=None, input_fd=None):
+ pipe = Popen(['git', command] + args, stdin=input_fd or PIPE,
+ stdout=PIPE, stderr=PIPE, close_fds=True,
+ cwd=self._git_dir)
+ stdout, stderr = pipe.communicate(input)
+ if pipe.returncode:
+ raise GitError(pipe.returncode, stderr)
+ return stdout
+
def _check_max_versions(self, tree_id):
if not self._max_versions:
return