Files
zsh/worktree/_worktree
Kenneth Benzie (Benie) 6aecc8837c Add worktree {add,remove} <branch> command
Wrap `git worktree {add,remove} <path> <branch>` to streamline working
with multiple worktrees.
2026-02-19 14:45:41 +00:00

51 lines
1.2 KiB
Plaintext

#compdef worktree
__worktree_branches() {
local -a branches
branches=(
${(fo)"$(git branch --format='%(refname:short)' 2>/dev/null)"}
${${${${(fo)"$(git for-each-ref --format='%(refname)' refs/remotes 2>/dev/null)"}#refs/remotes/}#*/}:#HEAD}
)
_describe 'branch' branches
}
__worktree_active_branches() {
local -a branches
branches=(${(fo)"$(git worktree list --porcelain 2>/dev/null | \
awk '/^worktree /{ wt++ } wt>1 && /^branch refs\/heads\//{ sub(/^branch refs\/heads\//, ""); print }')"})
_describe 'branch' branches
}
_worktree() {
local context curcontext="$curcontext" state line
typeset -A opt_args
_arguments -C \
'1: :->cmd' \
'*:: :->args'
case $state in
(cmd)
local commands; commands=(
'add:Create a worktree for a branch'
'remove:Remove a worktree by branch'
'rm:Remove a worktree by branch'
)
_describe -t commands 'worktree command' commands "$@"
;;
(args)
curcontext="${curcontext%:*:*}:worktree-cmd-$words[1]:"
case $line[1] in
(add)
_arguments '1:: :__worktree_branches'
;;
(rm|remove)
_arguments '1:: :__worktree_active_branches'
;;
esac
;;
esac
}
_worktree "$@"