From 16a13276f26e2b4b0cad35c66a527bb8d128d587 Mon Sep 17 00:00:00 2001 From: Sebastian Thiel Date: Fri, 8 Jul 2011 10:28:17 +0200 Subject: Added basic frame for pygit2 - it just needs some basic methods to be implemented now - depending on the performance, it might actually receive some more work --- git/db/pygit2/complex.py | 90 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 90 insertions(+) create mode 100644 git/db/pygit2/complex.py (limited to 'git/db/pygit2/complex.py') diff --git a/git/db/pygit2/complex.py b/git/db/pygit2/complex.py new file mode 100644 index 00000000..67635a1e --- /dev/null +++ b/git/db/pygit2/complex.py @@ -0,0 +1,90 @@ + +__all__ = ['Pygit2GitODB', 'Pygit2GitDB', 'Pygit2CompatibilityGitDB'] + +from git.db.py.complex import PureGitODB +from git.db.py.base import ( + PureRepositoryPathsMixin, + PureConfigurationMixin, + PureIndexDB, + ) +from git.db.py.resolve import PureReferencesMixin +from git.db.py.transport import PureTransportDB +from git.db.py.submodule import PureSubmoduleDB + +from git.db.cmd.complex import CmdHighLevelRepository, GitCommandMixin +from git.db.compat import RepoCompatibilityInterface + +from pygit2 import Repository as Pygit2Repo + +from git.base import OInfo, OStream +from git.fun import type_id_to_type_map, type_to_type_id_map + +from cStringIO import StringIO +import os + + +class Pygit2GitODB(PureGitODB): + """A full fledged database to read and write object files from all kinds of sources.""" + + def __init__(self, objects_root): + """Initalize this instance""" + PureGitODB.__init__(self, objects_root) + if hasattr(self, 'git_dir'): + wd = self.git_dir + else: + wd = os.path.dirname(objects_root) + #END try to figure out good entry for pygit2 - it needs the .gitdir + print objects_root + print wd + self._py2_repo = Pygit2Repo(wd) + + def __getattr__(self, attr): + try: + # supply LazyMixin with this call first + return super(Pygit2GitODB, self).__getattr__(attr) + except AttributeError: + # now assume its on the pygit2 repository ... for now + return getattr(self._py2_repo, attr) + #END handle attr + + #{ Object DBR + + # def info(self, binsha): + # type_id, uncomp_data = self._py2_repo.object_store.get_raw(binsha) + # return OInfo(binsha, type_id_to_type_map[type_id], len(uncomp_data)) + # + # def stream(self, binsha): + # type_id, uncomp_data = self._py2_repo.object_store.get_raw(binsha) + # return OStream(binsha, type_id_to_type_map[type_id], len(uncomp_data), StringIO(uncomp_data)) + # + # #}END object dbr + # + # #{ Object DBW + # + # def store(self, istream): + # obj = ShaFile.from_raw_string(type_to_type_id_map[istream.type], istream.read()) + # self._py2_repo.object_store.add_object(obj) + # istream.binsha = obj.sha().digest() + # return istream + + #}END object dbw + +class Pygit2GitDB( PureRepositoryPathsMixin, PureConfigurationMixin, + PureReferencesMixin, PureSubmoduleDB, + PureIndexDB, + PureTransportDB, # not fully implemented + GitCommandMixin, + CmdHighLevelRepository, + Pygit2GitODB): # must come last, as it doesn't pass on __init__ with super + + + def __init__(self, root_path): + """Initialize ourselves on the .git directory, or the .git/objects directory.""" + PureRepositoryPathsMixin._initialize(self, root_path) + super(Pygit2GitDB, self).__init__(self.objects_dir) + + +class Pygit2CompatibilityGitDB(RepoCompatibilityInterface, Pygit2GitDB): + """Basic pygit2 compatibility database""" + pass + -- cgit v1.2.1 From a5a0fa2d3befd21534de91e4e2013fbe885995c6 Mon Sep 17 00:00:00 2001 From: Sebastian Thiel Date: Fri, 8 Jul 2011 17:34:19 +0200 Subject: Fixed up tests to actually use pygit2. Its worth noting that the performance tests only work reliably in a patched up version, or the next point release. --- git/db/pygit2/complex.py | 33 ++++++++++++++++++--------------- 1 file changed, 18 insertions(+), 15 deletions(-) (limited to 'git/db/pygit2/complex.py') diff --git a/git/db/pygit2/complex.py b/git/db/pygit2/complex.py index 67635a1e..c1563bca 100644 --- a/git/db/pygit2/complex.py +++ b/git/db/pygit2/complex.py @@ -17,7 +17,8 @@ from git.db.compat import RepoCompatibilityInterface from pygit2 import Repository as Pygit2Repo from git.base import OInfo, OStream -from git.fun import type_id_to_type_map, type_to_type_id_map +from git.fun import type_id_to_type_map, type_to_type_id_map +from git.util import hex_to_bin from cStringIO import StringIO import os @@ -49,23 +50,25 @@ class Pygit2GitODB(PureGitODB): #{ Object DBR - # def info(self, binsha): - # type_id, uncomp_data = self._py2_repo.object_store.get_raw(binsha) - # return OInfo(binsha, type_id_to_type_map[type_id], len(uncomp_data)) - # - # def stream(self, binsha): - # type_id, uncomp_data = self._py2_repo.object_store.get_raw(binsha) - # return OStream(binsha, type_id_to_type_map[type_id], len(uncomp_data), StringIO(uncomp_data)) - # + def info(self, binsha): + type_id, uncomp_data = self._py2_repo.read(binsha) + return OInfo(binsha, type_id_to_type_map[type_id], len(uncomp_data)) + + def stream(self, binsha): + type_id, uncomp_data = self._py2_repo.read(binsha) + return OStream(binsha, type_id_to_type_map[type_id], len(uncomp_data), StringIO(uncomp_data)) + # #}END object dbr # # #{ Object DBW - # - # def store(self, istream): - # obj = ShaFile.from_raw_string(type_to_type_id_map[istream.type], istream.read()) - # self._py2_repo.object_store.add_object(obj) - # istream.binsha = obj.sha().digest() - # return istream + def store(self, istream): + # TODO: remove this check once the required functionality was merged in pygit2 + if hasattr(self._py2_repo, 'write'): + istream.binsha = hex_to_bin(self._py2_repo.write(type_to_type_id_map[istream.type], istream.read())) + return istream + else: + return super(Pygit2GitODB, self).store(istream) + #END handle write support #}END object dbw -- cgit v1.2.1