Skip to content

Commit f75fc6b

Browse files
committed
fix execution in worktrees in subdirectories of bare repositories
1 parent 7727f87 commit f75fc6b

File tree

3 files changed

+21
-6
lines changed

3 files changed

+21
-6
lines changed

pre_commit/git.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ def get_root() -> str:
6161
'git failed. Is it installed, and are you in a Git repository '
6262
'directory?',
6363
)
64-
if os.path.commonpath((root, git_dir)) == git_dir:
64+
if os.path.samefile(root, git_dir):
6565
raise FatalError(
6666
'git toplevel unexpectedly empty! make sure you are not '
6767
'inside the `.git` directory of your repository.',

tests/git_test.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import pytest
44

55
from pre_commit import git
6+
from pre_commit.error_handler import FatalError
67
from pre_commit.util import cmd_output
78
from testing.util import git_commit
89

@@ -18,6 +19,25 @@ def test_get_root_deeper(in_git_dir):
1819
assert os.path.normcase(git.get_root()) == expected
1920

2021

22+
def test_in_exactly_dot_git(in_git_dir):
23+
with in_git_dir.join('.git').as_cwd(), pytest.raises(FatalError):
24+
git.get_root()
25+
26+
27+
def test_get_root_bare_worktree(tmpdir):
28+
src = tmpdir.join('src').ensure_dir()
29+
cmd_output('git', 'init', str(src))
30+
git_commit(cwd=str(src))
31+
32+
bare = tmpdir.join('bare.git').ensure_dir()
33+
cmd_output('git', 'clone', '--bare', str(src), str(bare))
34+
35+
cmd_output('git', 'worktree', 'add', 'foo', 'HEAD', cwd=bare)
36+
37+
with bare.join('foo').as_cwd():
38+
assert git.get_root() == os.path.abspath('.')
39+
40+
2141
def test_get_staged_files_deleted(in_git_dir):
2242
in_git_dir.join('test').ensure()
2343
cmd_output('git', 'add', 'test')

tests/main_test.py

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -35,11 +35,6 @@ def test_adjust_args_and_chdir_not_in_git_dir(in_tmpdir):
3535
main._adjust_args_and_chdir(_args())
3636

3737

38-
def test_adjust_args_and_chdir_in_dot_git_dir(in_git_dir):
39-
with in_git_dir.join('.git').as_cwd(), pytest.raises(FatalError):
40-
main._adjust_args_and_chdir(_args())
41-
42-
4338
def test_adjust_args_and_chdir_noop(in_git_dir):
4439
args = _args(command='run', files=['f1', 'f2'])
4540
main._adjust_args_and_chdir(args)

0 commit comments

Comments
 (0)