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

[PATCH v2 5/6] completion: list existing working trees for 'git worktree' subcommands

From
SZEDER Gábor <szeder.dev@gmail.com>
Date
Dec 19, 2019, 15:09 UTC
Message-ID
<20191219150921.5889-6-szeder.dev@gmail.com>
In-Reply-To
<20191219150921.5889-1-szeder.dev@gmail.com>

Complete the paths of existing working trees for 'git worktree's 'move', 'remove', 'lock', and 'unlock' subcommands.

Note that 'git worktree list --porcelain' shows absolute paths, so for simplicity's sake we'll complete full absolute paths as well (as opposed to turning them into relative paths by finding common leading directories between $PWD and the working tree's path and removing them, risking trouble with symbolic links or Windows drive letters; or completing them one path component at a time).

Never list the path of the main working tree, as it cannot be moved, removed, locked, or unlocked.

Ideally we would only list unlocked working trees for the 'move', 'remove', and 'lock' subcommands, and only locked ones for 'unlock'. Alas, 'git worktree list --porcelain' doesn't indicate which working trees are locked, so for now we'll complete the paths of all existing working trees.

Signed-off-by: SZEDER Gábor <szeder.dev@gmail.com>
---
 contrib/completion/git-completion.bash | 30 +++++++++++++++++++++++++-
 1 file changed, 29 insertions(+), 1 deletion(-)
diff --git a/contrib/completion/git-completion.bash b/contrib/completion/git-completion.bash
index 643272eb2f..5eae0bfd18 100644
--- a/contrib/completion/git-completion.bash
+++ b/contrib/completion/git-completion.bash
@@ -2981,10 +2981,23 @@ _git_whatchanged ()
 	_git_log
 }
 
+__git_complete_worktree_paths ()
+{
+	local IFS=$'\n'
+	__gitcomp_nl "$(git worktree list --porcelain |
+		# Skip the first entry: it's the path of the main worktree,
+		# which can't be moved, removed, locked, etc.
+		sed -n -e '2,$ s/^worktree //p')"
+}
+
 _git_worktree ()
 {
 	local subcommands="add list lock move prune remove unlock"
-	local subcommand="$(__git_find_on_cmdline "$subcommands")"
+	local subcommand subcommand_idx
+
+	subcommand="$(__git_find_on_cmdline --show-idx "$subcommands")"
+	subcommand_idx="${subcommand% *}"
+	subcommand="${subcommand#* }"
 
 	case "$subcommand,$cur" in
 	,*)
@@ -2993,6 +3006,21 @@ _git_worktree ()
 	*,--*)
 		__gitcomp_builtin worktree_$subcommand
 		;;
+	lock,*|remove,*|unlock,*)
+		__git_complete_worktree_paths
+		;;
+	move,*)
+		if [ $cword -eq $((subcommand_idx+1)) ]; then
+			# The first parameter must be an existing working
+			# tree to be moved.
+			__git_complete_worktree_paths
+		else
+			# The second parameter is the destination: it could
+			# be any path, so don't list anything, but let Bash
+			# fall back to filename completion.
+			:
+		fi
+		;;
 	esac
 }
 
-- 
2.24.1.982.ga4d4aba446
Previous: SZEDER GáborNext: SZEDER Gábor
Message 21 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.