#compdef git-flow # ------------------------------------------------------------------------------ # Copyright (c) 2010-2015 Justin Hileman # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal # in the Software without restriction, including without limitation the rights # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell # copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in all # copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. # IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, # DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR # OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE # OR OTHER DEALINGS IN THE SOFTWARE. # ------------------------------------------------------------------------------ # Description # ----------- # # Completion script for git-flow (http://github.com/nvie/gitflow). # # Source: https://github.com/bobthecow/git-flow-completion # # ------------------------------------------------------------------------------ # Authors # ------- # # * Justin Hileman (https://github.com/bobthecow) # * Yusuke Muraoka (https://github.com/jbking) # * Vincent Driessen (https://github.com/nvie) # * Zifei Tong (https://github.com/chevalun) # * Ben O'Hara (https://github.com/benohara) # # ------------------------------------------------------------------------------ _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.' 'release:Manage your release branches.' 'hotfix:Manage your hotfix branches.' 'support:Manage your support branches.' 'version:Shows version information.' 'status:Shows some status.' ) _describe -t commands 'git flow' subcommands ;; (options) case $line[1] in (init) _arguments \ -f'[Force setting of gitflow branches, even if already configured]' \ -d'[Use default branch naming conventions and prefixes]' ;; (version) ;; (hotfix) __git-flow-hotfix ;; (release) __git-flow-release ;; (feature) __git-flow-feature ;; (support) __git-flow-support ;; 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 this release branch to origin.`)' 'track:Track a release branch from origin.`)' ) _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]'\ -n'[Dont tag this release ]'\ -p'[Push to $ORIGIN after performing finish]'\ -k'[Keep branch after performing finish]'\ ':version:__git_flow_version_list' ;; (publish) _arguments \ ':version:__git_flow_version_list' ;; (track) _arguments \ ':version:__git_flow_version_list' ;; *) _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.' 'list:List all your hotfix branches. (Alias to `git flow hotfix`)' 'publish:Publish this hotfix branch to origin`)' ) _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' ;; (publish) _arguments \ ':hotfix:__git_flow_hotfix_list' ;; *) _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.' 'list:List all your feature branches. (Alias to `git flow feature`)' 'publish:Publish this feature branch to origin.' 'track:Track a feature branch from origin.' 'diff:Show a diff of changes since this feature branched off.' 'rebase:Rebase a feature branch on top of develop.' 'checkout:Check out (switch to) the given feature branch.' 'pull:Pull a feature branch from a remote peer.' ) _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'[Finish branch by rebasing first]'\ -k'[Keep branch after performing finish]'\ -D'[Force delete feature branch after finish]'\ ':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-support () { 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 support branch.' 'list:List all your support branches. (Alias to `git flow support`)' ) _describe -t commands 'git flow support' subcommands _arguments \ -v'[Verbose (more) output]' ;; (options) case $line[1] in (start) _arguments \ -F'[Fetch from origin before performing finish]'\ ':feature:__git_flow_support_list'\ ':branch-name:__git_branch_names' ;; *) _arguments \ -v'[Verbose (more) output]' ;; 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_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_flow_support_list () { local expl declare -a support support=(${${(f)"$(_call_program support git flow support list 2> /dev/null | tr -d ' |*')"}}) __git_command_successful || return _wanted hotfixes expl 'support' compadd $support } __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 } _git-flow "$@" # Local Variables: # mode: Shell-Script # sh-indentation: 2 # indent-tabs-mode: nil # sh-basic-offset: 2 # End: # vim: ft=zsh sw=2 ts=2 et