diff options
Diffstat (limited to 'plugins/git-flow-avh')
| -rw-r--r-- | plugins/git-flow-avh/git-flow-avh.plugin.zsh | 416 | 
1 files changed, 416 insertions, 0 deletions
| diff --git a/plugins/git-flow-avh/git-flow-avh.plugin.zsh b/plugins/git-flow-avh/git-flow-avh.plugin.zsh new file mode 100644 index 000000000..d76f55ef6 --- /dev/null +++ b/plugins/git-flow-avh/git-flow-avh.plugin.zsh @@ -0,0 +1,416 @@ +#!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.' +				'config:Manage your configuration.' +				'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 +					;; +					(config) +					__git-flow-config +					;; + +			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 release branch to remote.' +				'track:Checkout remote release branch.' +				'delet:Delete a release branch.' +			) +			_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' +				;; + +				(delete) +					_arguments \ +						-f'[Force deletion]' \ +						-r'[Delete remote branch]' \ +						':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.' +				'delete:Delete 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' +				;; + +				(delete) +					_arguments \ +						-f'[Force deletion]' \ +						-r'[Delete remote branch]' \ +						':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.' +				'delete:Delete a feature branch.' +				'list:List all your feature branches. (Alias to `git flow feature`)' +				'publish:Publish feature branch to remote.' +				'track:Checkout remote feature branch.' +				'diff:Show all changes.' +				'rebase:Rebase from integration branch.' +				'checkout:Checkout local feature branch.' +				'pull:Pull changes from remote.' +			) +			_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' +				;; + +				(delete) +					_arguments \ +						-f'[Force deletion]' \ +						-r'[Delete remote branch]' \ +						':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-config () +{ +	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 the configuration. (Alias to `git flow config`)' +				'set:Set the configuration option' +			) +			_describe -t commands 'git flow config' subcommands +		;; + +		(options) +			case $line[1] in + +				(set) +					_arguments \ +						--local'[Use repository config file]' \ +						--global'[Use global config file]'\ +						--system'[Use system config file]'\ +						--file'[Use given config file]'\ +						':option:(master develop feature hotfix release support	versiontagprefix)' +				;; + +				*) +					_arguments \ +						--local'[Use repository config file]' \ +						--global'[Use global config file]'\ +						--system'[Use system config file]'\ +						--file'[Use given config file]' +				;; +			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:'provide high-level repository operations' | 
