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

[PATCH 07/11] completion: extract function __git_dwim_remote_heads

From
Jacob Keller <jacob.e.keller@intel.com>
Date
Apr 25, 2020, 02:20 UTC
Message-ID
<20200425022045.1089291-9-jacob.e.keller@intel.com>
In-Reply-To
<20200425022045.1089291-1-jacob.e.keller@intel.com>
From: Jacob Keller <jacob.keller@gmail.com>

__git_refs() has the ability to report unique remote names for supporting completion of remote branch names for the DWIMery of git checkout and git switch.

For git checkout, this is fine, because it always supports completing all local references.

However, git switch by default only supports either switching branches or using this DWIMery to create a local branch tracking the remote branch.

Future work to cleanup and improve completion support for git switch will be aided if the remote branch names can be completed separately from __git_refs.

Extract this logic to a function __git_dwim_remote_heads(), and use it in __git_refs.

Signed-off-by: Jacob Keller <jacob.keller@gmail.com>
---
 contrib/completion/git-completion.bash | 28 +++++++++++++++++++-------
 1 file changed, 21 insertions(+), 7 deletions(-)
diff --git a/contrib/completion/git-completion.bash b/contrib/completion/git-completion.bash
index 02dc1203559c..f1ee25f05690 100644
--- a/contrib/completion/git-completion.bash
+++ b/contrib/completion/git-completion.bash
@@ -621,6 +621,26 @@ __git_tags ()
 			"refs/tags/$cur_*" "refs/tags/$cur_*/**"
 }
 
+# List unique branches from refs/remotes used for 'git checkout' and 'git
+# switch' tracking DWIMery.
+# 1: A prefix to be added to each listed branch (optional)
+# 2: List only branches matching this word (optional; list all branches if
+#    unset or empty).
+# 3: A suffix to be appended to each listed branch (optional).
+__git_dwim_remote_heads ()
+{
+	local pfx="${1-}" cur_="${2-}" sfx="${3-}"
+	local fer_pfx="${pfx//\%/%%}" # "escape" for-each-ref format specifiers
+
+	# employ the heuristic used by git checkout and git switch
+	# Try to find a remote branch that cur_es the completion word
+	# but only output if the branch name is unique
+	__git for-each-ref --format="$fer_pfx%(refname:strip=3)$sfx" \
+		--sort="refname:strip=3" \
+		"refs/remotes/*/$cur_*" "refs/remotes/*/$cur_*/**" | \
+	uniq -u
+}
+
 # Lists refs from the local (by default) or from a remote repository.
 # It accepts 0, 1 or 2 arguments:
 # 1: The remote to list refs from (optional; ignored, if set but empty).
@@ -696,13 +716,7 @@ __git_refs ()
 		__git_dir="$dir" __git for-each-ref --format="$fer_pfx%($format)$sfx" \
 			"${refs[@]}"
 		if [ -n "$track" ]; then
-			# employ the heuristic used by git checkout
-			# Try to find a remote branch that matches the completion word
-			# but only output if the branch name is unique
-			__git for-each-ref --format="$fer_pfx%(refname:strip=3)$sfx" \
-				--sort="refname:strip=3" \
-				"refs/remotes/*/$match*" "refs/remotes/*/$match*/**" | \
-			uniq -u
+			__git_dwim_remote_heads "$pfx" "$match" "$sfx"
 		fi
 		return
 	fi
-- 
2.25.2
Previous: Jacob KellerNext: Jacob Keller
Message 10 of 26 in “refactor git switch completion”
  1. 00/11 refactor git switch completionJacob Keller, Apr 25, 2020
  2. 01/11 completion: add some simple test cases for git switch completionJacob Keller, Apr 25, 2020
  3. 02/11 completion: add test showing subpar git switch completionJacob Keller, Apr 25, 2020
  4. 03/11 completion: add test highlighting subpar git switch --track completionJacob Keller, Apr 25, 2020
  5. 04/11 completion: add tests showing lack of support for git switch -c/-CJacob Keller, Apr 25, 2020
  6. 09/11 completion: fix completion for git switch with no optionsJacob Keller, Apr 25, 2020
  7. 11/11 completion: complete remote branches for git switch --trackJacob Keller, Apr 25, 2020
  8. 08/11 completion: perform DWIM logic directly in __git_complete_refsJacob Keller, Apr 25, 2020
  9. 10/11 completion: recognize -c/-C when completing for git switchJacob Keller, Apr 25, 2020
  10. 07/11 completion: extract function __git_dwim_remote_headsJacob Keller, Apr 25, 2020
  11. 06/11 completion: rename --track option of __git_complete_refsJacob Keller, Apr 25, 2020
  12. 05/11 completion: remove completion for git switch --orphanJacob Keller, Apr 25, 2020
  13. 05/11 completion: add test showing subpar completion for git switch --orphanJacob Keller, Apr 25, 2020
  14. Junio C HamanoApr 27, 2020
  15. Jacob KellerApr 28, 2020
  16. Jacob KellerApr 28, 2020
  17. Junio C HamanoApr 28, 2020
  18. Jacob KellerApr 28, 2020
  19. Junio C HamanoApr 28, 2020
  20. Jacob KellerApr 28, 2020
  21. Junio C HamanoApr 28, 2020
  22. Jacob KellerApr 28, 2020
  23. Junio C HamanoApr 28, 2020
  24. Jacob KellerApr 25, 2020
  25. Junio C HamanoApr 30, 2020
  26. Jacob KellerMay 1, 2020

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.