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

[PATCH 2/2] bash: complete 'git diff ...branc<TAB>'

From
SZEDER Gábor <szeder@ira.uka.de>
Date
Mar 10, 2011, 18:12 UTC
Message-ID
<1299780749-12435-2-git-send-email-szeder@ira.uka.de>
In-Reply-To
<1299780749-12435-1-git-send-email-szeder@ira.uka.de>

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>
---
 contrib/completion/git-completion.bash |   29 ++++++++++++++++-------------
 1 files changed, 16 insertions(+), 13 deletions(-)
diff --git a/contrib/completion/git-completion.bash b/contrib/completion/git-completion.bash
index 344a47f..0c48f1a 100755
--- a/contrib/completion/git-completion.bash
+++ b/contrib/completion/git-completion.bash
@@ -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 ()
 				       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 ()
 	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 ()
 		return
 		;;
 	esac
-	__git_complete_file
+	__git_complete_revlist_file
 }
 
 __git_mergetools_common="diffuse ecmerge emerge kdiff3 meld opendiff
-- 
1.7.4.1.237.g62e25
Previous: SZEDER GáborNext: Junio C Hamano
Message 8 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.