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

[PATCH v2 7/9] completion: add hack to enable file mode in bash < 4

From
Felipe Contreras <felipe.contreras@gmail.com>
Date
Apr 27, 2013, 20:10 UTC
Message-ID
<1367093407-8898-8-git-send-email-felipe.contreras@gmail.com>
In-Reply-To
<1367093407-8898-1-git-send-email-felipe.contreras@gmail.com>

This way we don't need all the compat stuff, different filters, and so on. Also, now we complete exactly the same in bash 3 and bash 4.

This is the way bash-completion did it for quite some time, when bash 3 was supported. For more information about the hack:

http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=272660#64
Signed-off-by: Felipe Contreras <felipe.contreras@gmail.com>
---
 contrib/completion/git-completion.bash | 43 ++++++----------------------------
 1 file changed, 7 insertions(+), 36 deletions(-)
diff --git a/contrib/completion/git-completion.bash b/contrib/completion/git-completion.bash
index 9cea170..f9e8e7d 100644
--- a/contrib/completion/git-completion.bash
+++ b/contrib/completion/git-completion.bash
@@ -254,33 +254,21 @@ __gitcomp_file ()
 	# completion will be used.
 	__gitcompadd "$1" "${2-}" "${3-$cur}" ""
 
-	# Tell Bash that compspec generates filenames.
-	compopt -o filenames 2>/dev/null
+	# use a hack to enable file mode in bash < 4
+	compopt -o filenames 2>/dev/null ||
+	compgen -f /non-existing-dir/ > /dev/null
 }
 
-__git_index_file_list_filter_compat ()
-{
-	local path
-
-	while read -r path; do
-		case "$path" in
-		?*/*) echo "${path%%/*}/" ;;
-		*) echo "$path" ;;
-		esac
-	done
-}
-
-__git_index_file_list_filter_bash ()
+# 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
 
 	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" ;;
@@ -288,15 +276,6 @@ __git_index_file_list_filter_bash ()
 	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 +2630,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 ()
-- 
1.8.2.1.1031.g2ee5873
Previous: Felipe ContrerasNext: Felipe Contreras
Message 10 of 15 in “completion: general cleanups”
  1. 0/9 completion: general cleanupsFelipe Contreras, Apr 27, 2013
  2. 1/9 completion: add file completion testsFelipe Contreras, Apr 27, 2013
  3. Junio C HamanoApr 27, 2013
  4. 2/9 completion: document tilde expansion failure in testsFelipe Contreras, Apr 27, 2013
  5. 3/9 completion; remove unuseful commentsFelipe Contreras, Apr 27, 2013
  6. 4/9 completion: use __gitcompadd for __gitcomp_fileFelipe Contreras, Apr 27, 2013
  7. 5/9 completion: refactor diff_index wrappersFelipe Contreras, Apr 27, 2013
  8. Junio C HamanoApr 27, 2013
  9. 6/9 completion: refactor __git_complete_index_file()Felipe Contreras, Apr 27, 2013
  10. 7/9 completion: add hack to enable file mode in bash < 4Felipe Contreras, Apr 27, 2013
  11. 8/9 completion: add space after completed filenameFelipe Contreras, Apr 27, 2013
  12. 9/9 completion: remove __git_index_file_list_filter()Felipe Contreras, Apr 27, 2013
  13. Eric SunshineApr 28, 2013
  14. Felipe ContrerasApr 28, 2013
  15. Junio C HamanoApr 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.