123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548 |
- #!zsh
- #
- # Installation
- # ------------
- #
- # To achieve git-flow completion nirvana:
- #
- # 0. Update your zsh's git-completion module to the newest version.
- # From here: https://github.com/zsh-users/zsh/blob/master/Completion/Unix/Command/_git
- #
- # 1. Install this file. Either:
- #
- # a. Place it in your .zshrc:
- #
- # b. Or, copy it somewhere (e.g. ~/.git-flow-completion.zsh) and put the following line in
- # your .zshrc:
- #
- # source ~/.git-flow-completion.zsh
- #
- # c. Or, use this file as a oh-my-zsh plugin.
- #
- _git-flow ()
- {
- local curcontext="$curcontext" state line
- typeset -A opt_args
- _arguments -C \
- ':command:->command' \
- '*::options:->options'
- case $state in
- (command)
- local -a subcommands
- subcommands=(
- 'init:Initialize a new git repo with support for the branching model.'
- 'feature:Manage your feature branches.'
- 'bugfix:Manage your bugfix branches.'
- 'config:Manage your configuration.'
- 'release:Manage your release branches.'
- 'hotfix:Manage your hotfix branches.'
- 'support:Manage your support branches.'
- 'version:Shows version information.'
- 'finish:Finish the branch you are currently on.'
- 'delete:Delete the branch you are currently on.'
- 'publish:Publish the branch you are currently on.'
- 'rebase:Rebase the branch you are currently on.'
- )
- _describe -t commands 'git flow' subcommands
- ;;
- (options)
- case $line[1] in
- (init)
- _arguments \
- -f'[Force setting of gitflow branches, even if already configured]'
- ;;
- (version)
- ;;
- (hotfix)
- __git-flow-hotfix
- ;;
- (release)
- __git-flow-release
- ;;
- (feature)
- __git-flow-feature
- ;;
- (bugfix)
- __git-flow-bugfix
- ;;
- (config)
- __git-flow-config
- ;;
- esac
- ;;
- esac
- }
- __git-flow-release ()
- {
- local curcontext="$curcontext" state line
- typeset -A opt_args
- _arguments -C \
- ':command:->command' \
- '*::options:->options'
- case $state in
- (command)
- local -a subcommands
- subcommands=(
- 'start:Start a new release branch.'
- 'finish:Finish a release branch.'
- 'list:List all your release branches. (Alias to `git flow release`)'
- 'publish:Publish release branch to remote.'
- 'track:Checkout remote release branch.'
- 'rebase:Rebase from integration branch.'
- 'delete:Delete a release branch.'
- )
- _describe -t commands 'git flow release' subcommands
- _arguments \
- -v'[Verbose (more) output]'
- ;;
- (options)
- case $line[1] in
- (start)
- _arguments \
- -F'[Fetch from origin before performing finish]'\
- ':version:__git_flow_version_list'
- ;;
- (finish)
- _arguments \
- -F'[Fetch from origin before performing finish]' \
- -s'[Sign the release tag cryptographically]'\
- -u'[Use the given GPG-key for the digital signature (implies -s)]'\
- -m'[Use the given tag message]'\
- -p'[Push to $ORIGIN after performing finish]'\
- ':version:__git_flow_version_list'
- ;;
- (delete)
- _arguments \
- -f'[Force deletion]' \
- -r'[Delete remote branch]' \
- ':version:__git_flow_version_list'
- ;;
- (publish)
- _arguments \
- ':version:__git_flow_version_list'
- ;;
- (track)
- _arguments \
- ':version:__git_flow_version_list'
- ;;
- (rebase)
- _arguments \
- -i'[Do an interactive rebase]' \
- ':branch:__git_branch_names'
- ;;
- *)
- _arguments \
- -v'[Verbose (more) output]'
- ;;
- esac
- ;;
- esac
- }
- __git-flow-hotfix ()
- {
- local curcontext="$curcontext" state line
- typeset -A opt_args
- _arguments -C \
- ':command:->command' \
- '*::options:->options'
- case $state in
- (command)
- local -a subcommands
- subcommands=(
- 'start:Start a new hotfix branch.'
- 'finish:Finish a hotfix branch.'
- 'delete:Delete a hotfix branch.'
- 'rebase:Rebase from integration branch.'
- 'list:List all your hotfix branches. (Alias to `git flow hotfix`)'
- 'rename:Rename a hotfix branch.'
- )
- _describe -t commands 'git flow hotfix' subcommands
- _arguments \
- -v'[Verbose (more) output]'
- ;;
- (options)
- case $line[1] in
- (start)
- _arguments \
- -F'[Fetch from origin before performing finish]'\
- ':hotfix:__git_flow_version_list'\
- ':branch-name:__git_branch_names'
- ;;
- (finish)
- _arguments \
- -F'[Fetch from origin before performing finish]' \
- -s'[Sign the release tag cryptographically]'\
- -u'[Use the given GPG-key for the digital signature (implies -s)]'\
- -m'[Use the given tag message]'\
- -p'[Push to $ORIGIN after performing finish]'\
- ':hotfix:__git_flow_hotfix_list'
- ;;
- (delete)
- _arguments \
- -f'[Force deletion]' \
- -r'[Delete remote branch]' \
- ':hotfix:__git_flow_hotfix_list'
- ;;
- (rebase)
- _arguments \
- -i'[Do an interactive rebase]' \
- ':branch:__git_branch_names'
- ;;
- *)
- _arguments \
- -v'[Verbose (more) output]'
- ;;
- esac
- ;;
- esac
- }
- __git-flow-feature ()
- {
- local curcontext="$curcontext" state line
- typeset -A opt_args
- _arguments -C \
- ':command:->command' \
- '*::options:->options'
- case $state in
- (command)
- local -a subcommands
- subcommands=(
- 'start:Start a new feature branch.'
- 'finish:Finish a feature branch.'
- 'delete:Delete a feature branch.'
- 'list:List all your feature branches. (Alias to `git flow feature`)'
- 'publish:Publish feature branch to remote.'
- 'track:Checkout remote feature branch.'
- 'diff:Show all changes.'
- 'rebase:Rebase from integration branch.'
- 'checkout:Checkout local feature branch.'
- 'pull:Pull changes from remote.'
- 'rename:Rename a feature branch.'
- )
- _describe -t commands 'git flow feature' subcommands
- _arguments \
- -v'[Verbose (more) output]'
- ;;
- (options)
- case $line[1] in
- (start)
- _arguments \
- -F'[Fetch from origin before performing finish]'\
- ':feature:__git_flow_feature_list'\
- ':branch-name:__git_branch_names'
- ;;
- (finish)
- _arguments \
- -F'[Fetch from origin before performing finish]' \
- -r'[Rebase instead of merge]'\
- ':feature:__git_flow_feature_list'
- ;;
- (delete)
- _arguments \
- -f'[Force deletion]' \
- -r'[Delete remote branch]' \
- ':feature:__git_flow_feature_list'
- ;;
- (publish)
- _arguments \
- ':feature:__git_flow_feature_list'\
- ;;
- (track)
- _arguments \
- ':feature:__git_flow_feature_list'\
- ;;
- (diff)
- _arguments \
- ':branch:__git_branch_names'\
- ;;
- (rebase)
- _arguments \
- -i'[Do an interactive rebase]' \
- ':branch:__git_branch_names'
- ;;
- (checkout)
- _arguments \
- ':branch:__git_flow_feature_list'\
- ;;
- (pull)
- _arguments \
- ':remote:__git_remotes'\
- ':branch:__git_branch_names'
- ;;
- *)
- _arguments \
- -v'[Verbose (more) output]'
- ;;
- esac
- ;;
- esac
- }
- __git-flow-bugfix ()
- {
- local curcontext="$curcontext" state line
- typeset -A opt_args
- _arguments -C \
- ':command:->command' \
- '*::options:->options'
- case $state in
- (command)
- local -a subcommands
- subcommands=(
- 'start:Start a new bugfix branch.'
- 'finish:Finish a bugfix branch.'
- 'delete:Delete a bugfix branch.'
- 'list:List all your bugfix branches. (Alias to `git flow bugfix`)'
- 'publish:Publish bugfix branch to remote.'
- 'track:Checkout remote bugfix branch.'
- 'diff:Show all changes.'
- 'rebase:Rebase from integration branch.'
- 'checkout:Checkout local bugfix branch.'
- 'pull:Pull changes from remote.'
- 'rename:Rename a bugfix branch.'
- )
- _describe -t commands 'git flow bugfix' subcommands
- _arguments \
- -v'[Verbose (more) output]'
- ;;
- (options)
- case $line[1] in
- (start)
- _arguments \
- -F'[Fetch from origin before performing finish]'\
- ':bugfix:__git_flow_bugfix_list'\
- ':branch-name:__git_branch_names'
- ;;
- (finish)
- _arguments \
- -F'[Fetch from origin before performing finish]' \
- -r'[Rebase instead of merge]'\
- ':bugfix:__git_flow_bugfix_list'
- ;;
- (delete)
- _arguments \
- -f'[Force deletion]' \
- -r'[Delete remote branch]' \
- ':bugfix:__git_flow_bugfix_list'
- ;;
- (publish)
- _arguments \
- ':bugfix:__git_flow_bugfix_list'\
- ;;
- (track)
- _arguments \
- ':bugfix:__git_flow_bugfix_list'\
- ;;
- (diff)
- _arguments \
- ':branch:__git_branch_names'\
- ;;
- (rebase)
- _arguments \
- -i'[Do an interactive rebase]' \
- ':branch:__git_branch_names'
- ;;
- (checkout)
- _arguments \
- ':branch:__git_flow_bugfix_list'\
- ;;
- (pull)
- _arguments \
- ':remote:__git_remotes'\
- ':branch:__git_branch_names'
- ;;
- *)
- _arguments \
- -v'[Verbose (more) output]'
- ;;
- esac
- ;;
- esac
- }
- __git-flow-config ()
- {
- local curcontext="$curcontext" state line
- typeset -A opt_args
- _arguments -C \
- ':command:->command' \
- '*::options:->options'
- case $state in
- (command)
- local -a subcommands
- subcommands=(
- 'list:List the configuration. (Alias to `git flow config`)'
- 'set:Set the configuration option'
- )
- _describe -t commands 'git flow config' subcommands
- ;;
- (options)
- case $line[1] in
- (set)
- _arguments \
- --local'[Use repository config file]' \
- --global'[Use global config file]'\
- --system'[Use system config file]'\
- --file'[Use given config file]'\
- ':option:(master develop feature hotfix release support versiontagprefix)'
- ;;
- *)
- _arguments \
- --local'[Use repository config file]' \
- --global'[Use global config file]'\
- --system'[Use system config file]'\
- --file'[Use given config file]'
- ;;
- esac
- ;;
- esac
- }
- __git_flow_version_list ()
- {
- local expl
- declare -a versions
- versions=(${${(f)"$(_call_program versions git flow release list 2> /dev/null | tr -d ' |*')"}})
- __git_command_successful || return
- _wanted versions expl 'version' compadd $versions
- }
- __git_flow_feature_list ()
- {
- local expl
- declare -a features
- features=(${${(f)"$(_call_program features git flow feature list 2> /dev/null | tr -d ' |*')"}})
- __git_command_successful || return
- _wanted features expl 'feature' compadd $features
- }
- __git_flow_bugfix_list ()
- {
- local expl
- declare -a bugfixes
- bugfixes=(${${(f)"$(_call_program bugfixes git flow bugfix list 2> /dev/null | tr -d ' |*')"}})
- __git_command_successful || return
- _wanted bugfixes expl 'bugfix' compadd $bugfixes
- }
- __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_flow_hotfix_list ()
- {
- local expl
- declare -a hotfixes
- hotfixes=(${${(f)"$(_call_program hotfixes git flow hotfix list 2> /dev/null | tr -d ' |*')"}})
- __git_command_successful || return
- _wanted hotfixes expl 'hotfix' compadd $hotfixes
- }
- __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 flow:'provide high-level repository operations'
|