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

[RFC/PATCH v2 5/8] completion: get rid of compgen

From
Felipe Contreras <felipe.contreras@gmail.com>
Date
Nov 18, 2012, 10:56 UTC
Message-ID
<1353236213-13471-6-git-send-email-felipe.contreras@gmail.com>
In-Reply-To
<1353236213-13471-1-git-send-email-felipe.contreras@gmail.com>

The functionality we use from compgen is not much, we can do the same manually, with drastical improvements in speed, specially when dealing with only a few rods.

This patch also has the sideffect that brekage reported by Jeroen Meijer and SZEDER Gábor gets fixed because we no longer expand the resulting words.

Other solutions with awk and sed are possible and more efficient when dealing with tens of thousands of words. But is rarely the case. For the common cases, this solution is faster.

Signed-off-by: Felipe Contreras <felipe.contreras@gmail.com>
---
 contrib/completion/git-completion.bash | 15 ++++++++++-----
 t/t9902-completion.sh                  |  2 +-
 2 files changed, 11 insertions(+), 6 deletions(-)
diff --git a/contrib/completion/git-completion.bash b/contrib/completion/git-completion.bash
index 19e18a8..0b72f24 100644
--- a/contrib/completion/git-completion.bash
+++ b/contrib/completion/git-completion.bash
@@ -227,11 +227,16 @@ fi
 
 __gitcompadd ()
 {
-	COMPREPLY=($(compgen -W "$1" -P "$2" -S "$4" -- "$3"))
+	local i=0
+	for x in $1; do
+		if [[ "$x" == "$3"* ]]; then
+			COMPREPLY[i++]="$2$x$4"
+		fi
+	done
 }
 
-# Generates completion reply with compgen, appending a space to possible
-# completion words, if necessary.
+# Generates completion reply, appending a space to possible completion words,
+# if necessary.
 # It accepts 1 to 4 arguments:
 # 1: List of possible completion words.
 # 2: A prefix to be added to each possible completion word (optional).
@@ -251,8 +256,8 @@ __gitcomp ()
 	esac
 }
 
-# Generates completion reply with compgen from newline-separated possible
-# completion words by appending a space to all of them.
+# Generates completion reply from newline-separated possible completion words
+# by appending a space to all of them.
 # It accepts 1 to 4 arguments:
 # 1: List of possible completion words, separated by a single newline.
 # 2: A prefix to be added to each possible completion word (optional).
diff --git a/t/t9902-completion.sh b/t/t9902-completion.sh
index 35fc31b..7fb5b50 100755
--- a/t/t9902-completion.sh
+++ b/t/t9902-completion.sh
@@ -340,7 +340,7 @@ test_expect_success 'complete tree filename with spaces' '
 	EOF
 '
 
-test_expect_failure 'complete tree filename with metacharacters' '
+test_expect_success 'complete tree filename with metacharacters' '
 	echo content >"name with \${meta}" &&
 	git add . &&
 	git commit -m meta &&
-- 
1.8.0
Previous: Felipe ContrerasNext: Felipe Contreras
Message 6 of 9 in “completion: compgen/compadd cleanups”
  1. 0/8 completion: compgen/compadd cleanupsFelipe Contreras, Nov 18, 2012
  2. 1/8 completion: trivial test improvementFelipe Contreras, Nov 18, 2012
  3. 2/8 completion: get rid of empty COMPREPLY assignmentsFelipe Contreras, Nov 18, 2012
  4. 3/8 completion: add new __gitcompadd helperFelipe Contreras, Nov 18, 2012
  5. 4/8 tmp: completion: add SZEDER's testsFelipe Contreras, Nov 18, 2012
  6. 5/8 completion: get rid of compgenFelipe Contreras, Nov 18, 2012
  7. 6/8 tmp: completion: mark SZEDER's tests as fixedFelipe Contreras, Nov 18, 2012
  8. 7/8 completion: get rid of __gitcomp_1Felipe Contreras, Nov 18, 2012
  9. 8/8 completion: small optimizationFelipe Contreras, Nov 18, 2012

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.