mirror of
https://github.com/iwata/git-now.git
synced 2026-09-10 15:36:22 -04:00
121 lines
3.4 KiB
Plaintext
121 lines
3.4 KiB
Plaintext
#compdef git-now
|
|
#
|
|
# git-now ZSH completion function
|
|
#
|
|
# Installation
|
|
# ------------
|
|
# Drop this somewhere in your $fpath (like /usr/share/zsh/site-functions)
|
|
# and rename it _brew
|
|
#
|
|
# altered from _fink
|
|
#
|
|
|
|
__git-now-add ()
|
|
{
|
|
local curcontext="$curcontext" state line expl
|
|
typeset -A opt_args
|
|
|
|
_arguments -s :\
|
|
'(--all)-n[do not actually add files; only show which ones would be added]'\
|
|
'(--all)-v[show files as they are added]'\
|
|
'(-f --force --all)'{-f,--force}'[allow adding otherwise ignored files]'\
|
|
'(-i --interactive --all)'{-i,--interactive}'[add contents interactively to index]'\
|
|
'(-p --path --all)'{-p,--path}'[like -i but go directly into patch mode for specified files]'\
|
|
'(-e --edit --all)'{-e,--edit}'[open diff against index in editor]'\
|
|
'(-u --update --all)'{-u,--update}'[update only files git already knows about]'\
|
|
'(-N --intent-to-add --all)'{-N,--intent-to-add}'[record only that path will be added later]'\
|
|
'(-s --stat)'{-s,--stat}'[generate diffstat instead of patch]'\
|
|
'--push[push to remote after performing finish]'\
|
|
'(-n -v -f --force -i --interactive -p --path -e --edit -u --update -N --intent-to-add)--all[add --update and add .]'\
|
|
':filepattern:_files'
|
|
}
|
|
|
|
__git_remotes () {
|
|
local expl gitdir remotes
|
|
|
|
gitdir=$(_call_program gitdir git rev-parse --git-dir 2>/dev/null)
|
|
__git_command_successful || return
|
|
|
|
remotes=(${${(f)"$(_call_program remotes git config --get-regexp '"^remote\..*\.url$"')"}//#(#b)remote.(*).url */$match[1]})
|
|
__git_command_successful || return
|
|
|
|
# TODO: Should combine the two instead of either or.
|
|
if (( $#remotes > 0 )); then
|
|
_wanted remotes expl remote compadd $* - $remotes
|
|
else
|
|
_wanted remotes expl remote _files $* - -W "($gitdir/remotes)" -g "$gitdir/remotes/*"
|
|
fi
|
|
}
|
|
|
|
__git_branch_names () {
|
|
local expl
|
|
declare -a branch_names
|
|
|
|
branch_names=(${${(f)"$(_call_program branchrefs git for-each-ref --format='"%(refname)"' refs/heads 2>/dev/null)"}#refs/heads/})
|
|
__git_command_successful || return
|
|
|
|
_wanted branch-names expl branch-name compadd $* - $branch_names
|
|
}
|
|
|
|
__git_command_successful () {
|
|
if (( ${#pipestatus:#0} > 0 )); then
|
|
_message 'not a git repository'
|
|
return 1
|
|
fi
|
|
return 0
|
|
}
|
|
|
|
local curcontext="$curcontext" state line expl
|
|
typeset -A opt_args
|
|
|
|
_arguments -C \
|
|
':command:->command' \
|
|
'*::options:->options'
|
|
|
|
case $state in
|
|
(command)
|
|
|
|
local -a subcommands
|
|
subcommands=(
|
|
'add:default subcommand.'
|
|
'rebase:rebase for temporary commits.'
|
|
'push:remove remote branch and push to remote repoistory for rebase commits.'
|
|
'grep:grep temporary commits.'
|
|
)
|
|
_describe -t commands 'git now' subcommands
|
|
__git-now-add
|
|
;;
|
|
|
|
(options)
|
|
case $line[1] in
|
|
|
|
(add)
|
|
__git-now-add
|
|
;;
|
|
|
|
(rebase)
|
|
_arguments \
|
|
'(-m --mine)'{-m,--mine}'[limit git-now commits by your name]'\
|
|
':branch-name:__git_branch_names'
|
|
;;
|
|
|
|
(push)
|
|
_arguments \
|
|
':remote-repostory:__git_remotes'
|
|
;;
|
|
|
|
(grep)
|
|
_arguments -s : \
|
|
'(-p --path)'{-p,--patch}'[generate diff in patch format]'\
|
|
'(-s --stat)'{-s,--stat}'[generate diffstat instead of patch]'\
|
|
'(-m --mine)'{-m,--mine}'[limit git-now commits by your name]'\
|
|
':branch-name:__git_branch_names'
|
|
;;
|
|
(*)
|
|
__git-now-add
|
|
;;
|
|
esac
|
|
;;
|
|
esac
|
|
|