summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorniyaton <niyaton@gmail.com>2013-02-25 01:22:30 +0900
committerniyaton <niyaton@gmail.com>2013-02-27 15:55:24 +0900
commit53b65e074e4d62ea5d0251b37c35fd055e403110 (patch)
tree3032d352cf8493e32eed1f911730f1081eefa5d5
parent0b820e617ab21b372394bf12129c30174f57c5d7 (diff)
downloadgitpython-53b65e074e4d62ea5d0251b37c35fd055e403110.tar.gz
Added support for separeted git dir.
-rw-r--r--git/repo/base.py6
-rw-r--r--git/repo/fun.py11
2 files changed, 17 insertions, 0 deletions
diff --git a/git/repo/base.py b/git/repo/base.py
index 20c96b22..7dcf409d 100644
--- a/git/repo/base.py
+++ b/git/repo/base.py
@@ -32,6 +32,7 @@ from gitdb.util import (
from fun import (
rev_parse,
is_git_dir,
+ read_gitfile,
touch
)
@@ -113,6 +114,11 @@ class Repo(object):
self.git_dir = gitpath
self._working_tree_dir = curpath
break
+ gitpath = read_gitfile(gitpath)
+ if gitpath:
+ self.git_dir = gitpath
+ self._working_tree_dir = curpath
+ break
curpath, dummy = os.path.split(curpath)
if not dummy:
break
diff --git a/git/repo/fun.py b/git/repo/fun.py
index 03d55716..86d3c6a9 100644
--- a/git/repo/fun.py
+++ b/git/repo/fun.py
@@ -30,6 +30,17 @@ def is_git_dir(d):
os.readlink(headref).startswith('refs'))
return False
+def read_gitfile(f):
+ """ This is taken from the git setup.c:read_gitfile function.
+ :return gitdir path or None if gitfile is invalid."""
+
+ if not isfile(f):
+ return None
+ line = open(f, 'r').readline().rstrip()
+ if line[0:8] != 'gitdir: ':
+ return None
+ path = os.path.realpath(line[8:])
+ return path if is_git_dir(path) else None
def short_to_long(odb, hexsha):
""":return: long hexadecimal sha1 from the given less-than-40 byte hexsha