]> git.ipfire.org Git - thirdparty/git.git/commitdiff
completion: list existing working trees for 'git worktree' subcommands
authorSZEDER Gábor <szeder.dev@gmail.com>
Thu, 19 Dec 2019 15:09:20 +0000 (16:09 +0100)
committerJunio C Hamano <gitster@pobox.com>
Wed, 15 Jan 2020 22:06:13 +0000 (14:06 -0800)
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>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
contrib/completion/git-completion.bash

index d06715996d5236e34ad7013325365d90057cd1e9..90284e5954ab65fafa4ea716831e31fe4028c4be 100644 (file)
@@ -2986,10 +2986,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
        ,*)
@@ -2998,6 +3011,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
 }