completion: list refs from remote when remote's name matches a directory

If the remote given to __git_refs() happens to match both the name of
a configured remote and the name of a directory in the current working
directory, then that directory is assumed to be a git repository, and
listing refs from that directory will be attempted.  This is wrong,
because in such a situation git commands (e.g. 'git fetch|pull|push
<remote>' whom these refs will eventually be passed to) give
precedence to the configured remote.  Therefore, __git_refs() should
list refs from the configured remote as well.

Add the helper function __git_is_configured_remote() that checks
whether its argument matches the name of a configured remote.  Use
this helper to decide how to handle the remote passed to __git_refs().

Signed-off-by: SZEDER Gábor <szeder.dev@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
SZEDER Gábor 2017-02-03 03:48:18 +01:00 committed by Junio C Hamano
parent 5c12f642df
commit 69a775963b
2 changed files with 28 additions and 3 deletions

View file

@ -347,12 +347,16 @@ __git_refs ()
local format refs pfx
if [ -n "$remote" ]; then
if [ -d "$remote/.git" ]; then
if __git_is_configured_remote "$remote"; then
# configured remote takes precedence over a
# local directory with the same name
list_refs_from=remote
elif [ -d "$remote/.git" ]; then
dir="$remote/.git"
elif [ -d "$remote" ]; then
dir="$remote"
else
list_refs_from=remote
list_refs_from=url
fi
fi
@ -435,6 +439,18 @@ __git_remotes ()
git --git-dir="$d" remote
}
# Returns true if $1 matches the name of a configured remote, false otherwise.
__git_is_configured_remote ()
{
local remote
for remote in $(__git_remotes); do
if [ "$remote" = "$1" ]; then
return 0
fi
done
return 1
}
__git_list_merge_strategies ()
{
git merge -s help 2>&1 |

View file

@ -373,6 +373,15 @@ test_expect_success '__git_remotes - list remotes from $GIT_DIR/remotes and from
test_cmp expect actual
'
test_expect_success '__git_is_configured_remote' '
test_when_finished "git remote remove remote_1" &&
git remote add remote_1 git://remote_1 &&
test_when_finished "git remote remove remote_2" &&
git remote add remote_2 git://remote_2 &&
verbose __git_is_configured_remote remote_2 &&
test_must_fail __git_is_configured_remote non-existent
'
test_expect_success 'setup for ref completion' '
git commit --allow-empty -m initial &&
git branch matching-branch &&
@ -516,7 +525,7 @@ test_expect_success '__git_refs - configured remote - full refs - repo given on
test_cmp expected "$actual"
'
test_expect_failure '__git_refs - configured remote - remote name matches a directory' '
test_expect_success '__git_refs - configured remote - remote name matches a directory' '
cat >expected <<-EOF &&
HEAD
branch-in-other