mirror of
https://github.com/git/git.git
synced 2026-03-16 19:50:09 +01:00
Merge branch 'sg/complete-refs' into next
* sg/complete-refs: completion: remove broken dead code from __git_heads() and __git_tags() completion: fast initial completion for config 'remote.*.fetch' value completion: improve ls-remote output filtering in __git_refs_remotes() completion: query only refs/heads/ in __git_refs_remotes() completion: support full refs from remote repositories completion: improve ls-remote output filtering in __git_refs() completion: make refs completion consistent for local and remote repos completion: optimize refs completion completion: document __gitcomp() Conflicts: contrib/completion/git-completion.bash
This commit is contained in:
@@ -485,8 +485,13 @@ _get_comp_words_by_ref ()
|
||||
fi
|
||||
fi
|
||||
|
||||
# __gitcomp accepts 1, 2, 3, or 4 arguments
|
||||
# generates completion reply with compgen
|
||||
# Generates completion reply with compgen, appending a space to possible
|
||||
# completion words, if necessary.
|
||||
# It accepts 1 to 4 arguments:
|
||||
# 1: List of possible completion words.
|
||||
# 2: A prefix to be added to each possible completion word (optional).
|
||||
# 3: Generate possible completion matches for this word (optional).
|
||||
# 4: A suffix to be appended to each possible completion word (optional).
|
||||
__gitcomp ()
|
||||
{
|
||||
local cur_="$cur"
|
||||
@@ -507,42 +512,49 @@ __gitcomp ()
|
||||
esac
|
||||
}
|
||||
|
||||
# __git_heads accepts 0 or 1 arguments (to pass to __gitdir)
|
||||
# Generates completion reply with compgen from newline-separated possible
|
||||
# completion words by appending a space to all of them.
|
||||
# It accepts 1 to 4 arguments:
|
||||
# 1: List of possible completion words, separated by a single newline.
|
||||
# 2: A prefix to be added to each possible completion word (optional).
|
||||
# 3: Generate possible completion matches for this word (optional).
|
||||
# 4: A suffix to be appended to each possible completion word instead of
|
||||
# the default space (optional). If specified but empty, nothing is
|
||||
# appended.
|
||||
__gitcomp_nl ()
|
||||
{
|
||||
local s=$'\n' IFS=' '$'\t'$'\n'
|
||||
local cur_="$cur" suffix=" "
|
||||
|
||||
if [ $# -gt 2 ]; then
|
||||
cur_="$3"
|
||||
if [ $# -gt 3 ]; then
|
||||
suffix="$4"
|
||||
fi
|
||||
fi
|
||||
|
||||
IFS=$s
|
||||
COMPREPLY=($(compgen -P "${2-}" -S "$suffix" -W "$1" -- "$cur_"))
|
||||
}
|
||||
|
||||
__git_heads ()
|
||||
{
|
||||
local cmd i is_hash=y dir="$(__gitdir "${1-}")"
|
||||
local dir="$(__gitdir)"
|
||||
if [ -d "$dir" ]; then
|
||||
git --git-dir="$dir" for-each-ref --format='%(refname:short)' \
|
||||
refs/heads
|
||||
return
|
||||
fi
|
||||
for i in $(git ls-remote "${1-}" 2>/dev/null); do
|
||||
case "$is_hash,$i" in
|
||||
y,*) is_hash=n ;;
|
||||
n,*^{}) is_hash=y ;;
|
||||
n,refs/heads/*) is_hash=y; echo "${i#refs/heads/}" ;;
|
||||
n,*) is_hash=y; echo "$i" ;;
|
||||
esac
|
||||
done
|
||||
}
|
||||
|
||||
# __git_tags accepts 0 or 1 arguments (to pass to __gitdir)
|
||||
__git_tags ()
|
||||
{
|
||||
local cmd i is_hash=y dir="$(__gitdir "${1-}")"
|
||||
local dir="$(__gitdir)"
|
||||
if [ -d "$dir" ]; then
|
||||
git --git-dir="$dir" for-each-ref --format='%(refname:short)' \
|
||||
refs/tags
|
||||
return
|
||||
fi
|
||||
for i in $(git ls-remote "${1-}" 2>/dev/null); do
|
||||
case "$is_hash,$i" in
|
||||
y,*) is_hash=n ;;
|
||||
n,*^{}) is_hash=y ;;
|
||||
n,refs/tags/*) is_hash=y; echo "${i#refs/tags/}" ;;
|
||||
n,*) is_hash=y; echo "$i" ;;
|
||||
esac
|
||||
done
|
||||
}
|
||||
|
||||
# __git_refs accepts 0, 1 (to pass to __gitdir), or 2 arguments
|
||||
@@ -550,7 +562,7 @@ __git_tags ()
|
||||
# by checkout for tracking branches
|
||||
__git_refs ()
|
||||
{
|
||||
local i is_hash=y dir="$(__gitdir "${1-}")" track="${2-}"
|
||||
local i hash dir="$(__gitdir "${1-}")" track="${2-}"
|
||||
local format refs
|
||||
if [ -d "$dir" ]; then
|
||||
case "$cur" in
|
||||
@@ -586,16 +598,27 @@ __git_refs ()
|
||||
fi
|
||||
return
|
||||
fi
|
||||
for i in $(git ls-remote "$dir" 2>/dev/null); do
|
||||
case "$is_hash,$i" in
|
||||
y,*) is_hash=n ;;
|
||||
n,*^{}) is_hash=y ;;
|
||||
n,refs/tags/*) is_hash=y; echo "${i#refs/tags/}" ;;
|
||||
n,refs/heads/*) is_hash=y; echo "${i#refs/heads/}" ;;
|
||||
n,refs/remotes/*) is_hash=y; echo "${i#refs/remotes/}" ;;
|
||||
n,*) is_hash=y; echo "$i" ;;
|
||||
esac
|
||||
done
|
||||
case "$cur" in
|
||||
refs|refs/*)
|
||||
git ls-remote "$dir" "$cur*" 2>/dev/null | \
|
||||
while read hash i; do
|
||||
case "$i" in
|
||||
*^{}) ;;
|
||||
*) echo "$i" ;;
|
||||
esac
|
||||
done
|
||||
;;
|
||||
*)
|
||||
git ls-remote "$dir" HEAD ORIG_HEAD 'refs/tags/*' 'refs/heads/*' 'refs/remotes/*' 2>/dev/null | \
|
||||
while read hash i; do
|
||||
case "$i" in
|
||||
*^{}) ;;
|
||||
refs/*) echo "${i#refs/*/}" ;;
|
||||
*) echo "$i" ;;
|
||||
esac
|
||||
done
|
||||
;;
|
||||
esac
|
||||
}
|
||||
|
||||
# __git_refs2 requires 1 argument (to pass to __git_refs)
|
||||
@@ -610,18 +633,10 @@ __git_refs2 ()
|
||||
# __git_refs_remotes requires 1 argument (to pass to ls-remote)
|
||||
__git_refs_remotes ()
|
||||
{
|
||||
local cmd i is_hash=y
|
||||
for i in $(git ls-remote "$1" 2>/dev/null); do
|
||||
case "$is_hash,$i" in
|
||||
n,refs/heads/*)
|
||||
is_hash=y
|
||||
echo "$i:refs/remotes/$1/${i#refs/heads/}"
|
||||
;;
|
||||
y,*) is_hash=n ;;
|
||||
n,*^{}) is_hash=y ;;
|
||||
n,refs/tags/*) is_hash=y;;
|
||||
n,*) is_hash=y; ;;
|
||||
esac
|
||||
local i hash
|
||||
git ls-remote "$1" 'refs/heads/*' 2>/dev/null | \
|
||||
while read hash i; do
|
||||
echo "$i:refs/remotes/$1/${i#refs/heads/}"
|
||||
done
|
||||
}
|
||||
|
||||
@@ -711,15 +726,15 @@ __git_complete_revlist_file ()
|
||||
*...*)
|
||||
pfx="${cur_%...*}..."
|
||||
cur_="${cur_#*...}"
|
||||
__gitcomp "$(__git_refs)" "$pfx" "$cur_"
|
||||
__gitcomp_nl "$(__git_refs)" "$pfx" "$cur_"
|
||||
;;
|
||||
*..*)
|
||||
pfx="${cur_%..*}.."
|
||||
cur_="${cur_#*..}"
|
||||
__gitcomp "$(__git_refs)" "$pfx" "$cur_"
|
||||
__gitcomp_nl "$(__git_refs)" "$pfx" "$cur_"
|
||||
;;
|
||||
*)
|
||||
__gitcomp "$(__git_refs)"
|
||||
__gitcomp_nl "$(__git_refs)"
|
||||
;;
|
||||
esac
|
||||
}
|
||||
@@ -759,7 +774,7 @@ __git_complete_remote_or_refspec ()
|
||||
c=$((++c))
|
||||
done
|
||||
if [ -z "$remote" ]; then
|
||||
__gitcomp "$(__git_remotes)"
|
||||
__gitcomp_nl "$(__git_remotes)"
|
||||
return
|
||||
fi
|
||||
if [ $no_complete_refspec = 1 ]; then
|
||||
@@ -784,23 +799,23 @@ __git_complete_remote_or_refspec ()
|
||||
case "$cmd" in
|
||||
fetch)
|
||||
if [ $lhs = 1 ]; then
|
||||
__gitcomp "$(__git_refs2 "$remote")" "$pfx" "$cur_"
|
||||
__gitcomp_nl "$(__git_refs2 "$remote")" "$pfx" "$cur_"
|
||||
else
|
||||
__gitcomp "$(__git_refs)" "$pfx" "$cur_"
|
||||
__gitcomp_nl "$(__git_refs)" "$pfx" "$cur_"
|
||||
fi
|
||||
;;
|
||||
pull)
|
||||
if [ $lhs = 1 ]; then
|
||||
__gitcomp "$(__git_refs "$remote")" "$pfx" "$cur_"
|
||||
__gitcomp_nl "$(__git_refs "$remote")" "$pfx" "$cur_"
|
||||
else
|
||||
__gitcomp "$(__git_refs)" "$pfx" "$cur_"
|
||||
__gitcomp_nl "$(__git_refs)" "$pfx" "$cur_"
|
||||
fi
|
||||
;;
|
||||
push)
|
||||
if [ $lhs = 1 ]; then
|
||||
__gitcomp "$(__git_refs)" "$pfx" "$cur_"
|
||||
__gitcomp_nl "$(__git_refs)" "$pfx" "$cur_"
|
||||
else
|
||||
__gitcomp "$(__git_refs "$remote")" "$pfx" "$cur_"
|
||||
__gitcomp_nl "$(__git_refs "$remote")" "$pfx" "$cur_"
|
||||
fi
|
||||
;;
|
||||
esac
|
||||
@@ -1079,7 +1094,7 @@ _git_archive ()
|
||||
return
|
||||
;;
|
||||
--remote=*)
|
||||
__gitcomp "$(__git_remotes)" "" "${cur##--remote=}"
|
||||
__gitcomp_nl "$(__git_remotes)" "" "${cur##--remote=}"
|
||||
return
|
||||
;;
|
||||
--*)
|
||||
@@ -1110,7 +1125,7 @@ _git_bisect ()
|
||||
|
||||
case "$subcommand" in
|
||||
bad|good|reset|skip|start)
|
||||
__gitcomp "$(__git_refs)"
|
||||
__gitcomp_nl "$(__git_refs)"
|
||||
;;
|
||||
*)
|
||||
COMPREPLY=()
|
||||
@@ -1141,9 +1156,9 @@ _git_branch ()
|
||||
;;
|
||||
*)
|
||||
if [ $only_local_ref = "y" -a $has_r = "n" ]; then
|
||||
__gitcomp "$(__git_heads)"
|
||||
__gitcomp_nl "$(__git_heads)"
|
||||
else
|
||||
__gitcomp "$(__git_refs)"
|
||||
__gitcomp_nl "$(__git_refs)"
|
||||
fi
|
||||
;;
|
||||
esac
|
||||
@@ -1190,7 +1205,7 @@ _git_checkout ()
|
||||
if [ -n "$(__git_find_on_cmdline "$flags")" ]; then
|
||||
track=''
|
||||
fi
|
||||
__gitcomp "$(__git_refs '' $track)"
|
||||
__gitcomp_nl "$(__git_refs '' $track)"
|
||||
;;
|
||||
esac
|
||||
}
|
||||
@@ -1207,7 +1222,7 @@ _git_cherry_pick ()
|
||||
__gitcomp "--edit --no-commit"
|
||||
;;
|
||||
*)
|
||||
__gitcomp "$(__git_refs)"
|
||||
__gitcomp_nl "$(__git_refs)"
|
||||
;;
|
||||
esac
|
||||
}
|
||||
@@ -1261,7 +1276,7 @@ _git_commit ()
|
||||
;;
|
||||
--reuse-message=*|--reedit-message=*|\
|
||||
--fixup=*|--squash=*)
|
||||
__gitcomp "$(__git_refs)" "" "${cur#*=}"
|
||||
__gitcomp_nl "$(__git_refs)" "" "${cur#*=}"
|
||||
return
|
||||
;;
|
||||
--untracked-files=*)
|
||||
@@ -1292,7 +1307,7 @@ _git_describe ()
|
||||
"
|
||||
return
|
||||
esac
|
||||
__gitcomp "$(__git_refs)"
|
||||
__gitcomp_nl "$(__git_refs)"
|
||||
}
|
||||
|
||||
__git_diff_common_options="--stat --numstat --shortstat --summary
|
||||
@@ -1458,13 +1473,13 @@ _git_grep ()
|
||||
case "$cword,$prev" in
|
||||
2,*|*,-*)
|
||||
if test -r tags; then
|
||||
__gitcomp "$(__git_match_ctag "$cur" tags)"
|
||||
__gitcomp_nl "$(__git_match_ctag "$cur" tags)"
|
||||
return
|
||||
fi
|
||||
;;
|
||||
esac
|
||||
|
||||
__gitcomp "$(__git_refs)"
|
||||
__gitcomp_nl "$(__git_refs)"
|
||||
}
|
||||
|
||||
_git_help ()
|
||||
@@ -1522,7 +1537,7 @@ _git_ls_files ()
|
||||
|
||||
_git_ls_remote ()
|
||||
{
|
||||
__gitcomp "$(__git_remotes)"
|
||||
__gitcomp_nl "$(__git_remotes)"
|
||||
}
|
||||
|
||||
_git_ls_tree ()
|
||||
@@ -1618,7 +1633,7 @@ _git_merge ()
|
||||
__gitcomp "$__git_merge_options"
|
||||
return
|
||||
esac
|
||||
__gitcomp "$(__git_refs)"
|
||||
__gitcomp_nl "$(__git_refs)"
|
||||
}
|
||||
|
||||
_git_mergetool ()
|
||||
@@ -1638,7 +1653,7 @@ _git_mergetool ()
|
||||
|
||||
_git_merge_base ()
|
||||
{
|
||||
__gitcomp "$(__git_refs)"
|
||||
__gitcomp_nl "$(__git_refs)"
|
||||
}
|
||||
|
||||
_git_mv ()
|
||||
@@ -1669,7 +1684,7 @@ _git_notes ()
|
||||
,*)
|
||||
case "${words[cword-1]}" in
|
||||
--ref)
|
||||
__gitcomp "$(__git_refs)"
|
||||
__gitcomp_nl "$(__git_refs)"
|
||||
;;
|
||||
*)
|
||||
__gitcomp "$subcommands --ref"
|
||||
@@ -1678,7 +1693,7 @@ _git_notes ()
|
||||
;;
|
||||
add,--reuse-message=*|append,--reuse-message=*|\
|
||||
add,--reedit-message=*|append,--reedit-message=*)
|
||||
__gitcomp "$(__git_refs)" "" "${cur#*=}"
|
||||
__gitcomp_nl "$(__git_refs)" "" "${cur#*=}"
|
||||
;;
|
||||
add,--*|append,--*)
|
||||
__gitcomp '--file= --message= --reedit-message=
|
||||
@@ -1697,7 +1712,7 @@ _git_notes ()
|
||||
-m|-F)
|
||||
;;
|
||||
*)
|
||||
__gitcomp "$(__git_refs)"
|
||||
__gitcomp_nl "$(__git_refs)"
|
||||
;;
|
||||
esac
|
||||
;;
|
||||
@@ -1725,12 +1740,12 @@ _git_push ()
|
||||
{
|
||||
case "$prev" in
|
||||
--repo)
|
||||
__gitcomp "$(__git_remotes)"
|
||||
__gitcomp_nl "$(__git_remotes)"
|
||||
return
|
||||
esac
|
||||
case "$cur" in
|
||||
--repo=*)
|
||||
__gitcomp "$(__git_remotes)" "" "${cur##--repo=}"
|
||||
__gitcomp_nl "$(__git_remotes)" "" "${cur##--repo=}"
|
||||
return
|
||||
;;
|
||||
--*)
|
||||
@@ -1768,7 +1783,7 @@ _git_rebase ()
|
||||
|
||||
return
|
||||
esac
|
||||
__gitcomp "$(__git_refs)"
|
||||
__gitcomp_nl "$(__git_refs)"
|
||||
}
|
||||
|
||||
_git_reflog ()
|
||||
@@ -1779,7 +1794,7 @@ _git_reflog ()
|
||||
if [ -z "$subcommand" ]; then
|
||||
__gitcomp "$subcommands"
|
||||
else
|
||||
__gitcomp "$(__git_refs)"
|
||||
__gitcomp_nl "$(__git_refs)"
|
||||
fi
|
||||
}
|
||||
|
||||
@@ -1861,23 +1876,27 @@ _git_config ()
|
||||
{
|
||||
case "$prev" in
|
||||
branch.*.remote)
|
||||
__gitcomp "$(__git_remotes)"
|
||||
__gitcomp_nl "$(__git_remotes)"
|
||||
return
|
||||
;;
|
||||
branch.*.merge)
|
||||
__gitcomp "$(__git_refs)"
|
||||
__gitcomp_nl "$(__git_refs)"
|
||||
return
|
||||
;;
|
||||
remote.*.fetch)
|
||||
local remote="${prev#remote.}"
|
||||
remote="${remote%.fetch}"
|
||||
__gitcomp "$(__git_refs_remotes "$remote")"
|
||||
if [ -z "$cur" ]; then
|
||||
COMPREPLY=("refs/heads/")
|
||||
return
|
||||
fi
|
||||
__gitcomp_nl "$(__git_refs_remotes "$remote")"
|
||||
return
|
||||
;;
|
||||
remote.*.push)
|
||||
local remote="${prev#remote.}"
|
||||
remote="${remote%.push}"
|
||||
__gitcomp "$(git --git-dir="$(__gitdir)" \
|
||||
__gitcomp_nl "$(git --git-dir="$(__gitdir)" \
|
||||
for-each-ref --format='%(refname):%(refname)' \
|
||||
refs/heads)"
|
||||
return
|
||||
@@ -1924,7 +1943,7 @@ _git_config ()
|
||||
return
|
||||
;;
|
||||
--get|--get-all|--unset|--unset-all)
|
||||
__gitcomp "$(__git_config_get_set_variables)"
|
||||
__gitcomp_nl "$(__git_config_get_set_variables)"
|
||||
return
|
||||
;;
|
||||
*.*)
|
||||
@@ -1950,7 +1969,7 @@ _git_config ()
|
||||
;;
|
||||
branch.*)
|
||||
local pfx="${cur%.*}." cur_="${cur#*.}"
|
||||
__gitcomp "$(__git_heads)" "$pfx" "$cur_" "."
|
||||
__gitcomp_nl "$(__git_heads)" "$pfx" "$cur_" "."
|
||||
return
|
||||
;;
|
||||
guitool.*.*)
|
||||
@@ -1979,7 +1998,7 @@ _git_config ()
|
||||
pager.*)
|
||||
local pfx="${cur%.*}." cur_="${cur#*.}"
|
||||
__git_compute_all_commands
|
||||
__gitcomp "$__git_all_commands" "$pfx" "$cur_"
|
||||
__gitcomp_nl "$__git_all_commands" "$pfx" "$cur_"
|
||||
return
|
||||
;;
|
||||
remote.*.*)
|
||||
@@ -1992,7 +2011,7 @@ _git_config ()
|
||||
;;
|
||||
remote.*)
|
||||
local pfx="${cur%.*}." cur_="${cur#*.}"
|
||||
__gitcomp "$(__git_remotes)" "$pfx" "$cur_" "."
|
||||
__gitcomp_nl "$(__git_remotes)" "$pfx" "$cur_" "."
|
||||
return
|
||||
;;
|
||||
url.*.*)
|
||||
@@ -2293,7 +2312,7 @@ _git_remote ()
|
||||
|
||||
case "$subcommand" in
|
||||
rename|rm|show|prune)
|
||||
__gitcomp "$(__git_remotes)"
|
||||
__gitcomp_nl "$(__git_remotes)"
|
||||
;;
|
||||
update)
|
||||
local i c='' IFS=$'\n'
|
||||
@@ -2311,7 +2330,7 @@ _git_remote ()
|
||||
|
||||
_git_replace ()
|
||||
{
|
||||
__gitcomp "$(__git_refs)"
|
||||
__gitcomp_nl "$(__git_refs)"
|
||||
}
|
||||
|
||||
_git_reset ()
|
||||
@@ -2324,7 +2343,7 @@ _git_reset ()
|
||||
return
|
||||
;;
|
||||
esac
|
||||
__gitcomp "$(__git_refs)"
|
||||
__gitcomp_nl "$(__git_refs)"
|
||||
}
|
||||
|
||||
_git_revert ()
|
||||
@@ -2335,7 +2354,7 @@ _git_revert ()
|
||||
return
|
||||
;;
|
||||
esac
|
||||
__gitcomp "$(__git_refs)"
|
||||
__gitcomp_nl "$(__git_refs)"
|
||||
}
|
||||
|
||||
_git_rm ()
|
||||
@@ -2434,7 +2453,7 @@ _git_stash ()
|
||||
COMPREPLY=()
|
||||
;;
|
||||
show,*|apply,*|drop,*|pop,*|branch,*)
|
||||
__gitcomp "$(git --git-dir="$(__gitdir)" stash list \
|
||||
__gitcomp_nl "$(git --git-dir="$(__gitdir)" stash list \
|
||||
| sed -n -e 's/:.*//p')"
|
||||
;;
|
||||
*)
|
||||
@@ -2568,7 +2587,7 @@ _git_tag ()
|
||||
i="${words[c]}"
|
||||
case "$i" in
|
||||
-d|-v)
|
||||
__gitcomp "$(__git_tags)"
|
||||
__gitcomp_nl "$(__git_tags)"
|
||||
return
|
||||
;;
|
||||
-f)
|
||||
@@ -2584,13 +2603,13 @@ _git_tag ()
|
||||
;;
|
||||
-*|tag)
|
||||
if [ $f = 1 ]; then
|
||||
__gitcomp "$(__git_tags)"
|
||||
__gitcomp_nl "$(__git_tags)"
|
||||
else
|
||||
COMPREPLY=()
|
||||
fi
|
||||
;;
|
||||
*)
|
||||
__gitcomp "$(__git_refs)"
|
||||
__gitcomp_nl "$(__git_refs)"
|
||||
;;
|
||||
esac
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user