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

[PATCH v2 5/5] completion: add an use __git_compute_second_level_config_vars_for_section

From
Philippe Blain via GitGitGadget <gitgitgadget@gmail.com>
Date
Jan 29, 2024, 13:28 UTC
Message-ID
<a2e792c911e1b9fa77d27ec327f6a9dfe06d4de4.1706534882.git.gitgitgadget@gmail.com>
In-Reply-To
<pull.1660.v2.git.git.1706534881.gitgitgadget@gmail.com>
From: Philippe Blain <levraiphilippeblain@gmail.com>

In a previous commit we removed some hardcoded config variable names from function __git_complete_config_variable_name in the completion script by introducing a new function, __git_compute_first_level_config_vars_for_section.

The remaining hardcoded config variables are "second level" configuration variables, meaning 'branch.<name>.upstream', 'remote.<name>.url', etc. where <name> is a user-defined name.

Making use of the new --config-all-for-completion flag to 'git help' introduced in the previous commit, add a new function, __git_compute_second_level_config_vars_for_section. This function takes as argument a config section name and computes the corresponding second-level config variables, i.e. those that contain a '<' which indicates the start of a placeholder. Note that as in __git_compute_first_level_config_vars_for_section added previsouly, we use indirect expansion instead of associative arrays to stay compatible with Bash 3 on which macOS is stuck for licensing reasons.

Use this new function and the variables it defines in __git_complete_config_variable_name to remove hardcoded config variables, and add a test to verify the new function. Use a single 'case' for all sections with second-level variables names, since the code for each of them is now exactly the same.

Signed-off-by: Philippe Blain <levraiphilippeblain@gmail.com>
---
 contrib/completion/git-completion.bash | 71 ++++++++------------------
 t/t9902-completion.sh                  | 10 ++++
 2 files changed, 31 insertions(+), 50 deletions(-)
diff --git a/contrib/completion/git-completion.bash b/contrib/completion/git-completion.bash
index 2934ceb7637..0e8fd63bfdb 100644
--- a/contrib/completion/git-completion.bash
+++ b/contrib/completion/git-completion.bash
@@ -2596,6 +2596,13 @@ __git_compute_config_vars ()
 	__git_config_vars="$(git help --config-for-completion)"
 }
 
+__git_config_vars_all=
+__git_compute_config_vars_all ()
+{
+	test -n "$__git_config_vars_all" ||
+	__git_config_vars_all="$(git help --config-all-for-completion)"
+}
+
 __git_compute_first_level_config_vars_for_section ()
 {
 	section="$1"
@@ -2605,6 +2612,15 @@ __git_compute_first_level_config_vars_for_section ()
 	printf -v "__git_first_level_config_vars_for_section_${section}" %s "$(echo "$__git_config_vars" | grep -E "^${section}\.[a-z]" | awk -F. '{print $2}')"
 }
 
+__git_compute_second_level_config_vars_for_section ()
+{
+	section="$1"
+	__git_compute_config_vars_all
+	local this_section="__git_second_level_config_vars_for_section_${section}"
+	test -n "${!this_section}" ||
+	printf -v "__git_second_level_config_vars_for_section_${section}" %s "$(echo "$__git_config_vars_all" | grep -E "^${section}\.<" | awk -F. '{print $3}')"
+}
+
 __git_config_sections=
 __git_compute_config_sections ()
 {
@@ -2749,10 +2765,13 @@ __git_complete_config_variable_name ()
 	done
 
 	case "$cur_" in
-	branch.*.*)
+	branch.*.*|guitool.*.*|difftool.*.*|man.*.*|mergetool.*.*|remote.*.*|submodule.*.*|url.*.*)
 		local pfx="${cur_%.*}."
 		cur_="${cur_##*.}"
-		__gitcomp "remote pushRemote merge mergeOptions rebase" "$pfx" "$cur_" "$sfx"
+		local section="${pfx%.*.}"
+		__git_compute_second_level_config_vars_for_section "${section}"
+		local this_section="__git_second_level_config_vars_for_section_${section}"
+		__gitcomp "${!this_section}" "$pfx" "$cur_" "$sfx"
 		return
 		;;
 	branch.*)
@@ -2765,33 +2784,6 @@ __git_complete_config_variable_name ()
 		__gitcomp_nl_append "${!this_section}" "$pfx" "$cur_" "${sfx:- }"
 		return
 		;;
-	guitool.*.*)
-		local pfx="${cur_%.*}."
-		cur_="${cur_##*.}"
-		__gitcomp "
-			argPrompt cmd confirm needsFile noConsole noRescan
-			prompt revPrompt revUnmerged title
-			" "$pfx" "$cur_" "$sfx"
-		return
-		;;
-	difftool.*.*)
-		local pfx="${cur_%.*}."
-		cur_="${cur_##*.}"
-		__gitcomp "cmd path" "$pfx" "$cur_" "$sfx"
-		return
-		;;
-	man.*.*)
-		local pfx="${cur_%.*}."
-		cur_="${cur_##*.}"
-		__gitcomp "cmd path" "$pfx" "$cur_" "$sfx"
-		return
-		;;
-	mergetool.*.*)
-		local pfx="${cur_%.*}."
-		cur_="${cur_##*.}"
-		__gitcomp "cmd path trustExitCode" "$pfx" "$cur_" "$sfx"
-		return
-		;;
 	pager.*)
 		local pfx="${cur_%.*}."
 		cur_="${cur_#*.}"
@@ -2799,15 +2791,6 @@ __git_complete_config_variable_name ()
 		__gitcomp_nl "$__git_all_commands" "$pfx" "$cur_" "${sfx:- }"
 		return
 		;;
