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

[PATCH 6/6] completion: list paths and refs for 'git worktree add'

From
SZEDER Gábor <szeder.dev@gmail.com>
Date
Oct 17, 2019, 17:35 UTC
Message-ID
<20191017173501.3198-7-szeder.dev@gmail.com>
In-Reply-To
<20191017173501.3198-1-szeder.dev@gmail.com>

Complete paths after 'git worktree add <TAB>' and refs after 'git worktree add -b <TAB>' and 'git worktree add some/dir <TAB>'.

Uncharacteristically for a Git command, 'git worktree add' takes a mandatory path parameter before a commit-ish as its optional last parameter. In addition, it has both standalone --options and options with a mandatory unstuck parameter ('-b <new-branch>'). Consequently, trying to complete refs for that last optional commit-ish parameter resulted in a more convoluted than usual completion function, but hopefully all the included comments will make it not too hard to digest.

Signed-off-by: SZEDER Gábor <szeder.dev@gmail.com>
---
 contrib/completion/git-completion.bash | 36 ++++++++++++++++++++++++++
 1 file changed, 36 insertions(+)
diff --git a/contrib/completion/git-completion.bash b/contrib/completion/git-completion.bash
index 4eb13b06d6..4e5cad4966 100644
--- a/contrib/completion/git-completion.bash
+++ b/contrib/completion/git-completion.bash
@@ -3004,6 +3004,42 @@ _git_worktree ()
 	*,--*)
 		__gitcomp_builtin worktree_$subcommand
 		;;
+	add,*)	# usage: git worktree add [<options>] <path> [<commit-ish>]
+		# Here we are not completing an --option, it's either the
+		# path or a ref.
+		case "$prev" in
+		-b|-B)	# Complete refs for branch to be created/reseted.
+			__git_complete_refs
+			;;
+		-*)	# The previous word is an -o|--option without an
+			# unstuck argument: have to complete the path for
+			# the new worktree, so don't list anything, but let
+			# Bash fall back to filename completion.
+			;;
+		*)	# The previous word is not an --option, so it must
+			# be either the 'add' subcommand, the unstuck
+			# argument of an option (e.g. branch for -b|-B), or
+			# the path for the new worktree.
+			if [ $cword -eq $((subcommand_idx+1)) ]; then
+				# Right after the 'add' subcommand: have to
+				# complete the path, so fall back to Bash
+				# filename completion.
+				:
+			else
+				case "${words[cword-2]}" in
+				-b|-B)	# After '-b <branch>': have to
+					# complete the path, so fall back
+					# to Bash filename completion.
+					;;
+				*)	# After the path: have to complete
+					# the ref to be checked out.
+					__git_complete_refs
+					;;
+				esac
+			fi
+			;;
+		esac
+		;;
 	lock,*|remove,*|unlock,*)
 		__git_complete_worktree_paths
 		;;
-- 
2.23.0.1084.gae250eaa40
Previous: SZEDER GáborNext: SZEDER Gábor
Message 10 of 22 in “completion: improve completion for 'git worktree'”
  1. 0/6 completion: improve completion for 'git worktree'SZEDER Gábor, Oct 17, 2019
  2. 1/6 t9902-completion: add tests for the __git_find_on_cmdline() helperSZEDER Gábor, Oct 17, 2019
  3. 2/6 completion: clean up the __git_find_on_cmdline() helper functionSZEDER Gábor, Oct 17, 2019
  4. 3/6 completion: return the index of found word from __git_find_on_cmdline()SZEDER Gábor, Oct 17, 2019
  5. Eric SunshineOct 17, 2019
  6. SZEDER GáborOct 18, 2019
  7. Eric SunshineOct 18, 2019
  8. SZEDER GáborDec 19, 2019
  9. SZEDER GáborDec 19, 2019
  10. 6/6 completion: list paths and refs for 'git worktree add'SZEDER Gábor, Oct 17, 2019
  11. 5/6 completion: list existing working trees for 'git worktree' subcommandsSZEDER Gábor, Oct 17, 2019
  12. Eric SunshineOct 17, 2019
  13. SZEDER GáborOct 18, 2019
  14. Eric SunshineOct 18, 2019
  15. 4/6 completion: simplify completing 'git worktree' subcommands and optionsSZEDER Gábor, Oct 17, 2019
  16. 0/6 completion: improve completion for 'git worktree'SZEDER Gábor, Dec 19, 2019
  17. 1/6 t9902-completion: add tests for the __git_find_on_cmdline() helperSZEDER Gábor, Dec 19, 2019
  18. 2/6 completion: clean up the __git_find_on_cmdline() helper functionSZEDER Gábor, Dec 19, 2019
  19. 3/6 completion: return the index of found word from __git_find_on_cmdline()SZEDER Gábor, Dec 19, 2019
  20. 4/6 completion: simplify completing 'git worktree' subcommands and optionsSZEDER Gábor, Dec 19, 2019
  21. 5/6 completion: list existing working trees for 'git worktree' subcommandsSZEDER Gábor, Dec 19, 2019
  22. 6/6 completion: list paths and refs for 'git worktree add'SZEDER Gábor, Dec 19, 2019

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.