Executing `git-rev-parse --git-common-dir` from the root of the main
worktree results in '.git', which is the relative path to the git dir.
When executed from a subpath of the main tree it returned somthing like:
'sub/path/.git'.  Change this to return the proper relative path to the
git directory (similar to `--show-cdup`).

Add as test to t1500-rev-parse.sh for this case and adjust another test
in t2027-worktree-list.sh to use this expectation.

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

diff --git a/builtin/rev-parse.c b/builtin/rev-parse.c
index c961b74..c2918e1 100644
--- a/builtin/rev-parse.c
+++ b/builtin/rev-parse.c
@@ -787,8 +787,18 @@ 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()));
+                               const char *git_common_dir = 
get_git_common_dir();
+                               if (prefix && 
!is_absolute_path(git_common_dir)) {
+                                       const char *pfx = prefix;
+                                       while (pfx) {
+                                               pfx = strchr(pfx, '/');
+                                               if (pfx) {
+                                                       pfx++;
+                                                       printf("../");
+                                               }
+                                       }
+                               }
+                               printf("%s\n", git_common_dir);
                                continue;
                        }
                        if (!strcmp(arg, "--is-inside-git-dir")) {
diff --git a/t/t1500-rev-parse.sh b/t/t1500-rev-parse.sh
index 48ee077..2023208 100755
--- a/t/t1500-rev-parse.sh
+++ b/t/t1500-rev-parse.sh
@@ -3,6 +3,16 @@
 test_description='test git rev-parse'
 . ./test-lib.sh
 
+test_expect_success 'git-common-dir inside sub-dir' '
+   (
+               mkdir -p path/to/child &&
+               cd path/to/child &&
+               echo "$(git rev-parse --show-cdup).git" >expect &&
+               git rev-parse --git-common-dir >actual &&
+               test_cmp expect actual
+       )
+'
+
 test_rev_parse() {
        name=$1
        shift
diff --git a/t/t2027-worktree-list.sh b/t/t2027-worktree-list.sh
index 1b1b65a..3780b14 100755
--- a/t/t2027-worktree-list.sh
+++ b/t/t2027-worktree-list.sh
@@ -14,7 +14,7 @@ test_expect_success 'rev-parse --git-common-dir on main 
worktree' '
        test_cmp expected actual &&
        mkdir sub &&
        git -C sub rev-parse --git-common-dir >actual2 &&
-       echo sub/.git >expected2 &&
+       echo ../.git >expected2 &&
        test_cmp expected2 actual2
 '
 
-- 
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