@matheusbsbs / matheus-bagliano / commits / 3027e4f9a8
Fork 0

completion: list existing working trees for 'git worktree' subcommands

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>

SZEDER Gábor committed Dec 19, 2019 at 16:09 UTC 3027e4f9a8210944e6157aadc52aba58a2182398
1 file changed +29 -1
contrib/completion/git-completion.bash
+29 -1
@@ -2986,10 +2986,23 @@ _git_whatchanged ()
2986 _git_log
2987 }
2988
2989 +__git_complete_worktree_paths ()
2990 +{
2991 + local IFS=$'\n'
2992 + __gitcomp_nl "$(git worktree list --porcelain |
2993 + # Skip the first entry: it's the path of the main worktree,
2994 + # which can't be moved, removed, locked, etc.
2995 + sed -n -e '2,$ s/^worktree //p')"
2996 +}
2997 +
2998 _git_worktree ()
2999 {
3000 local subcommands="add list lock move prune remove unlock"
2992 - local subcommand="$(__git_find_on_cmdline "$subcommands")"
3001 + local subcommand subcommand_idx
3002 +
3003 + subcommand="$(__git_find_on_cmdline --show-idx "$subcommands")"
3004 + subcommand_idx="${subcommand% *}"
3005 + subcommand="${subcommand#* }"
3006
3007 case "$subcommand,$cur" in
3008 ,*)
@@ -2998,6 +3011,21 @@ _git_worktree ()
3011 *,--*)
3012 __gitcomp_builtin worktree_$subcommand
3013 ;;
3014 + lock,*|remove,*|unlock,*)
3015 + __git_complete_worktree_paths
3016 + ;;
3017 + move,*)
3018 + if [ $cword -eq $((subcommand_idx+1)) ]; then
3019 + # The first parameter must be an existing working
3020 + # tree to be moved.
3021 + __git_complete_worktree_paths
3022 + else
3023 + # The second parameter is the destination: it could
3024 + # be any path, so don't list anything, but let Bash
3025 + # fall back to filename completion.
3026 + :
3027 + fi
3028 + ;;
3029 esac
3030 }
3031