]> granicus.if.org Git - git/commitdiff
setup.c: detect $GIT_COMMON_DIR in is_git_directory()
authorNguyễn Thái Ngọc Duy <pclouds@gmail.com>
Sun, 30 Nov 2014 08:24:41 +0000 (15:24 +0700)
committerJunio C Hamano <gitster@pobox.com>
Mon, 1 Dec 2014 19:00:14 +0000 (11:00 -0800)
If the file "$GIT_DIR/commondir" exists, it contains the value of
$GIT_COMMON_DIR.

Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Documentation/gitrepository-layout.txt
setup.c

index 2b5966a4038220eb04d622401b80d9eb8133ac34..2dc5667a0c78fd7ab10dbd47e5e2a6d57a52ae4e 100644 (file)
@@ -240,6 +240,13 @@ shallow::
        file is ignored if $GIT_COMMON_DIR is set and
        "$GIT_COMMON_DIR/shallow" will be used instead.
 
+commondir::
+       If this file exists, $GIT_COMMON_DIR (see linkgit:git[1]) will
+       be set to the path specified in this file if it is not
+       explicitly set. If the specified path is relative, it is
+       relative to $GIT_DIR. The repository with commondir is
+       incomplete without the repository pointed by "commondir".
+
 modules::
        Contains the git-repositories of the submodules. This
        directory is ignored if $GIT_COMMON_DIR is set and
diff --git a/setup.c b/setup.c
index afd6742cd789e910761e96b4338baa82aae14e5e..6c52f7585399edca9088f2b6f269b49bba8f6d6a 100644 (file)
--- a/setup.c
+++ b/setup.c
@@ -224,6 +224,33 @@ void verify_non_filename(const char *prefix, const char *arg)
            "'git <command> [<revision>...] -- [<file>...]'", arg);
 }
 
+static void get_common_dir(struct strbuf *sb, const char *gitdir)
+{
+       struct strbuf data = STRBUF_INIT;
+       struct strbuf path = STRBUF_INIT;
+       const char *git_common_dir = getenv(GIT_COMMON_DIR_ENVIRONMENT);
+       if (git_common_dir) {
+               strbuf_addstr(sb, git_common_dir);
+               return;
+       }
+       strbuf_addf(&path, "%s/commondir", gitdir);
+       if (file_exists(path.buf)) {
+               if (strbuf_read_file(&data, path.buf, 0) <= 0)
+                       die_errno(_("failed to read %s"), path.buf);
+               while (data.len && (data.buf[data.len - 1] == '\n' ||
+                                   data.buf[data.len - 1] == '\r'))
+                       data.len--;
+               data.buf[data.len] = '\0';
+               strbuf_reset(&path);
+               if (!is_absolute_path(data.buf))
+                       strbuf_addf(&path, "%s/", gitdir);
+               strbuf_addbuf(&path, &data);
+               strbuf_addstr(sb, real_path(path.buf));
+       } else
+               strbuf_addstr(sb, gitdir);
+       strbuf_release(&data);
+       strbuf_release(&path);
+}
 
 /*
  * Test if it looks like we're at a git directory.
@@ -242,13 +269,22 @@ int is_git_directory(const char *suspect)
        int ret = 0;
        size_t len;
 
-       strbuf_addstr(&path, suspect);
+       /* Check worktree-related signatures */
+       strbuf_addf(&path, "%s/HEAD", suspect);
+       if (validate_headref(path.buf))
+               goto done;
+
+       strbuf_reset(&path);
+       get_common_dir(&path, suspect);
        len = path.len;
+
+       /* Check non-worktree-related signatures */
        if (getenv(DB_ENVIRONMENT)) {
                if (access(getenv(DB_ENVIRONMENT), X_OK))
                        goto done;
        }
        else {
+               strbuf_setlen(&path, len);
                strbuf_addstr(&path, "/objects");
                if (access(path.buf, X_OK))
                        goto done;
@@ -259,11 +295,6 @@ int is_git_directory(const char *suspect)
        if (access(path.buf, X_OK))
                goto done;
 
-       strbuf_setlen(&path, len);
-       strbuf_addstr(&path, "/HEAD");
-       if (validate_headref(path.buf))
-               goto done;
-
        ret = 1;
 done:
        strbuf_release(&path);