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

[PATCH 07/11] completion: avoid compopt -o filenames

From
Felipe Contreras <felipe.contreras@gmail.com>
Date
Apr 27, 2013, 10:19 UTC
Message-ID
<1367057994-19887-8-git-send-email-felipe.contreras@gmail.com>
In-Reply-To
<1367057994-19887-1-git-send-email-felipe.contreras@gmail.com>
If this option causes so much trouble, lets just not use it.

The supposed advantages of specifying the 'filenames' is that 1) a slash is added at the end, 2) trailing spaces are removed (which doesn't seem to be true), and 3) special characters are quoted. We can do all those things by ourselves.

Also, this will allow us to add a space after the completion, just like it happened before fea16b4 (git-completion.bash: add support for path completion), and just like the rest of the script does.

Signed-off-by: Felipe Contreras <felipe.contreras@gmail.com>
---
 contrib/completion/git-completion.bash | 43 ++++------------------------------
 t/t9902-completion.sh                  |  6 ++---
 2 files changed, 7 insertions(+), 42 deletions(-)
diff --git a/contrib/completion/git-completion.bash b/contrib/completion/git-completion.bash
index 9cea170..5dd6646 100644
--- a/contrib/completion/git-completion.bash
+++ b/contrib/completion/git-completion.bash
@@ -253,12 +253,12 @@ __gitcomp_file ()
 	# This means that COMPREPLY will be empty and Bash default
 	# completion will be used.
 	__gitcompadd "$1" "${2-}" "${3-$cur}" ""
-
-	# Tell Bash that compspec generates filenames.
-	compopt -o filenames 2>/dev/null
 }
 
-__git_index_file_list_filter_compat ()
+# Process path list returned by "ls-files" and "diff-index --name-only"
+# commands, in order to list only file names relative to a specified
+# directory, and append a slash to directory names.
+__git_index_file_list_filter ()
 {
 	local path
 
@@ -270,33 +270,6 @@ __git_index_file_list_filter_compat ()
 	done
 }
 
-__git_index_file_list_filter_bash ()
-{
-	local path
-
-	while read -r path; do
-		case "$path" in
-		?*/*)
-			# XXX if we append a slash to directory names when using
-			# `compopt -o filenames`, Bash will append another slash.
-			# This is pretty stupid, and this the reason why we have to
-			# define a compatible version for this function.
-			echo "${path%%/*}" ;;
-		*)
-			echo "$path" ;;
-		esac
-	done
-}
-
-# Process path list returned by "ls-files" and "diff-index --name-only"
-# commands, in order to list only file names relative to a specified
-# directory, and append a slash to directory names.
-__git_index_file_list_filter ()
-{
-	# Default to Bash >= 4.x
-	__git_index_file_list_filter_bash
-}
-
 # Execute 'git ls-files', unless the --committable option is specified, in
 # which case it runs 'git diff-index' to find out the files that can be
 # committed.  It return paths relative to the directory specified in the first
@@ -2651,14 +2624,6 @@ if [[ -n ${ZSH_VERSION-} ]]; then
 
 	compdef _git git gitk
 	return
-elif [[ -n ${BASH_VERSION-} ]]; then
-	if ((${BASH_VERSINFO[0]} < 4)); then
-		# compopt is not supported
-		__git_index_file_list_filter ()
-		{
-			__git_index_file_list_filter_compat
-		}
-	fi
 fi
 
 __git_func_wrap ()
diff --git a/t/t9902-completion.sh b/t/t9902-completion.sh
index 81a1657..e6cdb05 100755
--- a/t/t9902-completion.sh
+++ b/t/t9902-completion.sh
@@ -396,10 +396,10 @@ test_expect_success 'complete files' '
 	: TODO .gitignore should not be here &&
 	test_completion "git mv modified " <<-\EOF &&
 	.gitignore
-	dir
+	dir/
 	modified
 	untracked
-	untracked-dir
+	untracked-dir/
 	EOF
 
 	test_completion "git commit " "modified" &&
@@ -407,7 +407,7 @@ test_expect_success 'complete files' '
 	: TODO .gitignore should not be here &&
 	test_completion "git ls-files " <<-\EOF
 	.gitignore
-	dir
+	dir/
 	modified
 	EOF
 
-- 
1.8.2.1.1031.g2ee5873
Previous: Felipe ContrerasNext: Felipe Contreras
Message 8 of 19 in “completion: general cleanups”
  1. 00/11 completion: general cleanupsFelipe Contreras, Apr 27, 2013
  2. 01/11 completion: add file completion testsFelipe Contreras, Apr 27, 2013
  3. 02/11 completion: document tilde expansion failure in testsFelipe Contreras, Apr 27, 2013
  4. 03/11 completion; remove unuseful commentsFelipe Contreras, Apr 27, 2013
  5. 04/11 completion: use __gitcompadd for __gitcomp_fileFelipe Contreras, Apr 27, 2013
  6. 05/11 completion: refactor diff_index wrappersFelipe Contreras, Apr 27, 2013
  7. 06/11 completion: refactor __git_complete_index_file()Felipe Contreras, Apr 27, 2013
  8. 07/11 completion: avoid compopt -o filenamesFelipe Contreras, Apr 27, 2013
  9. 08/11 completion: get rid of __gitcomp_file()Felipe Contreras, Apr 27, 2013
  10. 09/11 completion: add space after completed filenameFelipe Contreras, Apr 27, 2013
  11. 10/11 completion: remove __git_index_file_list_filter()Felipe Contreras, Apr 27, 2013
  12. 11/11 completion: zsh: add proper file supportFelipe Contreras, Apr 27, 2013
  13. Manlio PerilloApr 27, 2013
  14. Felipe ContrerasApr 27, 2013
  15. Felipe ContrerasApr 27, 2013
  16. Manlio PerilloApr 27, 2013
  17. Felipe ContrerasApr 27, 2013
  18. Felipe ContrerasApr 27, 2013
  19. Manlio PerilloApr 27, 2013

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.