completion: treat dangling symrefs as existing pseudorefs
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>
Patrick Steinhardt committed
Jan 15, 2024 at 11:36 UTC
020e0a087f2101182343936b8d58f0b4c96e96df
2 files changed
+5
-1
contrib/completion/git-completion.bash
+1
-1
@@ -148,7 +148,7 @@ __git_pseudoref_exists ()
148
# platforms.
149
if __git_eread "$__git_repo_path/HEAD" head; then
150
if [ "$head" == "ref: refs/heads/.invalid" ]; then
151
- __git rev-parse --verify --quiet "$ref" >/dev/null
151
+ __git show-ref --exists "$ref"
152
return $?
153
fi
154
fi
t/t9902-completion.sh
+4
@@ -2743,6 +2743,10 @@ test_expect_success '__git_pseudoref_exists' '
2743
cd repo &&
2744
sane_unset __git_repo_path &&
2745
2746
+ # HEAD should exist, even if it points to an unborn branch.
2747
+ __git_pseudoref_exists HEAD >output 2>&1 &&
2748
+ test_must_be_empty output &&
2749
+
2750
# HEAD points to an existing branch, so it should exist.
2751
test_commit A &&
2752
__git_pseudoref_exists HEAD >output 2>&1 &&