diff options
author | Sebastian Thiel <byronimo@gmail.com> | 2011-07-08 17:35:54 +0200 |
---|---|---|
committer | Sebastian Thiel <byronimo@gmail.com> | 2011-07-08 17:35:54 +0200 |
commit | a84856911d05e9877ef46713c1d20bc02482665f (patch) | |
tree | 3287cf74ceba287fd9403b6d4da89ad089789b74 /git/db | |
parent | 023dc1244c02d415bb964eeb0b51b257523897df (diff) | |
parent | a5a0fa2d3befd21534de91e4e2013fbe885995c6 (diff) | |
download | gitpython-a84856911d05e9877ef46713c1d20bc02482665f.tar.gz |
Merge branch 'pygit2'
Diffstat (limited to 'git/db')
-rw-r--r-- | git/db/interface.py | 4 | ||||
-rw-r--r-- | git/db/py/base.py | 4 | ||||
-rw-r--r-- | git/db/pygit2/__init__.py | 11 | ||||
-rw-r--r-- | git/db/pygit2/complex.py | 93 |
4 files changed, 110 insertions, 2 deletions
diff --git a/git/db/interface.py b/git/db/interface.py index 9ad74cc1..2ff44f26 100644 --- a/git/db/interface.py +++ b/git/db/interface.py @@ -164,7 +164,9 @@ class RootPathDB(object): def db_path(self, rela_path): """ :return: the given relative path relative to our database root, allowing - to pontentially access datafiles""" + to pontentially access datafiles + :param rela_path: if not None or '', the relative path will be appended + to the database root path. Otherwise you will obtain the database root path itself""" raise NotImplementedError() #} END interface diff --git a/git/db/py/base.py b/git/db/py/base.py index 49f28a8d..d34e8b12 100644 --- a/git/db/py/base.py +++ b/git/db/py/base.py @@ -108,7 +108,9 @@ class PureRootPathDB(RootPathDB): def root_path(self): return self._root_path - def db_path(self, rela_path): + def db_path(self, rela_path=None): + if not rela_path: + return self._root_path return join(self._root_path, rela_path) #} END interface diff --git a/git/db/pygit2/__init__.py b/git/db/pygit2/__init__.py new file mode 100644 index 00000000..af005662 --- /dev/null +++ b/git/db/pygit2/__init__.py @@ -0,0 +1,11 @@ +"""Pygit2 module initialization""" + +def init_pygit2(): + """:raise ImportError: if pygit2 is not present""" + try: + import pygit2 + except ImportError: + raise ImportError("Could not find 'pygit2' in the PYTHONPATH - pygit2 functionality is not available") + #END handle pygit2 import + +init_pygit2() diff --git a/git/db/pygit2/complex.py b/git/db/pygit2/complex.py new file mode 100644 index 00000000..c1563bca --- /dev/null +++ b/git/db/pygit2/complex.py @@ -0,0 +1,93 @@ + +__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 git.util import hex_to_bin + +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.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): + # 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 + +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 + |