diff options
author | Sebastian Thiel <byronimo@gmail.com> | 2015-08-29 16:19:52 +0200 |
---|---|---|
committer | Sebastian Thiel <byronimo@gmail.com> | 2015-08-29 16:20:28 +0200 |
commit | e8590424997ab1d578c777fe44bf7e4173036f93 (patch) | |
tree | b65d2b954c878ca11439f94f42e52b40437701c7 /git/repo/fun.py | |
parent | 6eb3af27464ffba83e3478b0a0c8b1f9ff190889 (diff) | |
download | gitpython-e8590424997ab1d578c777fe44bf7e4173036f93.tar.gz |
fix(repo): fail loudly if worktrees are used
As GitPython is in maintenance mode, there will be no new features.
However, I believe it's good idea to explicitly state we do not support
certain things if this is the case.
Therefore, when worktrees are encountered, we will throw an specific
exception to indicate that.
The current implementation is hacky to speed up development,
and increases the risk of failing due to false-positive worktree
directories.
Related to #344
Diffstat (limited to 'git/repo/fun.py')
-rw-r--r-- | git/repo/fun.py | 25 |
1 files changed, 16 insertions, 9 deletions
diff --git a/git/repo/fun.py b/git/repo/fun.py index 049800b9..6b06663a 100644 --- a/git/repo/fun.py +++ b/git/repo/fun.py @@ -4,7 +4,7 @@ from string import digits from gitdb.exc import ( BadObject, - BadName + BadName, ) from git.refs import SymbolicReference from git.objects import Object @@ -16,6 +16,7 @@ from gitdb.util import ( hex_to_bin, bin_to_hex ) +from git.exc import WorkTreeRepositoryUnsupported from git.compat import xrange @@ -31,14 +32,20 @@ def touch(filename): def is_git_dir(d): """ This is taken from the git setup.c:is_git_directory - function.""" - if isdir(d) and \ - isdir(join(d, 'objects')) and \ - isdir(join(d, 'refs')): - headref = join(d, 'HEAD') - return isfile(headref) or \ - (os.path.islink(headref) and - os.readlink(headref).startswith('refs')) + function. + + @throws WorkTreeRepositoryUnsupported if it sees a worktree directory. It's quite hacky to do that here, + but at least clearly indicates that we don't support it. + There is the unlikely danger to throw if we see directories which just look like a worktree dir, + but are none.""" + if isdir(d): + if isdir(join(d, 'objects')) and isdir(join(d, 'refs')): + headref = join(d, 'HEAD') + return isfile(headref) or \ + (os.path.islink(headref) and + os.readlink(headref).startswith('refs')) + elif isfile(join(d, 'gitdir')) and isfile(join(d, 'commondir')) and isfile(join(d, 'gitfile')): + raise WorkTreeRepositoryUnsupported(d) return False |