git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: [PATCH] completion: complete "git diff ...branc<TAB>"

From
SZEDER Gábor <szeder@ira.uka.de>
Date
Feb 24, 2011, 15:13 UTC
Message-ID
<20110224151328.GB14720@neumann>
In-Reply-To
<7vlj1677gz.fsf@alter.siamese.dyndns.org>
Hi,
On Wed, Feb 23, 2011 at 01:43:08PM -0800, Junio C Hamano wrote:
Show 9 quoted lines
> 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
> 
> I however find myself often typing "git diff ...B<TAB>", seeing nothing
> happening and then repeatedly hitting <TAB>, saying "huh? <TAAAAAAAAB>!".
> 
> This change would hopefully help me, and others like me.
I agree that this would be a good change ...
> Even though there is no point in supporting "git diff A..B" (you can say
> "git diff A B" just fine), but reusing complete-revlist was the easiest
> and that form is supported as a benign but not so useful side effect.
... and this side effect is nothing to worry about, ...
Show 19 quoted lines
> Signed-off-by: Junio C Hamano <gitster@pobox.com>
> ---
> 
>  * I sent this out a while ago and have been using it ever since, but
>    totally forgot about it.  Likes, dislikes, alternatives?
> 
>  contrib/completion/git-completion.bash |    2 +-
>  1 files changed, 1 insertions(+), 1 deletions(-)
> 
> diff --git a/contrib/completion/git-completion.bash b/contrib/completion/git-completion.bash
> index 64341d5..cf56514 100755
> --- a/contrib/completion/git-completion.bash
> +++ b/contrib/completion/git-completion.bash
> @@ -1137,7 +1137,7 @@ _git_diff ()
>  		return
>  		;;
>  	esac
> -	__git_complete_file
> +	__git_complete_revlist

... but I don't think this is the right solution, because it introduces a regression.

There is this 'ref:file' notation (as in 'git show master:README', but I don't know the proper term for it), which is understood by __git_complete_file(), and can be useful for 'git diff', e.g. to compare a file in two branches when the file was renamed in between:

  git diff branchA:old branchB:new

However, __git_complete_revlist() doesn't understand this notation, and does plain filename completion after the ':', i.e. it lists all files and dirs in the current worktree including untracked files, not just the files that are actually present in the given ref, breaking the completion for 'git diff branchA:o<TAB>'.

How about teaching __git_complete_file() to offer refs after '...' instead? It wouldn't make sense for any other commands for which we use __git_complete_file() in the completion script, but the users wouldn't write '...' for those commands anyway, so this is in the same "benign but not so useful side effect" category. But for 'git diff' it would allow the completion of both 'git diff ...B<TAB>' and 'git diff branch:o<TAB>'.

I mean something like this, but didn't test it that much. The first hunk is just a sanity check to prevent invoking 'git ls-tree' in case the user does 'git diff ...branch:o<TAB>', because it would trigger some error messages by 'git ls-tree', and would later cause an error in 'git diff' anyway.

diff --git a/contrib/completion/git-completion.bash b/contrib/completion/git-completion.bash
index 893b771..2b02505 100755
--- a/contrib/completion/git-completion.bash
+++ b/contrib/completion/git-completion.bash
@@ -667,6 +667,9 @@ __git_complete_file ()
 	local pfx ls ref cur
 	_get_comp_words_by_ref -n =: cur
 	case "$cur" in
+	*...?*:*)
+		return
+		;;
 	?*:*)
 		ref="${cur%%:*}"
 		cur="${cur#*:}"
@@ -705,6 +708,11 @@ __git_complete_file ()
 				       s/^.*	//')" \
 			-- "$cur"))
 		;;
+	*...*)
+		pfx="${cur%...*}..."
+		cur="${cur#*...}"
+		__gitcomp "$(__git_refs)" "$pfx" "$cur"
+		;;
 	*)
 		__gitcomp "$(__git_refs)"
 		;;
Previous: Michael J GruberNext: Junio C Hamano
Message 5 of 9 in “completion: complete "git diff ...branc<TAB>"”
  1. completion: complete "git diff ...branc<TAB>"Junio C Hamano, Feb 23, 2011
  2. Michael J GruberFeb 24, 2011
  3. SZEDER GáborFeb 24, 2011
  4. Michael J GruberFeb 24, 2011
  5. SZEDER GáborFeb 24, 2011
  6. Junio C HamanoFeb 24, 2011
  7. 1/2 bash: fix misindented esac statement in __git_complete_file()SZEDER Gábor, Mar 10, 2011
  8. 2/2 bash: complete 'git diff ...branc<TAB>'SZEDER Gábor, Mar 10, 2011
  9. Junio C HamanoMar 10, 2011

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.