Browse Source

bash: complete 'git diff ...branc<TAB>'

While doing a final sanity check before merging a topic Bsomething, it
is a good idea to review what damage Bsomething branch would make, by
running:

    $ git diff ...Bsomething

Unfortunately, our completion script for 'git diff' doesn't offer
anything after '...'.  This is because 'git diff's completion function
invokes __git_complete_file() for non-option arguments to complete the
'<tree>:<path>' extended SHA-1 notation, but this helper function
doesn't support refs after '...' or '..'.  Completion of refs after
'...' or '..' is supported by the __git_complete_revlist() helper
function, but that doesn't support '<tree>:<path>'.

To support both '...<ref>' and '<tree>:<path>' notations for 'git
diff', this patch, instead of adding yet another helper function,
joins __git_complete_file() and __git_complete_revlist() into the new
common function __git_complete_revlist_file().  The old helper
functions __git_complete_file() and __git_complete_revlist() are
changed to be a direct wrapper around the new
__git_complete_revlist_file(), because they might be used in
user-supplied completion scripts and we don't want to break them.

This change will cause some wrong suggestions for other commands which
use __git_complete_file() ('git diff' and friends) or
__git_complete_revlist() ('git log' and friends), e.g. 'git diff
...master:Doc<TAB>' and 'git log master:Doc<TAB>' will complete the
path to 'Documentation/', although neither commands make any sense.
However, both of these were actively wrong to begin with as soon as
the user entered the ':', so there is no real harm done.

Suggested-by: Junio C Hamano <gitster@pobox.com>
Signed-off-by: SZEDER Gábor <szeder@ira.uka.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
maint
SZEDER Gábor 14 years ago committed by Junio C Hamano
parent
commit
1d66ec587e
  1. 29
      contrib/completion/git-completion.bash

29
contrib/completion/git-completion.bash

@ -662,11 +662,14 @@ __git_compute_merge_strategies () @@ -662,11 +662,14 @@ __git_compute_merge_strategies ()
: ${__git_merge_strategies:=$(__git_list_merge_strategies)}
}

__git_complete_file ()
__git_complete_revlist_file ()
{
local pfx ls ref cur
_get_comp_words_by_ref -n =: cur
case "$cur" in
*..?*:*)
return
;;
?*:*)
ref="${cur%%:*}"
cur="${cur#*:}"
@ -705,17 +708,6 @@ __git_complete_file () @@ -705,17 +708,6 @@ __git_complete_file ()
s/^.* //')" \
-- "$cur"))
;;
*)
__gitcomp "$(__git_refs)"
;;
esac
}

__git_complete_revlist ()
{
local pfx cur
_get_comp_words_by_ref -n =: cur
case "$cur" in
*...*)
pfx="${cur%...*}..."
cur="${cur#*...}"
@ -732,6 +724,17 @@ __git_complete_revlist () @@ -732,6 +724,17 @@ __git_complete_revlist ()
esac
}


__git_complete_file ()
{
__git_complete_revlist_file
}

__git_complete_revlist ()
{
__git_complete_revlist_file
}

__git_complete_remote_or_refspec ()
{
local cur words cword
@ -1354,7 +1357,7 @@ _git_diff () @@ -1354,7 +1357,7 @@ _git_diff ()
return
;;
esac
__git_complete_file
__git_complete_revlist_file
}

__git_mergetools_common="diffuse ecmerge emerge kdiff3 meld opendiff

Loading…
Cancel
Save