enter_repo: avoid duplicating logic, use is_git_directory() instead
authorNguyễn Thái Ngọc Duy <pclouds@gmail.com>
Mon, 28 Sep 2015 13:06:13 +0000 (20:06 +0700)
committerJunio C Hamano <gitster@pobox.com>
Mon, 28 Sep 2015 17:46:22 +0000 (10:46 -0700)
It matters for linked checkouts where 'refs' directory won't be
available in $GIT_DIR. is_git_directory() knows about $GIT_COMMON_DIR
and can handle this case.

Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
path.c
t/t0002-gitfile.sh
diff --git a/path.c b/path.c
index a536ee329fd63c1e3ab4336d0a1fe019af94cb91..7340e11d7db833c7653d33163294217670e4d170 100644 (file)
--- a/path.c
+++ b/path.c
@@ -441,8 +441,7 @@ const char *enter_repo(const char *path, int strict)
        else if (chdir(path))
                return NULL;
 
-       if (access("objects", X_OK) == 0 && access("refs", X_OK) == 0 &&
-           validate_headref("HEAD") == 0) {
+       if (is_git_directory(".")) {
                set_git_dir(".");
                check_repository_format();
                return path;
index 545bfe29828fb264404d0663f85e173e160b25a0..2e709cc969b87cecea0d91dc0f6976b589d366e5 100755 (executable)
@@ -134,4 +134,18 @@ test_expect_success 'enter_repo non-strict mode' '
        test_cmp expected actual
 '
 
+test_expect_success 'enter_repo linked checkout' '
+       (
+               cd enter_repo &&
+               git worktree add  ../foo refs/tags/foo
+       ) &&
+       git ls-remote foo >actual &&
+       cat >expected <<-\EOF &&
+       946e985ab20de757ca5b872b16d64e92ff3803a9        HEAD
+       946e985ab20de757ca5b872b16d64e92ff3803a9        refs/heads/master
+       946e985ab20de757ca5b872b16d64e92ff3803a9        refs/tags/foo
+       EOF
+       test_cmp expected actual
+'
+
 test_done