]> git.ipfire.org Git - thirdparty/git.git/commitdiff
completion: treat dangling symrefs as existing pseudorefs
authorPatrick Steinhardt <ps@pks.im>
Mon, 15 Jan 2024 10:36:15 +0000 (11:36 +0100)
committerJunio C Hamano <gitster@pobox.com>
Tue, 16 Jan 2024 17:18:21 +0000 (09:18 -0800)
The `__git_pseudoref_exists ()` helper function back to git-rev-parse(1)
in case the reftable backend is in use. This is not in the same spirit
as the simple existence check that the "files" backend does though,
because there we only check for the pseudo-ref to exist with `test -f`.
With git-rev-parse(1) we not only check for existence, but also verify
that the pseudo-ref resolves to an object, which may not be the case
when the pseudo-ref points to an unborn branch.

Fix this issue by using `git show-ref --exists` instead. Note that we do
not have to silence stdout anymore as git-show-ref(1) will not print
anything.

Signed-off-by: Patrick Steinhardt <ps@pks.im>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
contrib/completion/git-completion.bash
t/t9902-completion.sh

index 54ce58f73d70b444db9b0cf0c63d93c358812153..6662db221df9d5088566a283ca7d784548920ace 100644 (file)
@@ -148,7 +148,7 @@ __git_pseudoref_exists ()
        # platforms.
        if __git_eread "$__git_repo_path/HEAD" head; then
                if [ "$head" == "ref: refs/heads/.invalid" ]; then
-                       __git rev-parse --verify --quiet "$ref" >/dev/null
+                       __git show-ref --exists "$ref"
                        return $?
                fi
        fi
index 56dc7343a2e5d7640456564dbadb1c472f746bba..35eb534fdda2735786faf1fa62bb399ddcc52f27 100755 (executable)
@@ -2743,6 +2743,10 @@ test_expect_success '__git_pseudoref_exists' '
                cd repo &&
                sane_unset __git_repo_path &&
 
+               # HEAD should exist, even if it points to an unborn branch.
+               __git_pseudoref_exists HEAD >output 2>&1 &&
+               test_must_be_empty output &&
+
                # HEAD points to an existing branch, so it should exist.
                test_commit A &&
                __git_pseudoref_exists HEAD >output 2>&1 &&