From f4d217831054b8fb63181697efce07c9147c8a25 Mon Sep 17 00:00:00 2001 From: Sascha Silbe Date: Sat, 09 Apr 2011 10:19:26 +0000 Subject: initialise git repository --- 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 -- cgit v0.9.1