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:
committed by
Junio C Hamano
parent
5c12f642df
commit
69a775963b
@ -347,12 +347,16 @@ __git_refs ()
|
|||||||
local format refs pfx
|
local format refs pfx
|
||||||
|
|
||||||
if [ -n "$remote" ]; then
|
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"
|
dir="$remote/.git"
|
||||||
elif [ -d "$remote" ]; then
|
elif [ -d "$remote" ]; then
|
||||||
dir="$remote"
|
dir="$remote"
|
||||||
else
|
else
|
||||||
list_refs_from=remote
|
list_refs_from=url
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
@ -435,6 +439,18 @@ __git_remotes ()
|
|||||||
git --git-dir="$d" remote
|
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_list_merge_strategies ()
|
||||||
{
|
{
|
||||||
git merge -s help 2>&1 |
|
git merge -s help 2>&1 |
|
||||||
|
|||||||
@ -373,6 +373,15 @@ test_expect_success '__git_remotes - list remotes from $GIT_DIR/remotes and from
|
|||||||
test_cmp expect actual
|
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' '
|
test_expect_success 'setup for ref completion' '
|
||||||
git commit --allow-empty -m initial &&
|
git commit --allow-empty -m initial &&
|
||||||
git branch matching-branch &&
|
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_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 &&
|
cat >expected <<-EOF &&
|
||||||
HEAD
|
HEAD
|
||||||
branch-in-other
|
branch-in-other
|
||||||
|
|||||||
Reference in New Issue
Block a user