mirror of
https://github.com/git/git.git
synced 2024-11-27 20:14:30 +08:00
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:
parent
5c12f642df
commit
69a775963b
@ -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 |
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user