#!zsh # # Installation # ------------ # # To achieve git-hubflow 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-hubflow-completion.zsh) and put the following line in # your .zshrc: # # source ~/.git-hubflow-completion.zsh # # c. Or, use this file as a oh-my-zsh plugin. # _git-hf () { 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.' 'update:Pull upstream changes down into your master and develop branches.' 'version:Shows version information.' ) _describe -t commands 'git hf' subcommands ;; (options) case $line[1] in (init) _arguments \ -f'[Force setting of gitflow branches, even if already configured]' ;; (version) ;; (hotfix) __git-hf-hotfix ;; (release) __git-hf-release ;; (feature) __git-hf-feature ;; esac ;; esac } __git-hf-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 hf release`)' 'cancel:Cancel release' 'push:Push release to github' 'pull:Pull release from github' 'track:Track release' ) _describe -t commands 'git hf release' subcommands _arguments \ -v'[Verbose (more) output]' ;; (options) case $line[1] in (start) _arguments \ -F'[Fetch from origin before performing finish]'\ ':version:__git_hf_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]'\ -k'[Keep branch after performing finish]'\ -n"[Don't tag this release]"\ ':version:__git_hf_version_list' ;; *) _arguments \ -v'[Verbose (more) output]' ;; esac ;; esac } __git-hf-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 hf hotfix`)' 'publish:Publish the hotfix branch.' 'track:Track the hotfix branch.' 'pull:Pull the hotfix from github.' 'push:Push the hotfix to github.' 'cancel:Cancel the hotfix.' ) _describe -t commands 'git hf hotfix' subcommands _arguments \ -v'[Verbose (more) output]' ;; (options) case $line[1] in (start) _arguments \ -F'[Fetch from origin before performing finish]'\ ':hotfix:__git_hf_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]'\ -k'[Keep branch after performing finish]'\ -n"[Don't tag this release]"\ ':hotfix:__git_hf_hotfix_list' ;; *) _arguments \ -v'[Verbose (more) output]' ;; esac ;; esac } __git-hf-feature () { 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 all your feature branches. (Alias to `git hf feature`)' 'start:Start a new feature branch' 'finish:Finish a feature branch' 'submit:submit' 'track:track' 'diff:Diff' 'rebase:Rebase feature branch against develop' 'checkout:Checkout feature' 'pull:Pull feature branch from github' 'push:Push feature branch to github' 'cancel:Cancel feature' ) _describe -t commands 'git hf feature' subcommands _arguments \ -v'[Verbose (more) output]' ;; (options) case $line[1] in (start) _arguments \ -F'[Fetch from origin before performing finish]'\ ':feature:__git_hf_feature_list'\ ':branch-name:__git_branch_names' ;; (finish) _arguments \ -F'[Fetch from origin before performing finish]' \ -r'[Rebase instead of merge]'\ ':feature:__git_hf_feature_list' ;; (publish) _arguments \ ':feature:__git_hf_feature_list'\ ;; (track) _arguments \ ':feature:__git_hf_feature_list'\ ;; (diff) _arguments \ ':branch:__git_branch_names'\ ;; (rebase) _arguments \ -i'[Do an interactive rebase]' \ ':branch:__git_branch_names' ;; (checkout) _arguments \ ':branch:__git_hf_feature_list'\ ;; (pull) _arguments \ ':remote:__git_remotes'\ ':branch:__git_branch_names' ;; *) _arguments \ -v'[Verbose (more) output]' ;; esac ;; esac } __git_hf_version_list () { local expl declare -a versions versions=(${${(f)"$(_call_program versions git hf release list 2> /dev/null | tr -d ' |*')"}}) __git_command_successful || return _wanted versions expl 'version' compadd $versions } __git_hf_feature_list () { local expl declare -a features features=(${${(f)"$(_call_program features git hf 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_hf_hotfix_list () { local expl declare -a hotfixes hotfixes=(${${(f)"$(_call_program hotfixes git hf 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:'description for foo'