浏览代码

Added git-flow plugin

Kevin Daudt 13 年之前
父节点
当前提交
7377ba3f7a
共有 2 个文件被更改,包括 334 次插入1 次删除
  1. 2 1
      .gitignore
  2. 332 0
      plugins/git-flow/git-flow.plugin.zsh

+ 2 - 1
.gitignore

@@ -2,4 +2,5 @@ locals.zsh
 log/.zsh_history
 projects.zsh
 custom/*
-!custom/example.zsh
+!custom/example.zsh
+cache

+ 332 - 0
plugins/git-flow/git-flow.plugin.zsh

@@ -0,0 +1,332 @@
+#!zsh
+#
+# Installation
+# ------------
+#
+# To achieve git-flow 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-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.'
+				'release:Manage your release branches.'
+				'hotfix:Manage your hotfix branches.'
+				'support:Manage your support branches.'
+				'version:Shows version information.'
+			)
+			_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
+					;;
+			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`)'
+			)
+			_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'
+				;;
+
+				*)
+					_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`)'
+			)
+			_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'
+				;;
+
+				*)
+					_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: public'
+				'track: track'
+				'diff: diff'
+				'rebase: rebase'
+				'checkout: checkout'
+				'pull: pull'
+			)
+			_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'
+				;;
+
+				(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_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_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'