Executing `git-rev-parse` with `--git-common-dir`, `--git-path <path>`,
or `--shared-index-path` from the root of the main worktree results in
a relative path to the git dir.

When executed from a subdirectory of the main tree, it can incorrectly
return a path which starts 'sub/path/.git'.  Change this to return the
proper relative path to the git directory.

Related tests marked to expect failure are updated to expect success

Signed-off-by: Michael Rappazzo <rappa...@gmail.com>
---
 builtin/rev-parse.c      | 22 +++++++++++++++++-----
 t/t1500-rev-parse.sh     |  4 ++--
 t/t1700-split-index.sh   |  2 +-
 t/t2027-worktree-list.sh |  4 ++--
 4 files changed, 22 insertions(+), 10 deletions(-)

diff --git a/builtin/rev-parse.c b/builtin/rev-parse.c
index c961b74..40579e0 100644
--- a/builtin/rev-parse.c
+++ b/builtin/rev-parse.c
@@ -564,10 +564,15 @@ int cmd_rev_parse(int argc, const char **argv, const char 
*prefix)
                }
 
                if (!strcmp(arg, "--git-path")) {
+                       struct strbuf sb = STRBUF_INIT;
+                       char *path;
                        if (!argv[i + 1])
                                die("--git-path requires an argument");
-                       puts(git_path("%s", argv[i + 1]));
-                       i++;
+
+                       path = xstrfmt("%s/%s", get_git_dir(), argv[++i]);
+                       puts(relative_path(path, prefix, &sb));
+                       strbuf_release(&sb);
+                       free(path);
                        continue;
                }
                if (as_is) {
@@ -787,8 +792,9 @@ int cmd_rev_parse(int argc, const char **argv, const char 
*prefix)
                                continue;
                        }
                        if (!strcmp(arg, "--git-common-dir")) {
-                               const char *pfx = prefix ? prefix : "";
-                               puts(prefix_filename(pfx, strlen(pfx), 
get_git_common_dir()));
+                               struct strbuf sb = STRBUF_INIT;
+                               puts(relative_path(get_git_common_dir(), 
prefix, &sb));
+                               strbuf_release(&sb);
                                continue;
                        }
                        if (!strcmp(arg, "--is-inside-git-dir")) {
@@ -811,7 +817,13 @@ int cmd_rev_parse(int argc, const char **argv, const char 
*prefix)
                                        die(_("Could not read the index"));
                                if (the_index.split_index) {
                                        const unsigned char *sha1 = 
the_index.split_index->base_sha1;
-                                       puts(git_path("sharedindex.%s", 
sha1_to_hex(sha1)));
+                                       struct strbuf sb = STRBUF_INIT;
+                                       char *path;
+
+                                       path = xstrfmt("%s/sharedindex.%s", 
get_git_dir(), sha1_to_hex(sha1));
+                                       puts(relative_path(path, prefix, &sb));
+                                       strbuf_release(&sb);
+                                       free(path);
                                }
                                continue;
                        }
diff --git a/t/t1500-rev-parse.sh b/t/t1500-rev-parse.sh
index f39f783..d74f09a 100755
--- a/t/t1500-rev-parse.sh
+++ b/t/t1500-rev-parse.sh
@@ -93,7 +93,7 @@ test_expect_success 'git-common-dir from worktree root' '
        test_cmp expect actual
 '
 
-test_expect_failure 'git-common-dir inside sub-dir' '
+test_expect_success 'git-common-dir inside sub-dir' '
        mkdir -p path/to/child &&
        test_when_finished "rm -rf path" &&
        echo "$(git -C path/to/child rev-parse --show-cdup).git" >expect &&
@@ -107,7 +107,7 @@ test_expect_success 'git-path from worktree root' '
        test_cmp expect actual
 '
 
-test_expect_failure 'git-path inside sub-dir' '
+test_expect_success 'git-path inside sub-dir' '
        mkdir -p path/to/child &&
        test_when_finished "rm -rf path" &&
        echo "$(git -C path/to/child rev-parse --show-cdup).git/objects" 
>expect &&
diff --git a/t/t1700-split-index.sh b/t/t1700-split-index.sh
index 8ca21bd..d2d9e02 100755
--- a/t/t1700-split-index.sh
+++ b/t/t1700-split-index.sh
@@ -200,7 +200,7 @@ EOF
        test_cmp expect actual
 '
 
-test_expect_failure 'rev-parse --shared-index-path' '
+test_expect_success 'rev-parse --shared-index-path' '
        rm -rf .git &&
        test_create_repo . &&
        git update-index --split-index &&
diff --git a/t/t2027-worktree-list.sh b/t/t2027-worktree-list.sh
index 53cc5d3..16eec6e 100755
--- a/t/t2027-worktree-list.sh
+++ b/t/t2027-worktree-list.sh
@@ -8,7 +8,7 @@ test_expect_success 'setup' '
        test_commit init
 '
 
-test_expect_failure 'rev-parse --git-common-dir on main worktree' '
+test_expect_success 'rev-parse --git-common-dir on main worktree' '
        git rev-parse --git-common-dir >actual &&
        echo .git >expected &&
        test_cmp expected actual &&
@@ -18,7 +18,7 @@ test_expect_failure 'rev-parse --git-common-dir on main 
worktree' '
        test_cmp expected2 actual2
 '
 
-test_expect_failure 'rev-parse --git-path objects linked worktree' '
+test_expect_success 'rev-parse --git-path objects linked worktree' '
        echo "$(git rev-parse 
--show-toplevel)/.git/worktrees/linked-tree/objects" >expect &&
        test_when_finished "rm -rf linked-tree && git worktree prune" &&
        git worktree add --detach linked-tree master &&
-- 
2.8.0

--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to