-	remote.*.*)
-		local pfx="${cur_%.*}."
-		cur_="${cur_##*.}"
-		__gitcomp "
-			url proxy fetch push mirror skipDefaultUpdate
-			receivepack uploadpack tagOpt pushurl
-			" "$pfx" "$cur_" "$sfx"
-		return
-		;;
 	remote.*)
 		local pfx="${cur_%.*}."
 		cur_="${cur_#*.}"
@@ -2818,12 +2801,6 @@ __git_complete_config_variable_name ()
 		__gitcomp_nl_append "${!this_section}" "$pfx" "$cur_" "${sfx:- }"
 		return
 		;;
-	submodule.*.*)
-		local pfx="${cur_%.*}."
-		cur_="${cur_##*.}"
-		__gitcomp "url update branch fetchRecurseSubmodules ignore active" "$pfx" "$cur_" "$sfx"
-		return
-		;;
 	submodule.*)
 		local pfx="${cur_%.*}."
 		cur_="${cur_#*.}"
@@ -2834,12 +2811,6 @@ __git_complete_config_variable_name ()
 		__gitcomp_nl_append "${!this_section}" "$pfx" "$cur_" "${sfx:- }"
 		return
 		;;
-	url.*.*)
-		local pfx="${cur_%.*}."
-		cur_="${cur_##*.}"
-		__gitcomp "insteadOf pushInsteadOf" "$pfx" "$cur_" "$sfx"
-		return
-		;;
 	*.*)
 		__git_compute_config_vars
 		__gitcomp "$__git_config_vars" "" "$cur_" "$sfx"
diff --git a/t/t9902-completion.sh b/t/t9902-completion.sh
index f28d8f531b7..24ff786b273 100755
--- a/t/t9902-completion.sh
+++ b/t/t9902-completion.sh
@@ -2593,6 +2593,16 @@ test_expect_success 'git config - variable name - __git_compute_first_level_conf
 	submodule.recurse Z
 	EOF
 '
+test_expect_success 'git config - variable name - __git_compute_second_level_config_vars_for_section' '
+	test_completion "git config branch.main." <<-\EOF
+	branch.main.description Z
+	branch.main.remote Z
+	branch.main.pushRemote Z
+	branch.main.merge Z
+	branch.main.mergeOptions Z
+	branch.main.rebase Z
+	EOF
+'
 
 test_expect_success 'git config - value' '
 	test_completion "git config color.pager " <<-\EOF
-- 
gitgitgadget
Previous: Philippe BlainNext: Patrick Steinhardt
Message 21 of 32 in “completion: remove hardcoded config variable names”
  1. 0/5 completion: remove hardcoded config variable namesPhilippe Blain via GitGitGadget, Jan 28, 2024
  2. 1/5 completion: add space after config variable names also in Bash 3Philippe Blain via GitGitGadget, Jan 28, 2024
  3. 2/5 completion: complete 'submodule.*' config variablesPhilippe Blain via GitGitGadget, Jan 28, 2024
  4. 3/5 completion: add and use __git_compute_first_level_config_vars_for_sectionPhilippe Blain via GitGitGadget, Jan 28, 2024
  5. 4/5 builtin/help: add --config-all-for-completionPhilippe Blain via GitGitGadget, Jan 28, 2024
  6. 5/5 completion: add an use __git_compute_second_level_config_vars_for_sectionPhilippe Blain via GitGitGadget, Jan 28, 2024
  7. 0/5 completion: remove hardcoded config variable namesPhilippe Blain via GitGitGadget, Jan 29, 2024
  8. 1/5 completion: add space after config variable names also in Bash 3Philippe Blain via GitGitGadget, Jan 29, 2024
  9. 2/5 completion: complete 'submodule.*' config variablesPhilippe Blain via GitGitGadget, Jan 29, 2024
  10. Patrick SteinhardtFeb 8, 2024
  11. Philippe BlainFeb 10, 2024
  12. 3/5 completion: add and use __git_compute_first_level_config_vars_for_sectionPhilippe Blain via GitGitGadget, Jan 29, 2024
  13. Patrick SteinhardtFeb 8, 2024
  14. Philippe BlainFeb 10, 2024
  15. Junio C HamanoFeb 10, 2024
  16. Philippe BlainFeb 10, 2024
  17. Junio C HamanoFeb 14, 2024
  18. 4/5 builtin/help: add --config-all-for-completionPhilippe Blain via GitGitGadget, Jan 29, 2024
  19. Patrick SteinhardtFeb 8, 2024
  20. Philippe BlainFeb 10, 2024
  21. 5/5 completion: add an use __git_compute_second_level_config_vars_for_sectionPhilippe Blain via GitGitGadget, Jan 29, 2024
  22. Patrick SteinhardtFeb 8, 2024
  23. Philippe BlainFeb 10, 2024
  24. Junio C HamanoFeb 7, 2024
  25. Patrick SteinhardtFeb 8, 2024
  26. 0/4 completion: remove hardcoded config variable namesPhilippe Blain via GitGitGadget, Feb 10, 2024
  27. 1/4 completion: add space after config variable names also in Bash 3Philippe Blain via GitGitGadget, Feb 10, 2024
  28. 2/4 completion: complete 'submodule.*' config variablesPhilippe Blain via GitGitGadget, Feb 10, 2024
  29. 3/4 completion: add and use __git_compute_first_level_config_vars_for_sectionPhilippe Blain via GitGitGadget, Feb 10, 2024
  30. 4/4 completion: add and use __git_compute_second_level_config_vars_for_sectionPhilippe Blain via GitGitGadget, Feb 10, 2024
  31. Patrick SteinhardtFeb 13, 2024
  32. Junio C HamanoFeb 13, 2024

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.