mirror of
https://github.com/iwata/git-now.git
synced 2026-09-10 07:26:29 -04:00
133 lines
3.8 KiB
Bash
133 lines
3.8 KiB
Bash
#!zsh
|
|
#
|
|
# Installation
|
|
# ------------
|
|
#
|
|
# To achieve git-flow completion nirvana:
|
|
#
|
|
# 0. Update your zsh's git-completion module to the newest verion.
|
|
# From here. http://zsh.git.sourceforge.net/git/gitweb.cgi?p=zsh/zsh;a=blob_plain;f=Completion/Unix/Command/_git;hb=HEAD
|
|
#
|
|
# 1. Install this file. Either:
|
|
#
|
|
# a. Place it in your .zshrc:
|
|
#
|
|
# b. Or, copy it somewhere (e.g. ~/.git-now-completion.zsh) and put the following line in
|
|
# your .zshrc:
|
|
#
|
|
# source ~/.git-now-completion.zsh
|
|
#
|
|
|
|
_git-now ()
|
|
{
|
|
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
|
|
}
|
|
|
|
__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
|
|
}
|
|
|
|
zstyle ':completion:*:*:git:*' user-commands now:'description for foo'
|