bash completion: Resolve git show ref:path<tab> losing ref: portion
Linus reported that the bash completion for git show often dropped the ref portion of the argument (stuff before the :) when trying to complete a file name of a file in another branch or tag. Björn Steinbrink tracked it down to the gvfs completion script which comes standard on many Fedora Core based systems. That is removing : from COMP_WORDBREAKS, making readline treat the entire argument (including the ref) as the name that must be completed. When the git completion routines supplied a completion of just the filename, readline replaced everything. Since Git users often need to use "ref:path" or "ref:ref" sort of arguments, and expect completion support on both sides of the : we really want the : in COMP_WORDBREAKS to provide a good user experience. This is also the default that ships with bash as it can be useful in other contexts, such as rcp/scp. We now try to add : back to COMP_WORDBREAKS if it has been removed by a script that loaded before us. However if this doesn't work (as the : is stripped after we load) we fallback in the completion routines to include "ref:" as part of the prefix for completions, allowing readine to fully insert the argument the user wanted. Signed-off-by: Shawn O. Pearce <spearce@spearce.org> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
parent
778306e405
commit
db8a9ff038
@ -45,6 +45,11 @@
|
|||||||
# git@vger.kernel.org
|
# git@vger.kernel.org
|
||||||
#
|
#
|
||||||
|
|
||||||
|
case "$COMP_WORDBREAKS" in
|
||||||
|
*:*) : great ;;
|
||||||
|
*) COMP_WORDBREAKS="$COMP_WORDBREAKS:"
|
||||||
|
esac
|
||||||
|
|
||||||
__gitdir ()
|
__gitdir ()
|
||||||
{
|
{
|
||||||
if [ -z "$1" ]; then
|
if [ -z "$1" ]; then
|
||||||
@ -294,6 +299,12 @@ __git_complete_file ()
|
|||||||
ls="$ref"
|
ls="$ref"
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
|
|
||||||
|
case "$COMP_WORDBREAKS" in
|
||||||
|
*:*) : great ;;
|
||||||
|
*) pfx="$ref:$pfx" ;;
|
||||||
|
esac
|
||||||
|
|
||||||
local IFS=$'\n'
|
local IFS=$'\n'
|
||||||
COMPREPLY=($(compgen -P "$pfx" \
|
COMPREPLY=($(compgen -P "$pfx" \
|
||||||
-W "$(git --git-dir="$(__gitdir)" ls-tree "$ls" \
|
-W "$(git --git-dir="$(__gitdir)" ls-tree "$ls" \
|
||||||
@ -700,7 +711,12 @@ _git_fetch ()
|
|||||||
*)
|
*)
|
||||||
case "$cur" in
|
case "$cur" in
|
||||||
*:*)
|
*:*)
|
||||||
__gitcomp "$(__git_refs)" "" "${cur#*:}"
|
local pfx=""
|
||||||
|
case "$COMP_WORDBREAKS" in
|
||||||
|
*:*) : great ;;
|
||||||
|
*) pfx="${cur%%:*}:" ;;
|
||||||
|
esac
|
||||||
|
__gitcomp "$(__git_refs)" "$pfx" "${cur#*:}"
|
||||||
;;
|
;;
|
||||||
*)
|
*)
|
||||||
local remote
|
local remote
|
||||||
@ -873,7 +889,14 @@ _git_push ()
|
|||||||
git-push) remote="${COMP_WORDS[1]}" ;;
|
git-push) remote="${COMP_WORDS[1]}" ;;
|
||||||
git) remote="${COMP_WORDS[2]}" ;;
|
git) remote="${COMP_WORDS[2]}" ;;
|
||||||
esac
|
esac
|
||||||
__gitcomp "$(__git_refs "$remote")" "" "${cur#*:}"
|
|
||||||
|
local pfx=""
|
||||||
|
case "$COMP_WORDBREAKS" in
|
||||||
|
*:*) : great ;;
|
||||||
|
*) pfx="${cur%%:*}:" ;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
__gitcomp "$(__git_refs "$remote")" "$pfx" "${cur#*:}"
|
||||||
;;
|
;;
|
||||||
+*)
|
+*)
|
||||||
__gitcomp "$(__git_refs)" + "${cur#+}"
|
__gitcomp "$(__git_refs)" + "${cur#+}"
|
||||||
|
Loading…
x
Reference in New Issue
Block a user