diff options
Diffstat (limited to 'plugins/git-hubflow')
| -rw-r--r-- | plugins/git-hubflow/git-hubflow.plugin.zsh | 348 | 
1 files changed, 348 insertions, 0 deletions
| diff --git a/plugins/git-hubflow/git-hubflow.plugin.zsh b/plugins/git-hubflow/git-hubflow.plugin.zsh new file mode 100644 index 000000000..a09f88391 --- /dev/null +++ b/plugins/git-hubflow/git-hubflow.plugin.zsh @@ -0,0 +1,348 @@ +#!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' | 
