浏览代码

Merge pull request #1442 from willman500/git-hub-flow-plugin

Add autocomplete for git "hubflow"
Robby Russell 12 年之前
父节点
当前提交
3dc1d92950
共有 1 个文件被更改,包括 348 次插入0 次删除
  1. 348 0
      plugins/git-hubflow/git-hubflow.plugin.zsh

+ 348 - 0
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'