From: Michael Rappazzo <rappa...@gmail.com>

On a worktree which is not the primary, using the symbolic-ref 'head' was
incorrectly pointing to the main worktree's HEAD.  The same was true for
any other case of the word 'Head'.

Signed-off-by: Michael Rappazzo <rappa...@gmail.com>
---
 refs.c                   | 8 ++++----
 t/t1415-worktree-refs.sh | 9 +++++++++
 2 files changed, 13 insertions(+), 4 deletions(-)

diff --git a/refs.c b/refs.c
index f9936355cd..963e786458 100644
--- a/refs.c
+++ b/refs.c
@@ -579,7 +579,7 @@ int expand_ref(const char *str, int len, struct object_id 
*oid, char **ref)
                                *ref = xstrdup(r);
                        if (!warn_ambiguous_refs)
                                break;
-               } else if ((flag & REF_ISSYMREF) && strcmp(fullref.buf, 
"HEAD")) {
+               } else if ((flag & REF_ISSYMREF) && strcasecmp(fullref.buf, 
"HEAD")) {
                        warning(_("ignoring dangling symref %s"), fullref.buf);
                } else if ((flag & REF_ISBROKEN) && strchr(fullref.buf, '/')) {
                        warning(_("ignoring broken ref %s"), fullref.buf);
@@ -627,7 +627,7 @@ int dwim_log(const char *str, int len, struct object_id 
*oid, char **log)
 
 static int is_per_worktree_ref(const char *refname)
 {
-       return !strcmp(refname, "HEAD") ||
+       return !strcasecmp(refname, "HEAD") ||
                starts_with(refname, "refs/worktree/") ||
                starts_with(refname, "refs/bisect/") ||
                starts_with(refname, "refs/rewritten/");
@@ -847,7 +847,7 @@ int should_autocreate_reflog(const char *refname)
                return starts_with(refname, "refs/heads/") ||
                        starts_with(refname, "refs/remotes/") ||
                        starts_with(refname, "refs/notes/") ||
-                       !strcmp(refname, "HEAD");
+                       !strcasecmp(refname, "HEAD");
        default:
                return 0;
        }
@@ -855,7 +855,7 @@ int should_autocreate_reflog(const char *refname)
 
 int is_branch(const char *refname)
 {
-       return !strcmp(refname, "HEAD") || starts_with(refname, "refs/heads/");
+       return !strcasecmp(refname, "HEAD") || starts_with(refname, 
"refs/heads/");
 }
 
 struct read_ref_at_cb {
diff --git a/t/t1415-worktree-refs.sh b/t/t1415-worktree-refs.sh
index b664e51250..e7f8a129fd 100755
--- a/t/t1415-worktree-refs.sh
+++ b/t/t1415-worktree-refs.sh
@@ -76,4 +76,13 @@ test_expect_success 'reflog of worktrees/xx/HEAD' '
        test_cmp expected actual.wt2
 '
 
+test_expect_success 'head, Head, and HEAD are the same in worktree' '
+       test_cmp_rev worktree/foo initial &&
+       git -C wt1 rev-parse HEAD >uc_ref.wt1 &&
+       git -C wt1 rev-parse Head >mc_ref.wt1 &&
+       git -C wt1 rev-parse head >lc_ref.wt1 &&
+       test_cmp uc_ref.wt1 lc_ref.wt1 &&
+       test_cmp uc_ref.wt1 mc_ref.wt1
+'
+
 test_done
-- 
gitgitgadget

Reply via email to