]> git.ipfire.org Git - thirdparty/git.git/commitdiff
enter_repo: allow .git files in strict mode
authorNguyễn Thái Ngọc Duy <pclouds@gmail.com>
Mon, 28 Sep 2015 13:06:14 +0000 (20:06 +0700)
committerJunio C Hamano <gitster@pobox.com>
Mon, 28 Sep 2015 17:46:33 +0000 (10:46 -0700)
Strict mode is about not guessing where .git is. If the user points to a
.git file, we know exactly where the target .git dir will be. This makes
it possible to serve .git files as repository on the server side.

This may be needed even in local clone case because transport.c code
uses upload-pack for fetching remote refs. But right now the
clone/transport code goes with non-strict.

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 7340e11d7db833c7653d33163294217670e4d170..a34613446230751380df4ee1921f3d0d8d749458 100644 (file)
--- a/path.c
+++ b/path.c
@@ -438,8 +438,13 @@ const char *enter_repo(const char *path, int strict)
                        return NULL;
                path = validated_path;
        }
-       else if (chdir(path))
-               return NULL;
+       else {
+               const char *gitfile = read_gitfile(path);
+               if (gitfile)
+                       path = gitfile;
+               if (chdir(path))
+                       return NULL;
+       }
 
        if (is_git_directory(".")) {
                set_git_dir(".");
index 2e709cc969b87cecea0d91dc0f6976b589d366e5..9670e8cbe6cb9a9faa3519b0f11dc16713496188 100755 (executable)
@@ -148,4 +148,14 @@ test_expect_success 'enter_repo linked checkout' '
        test_cmp expected actual
 '
 
+test_expect_success 'enter_repo strict mode' '
+       git ls-remote --upload-pack="git upload-pack --strict" foo/.git >actual &&
+       cat >expected <<-\EOF &&
+       946e985ab20de757ca5b872b16d64e92ff3803a9        HEAD
+       946e985ab20de757ca5b872b16d64e92ff3803a9        refs/heads/master
+       946e985ab20de757ca5b872b16d64e92ff3803a9        refs/tags/foo
+       EOF
+       test_cmp expected actual
+'
+
 test_done