diff options
Diffstat (limited to 'plugins/git-flow-avh')
| -rw-r--r-- | plugins/git-flow-avh/README.md | 19 | ||||
| -rw-r--r-- | plugins/git-flow-avh/git-flow-avh.plugin.zsh | 841 | 
2 files changed, 493 insertions, 367 deletions
| diff --git a/plugins/git-flow-avh/README.md b/plugins/git-flow-avh/README.md new file mode 100644 index 000000000..0768d93ea --- /dev/null +++ b/plugins/git-flow-avh/README.md @@ -0,0 +1,19 @@ +# git-flow (AVH Edition) plugin + +This plugin adds completion for the [git-flow (AVH Edition)](https://github.com/petervanderdoes/gitflow-avh). +The AVH Edition of the git extensions that provides high-level repository operations for [Vincent Driessen's branching model](https://nvie.com/posts/a-successful-git-branching-model/). + +To use it, add `git-flow-avh` to the plugins array in your zshrc file: + +```zsh +plugins=(... git-flow-avh) +``` + +## Requirements + +1. The git-flow tool has to be [installed](https://github.com/petervanderdoes/gitflow-avh#installing-git-flow) +   separately. + +2. You have to use zsh's git completion instead of the git project's git completion. This is typically +   done by default so you don't need to do anything else. If you installed git with Homebrew you +   might have to uninstall the git completion it's bundled with. diff --git a/plugins/git-flow-avh/git-flow-avh.plugin.zsh b/plugins/git-flow-avh/git-flow-avh.plugin.zsh index ba98fff01..860ca55c5 100644 --- a/plugins/git-flow-avh/git-flow-avh.plugin.zsh +++ b/plugins/git-flow-avh/git-flow-avh.plugin.zsh @@ -1,419 +1,526 @@ -#!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.' -				'finish:Finish the branch you are currently on.' -				'delete:Delete the branch you are currently on.' -				'publish:Publish the branch you are currently on.' -			) -			_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 +    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.' +                'bugfix:Manage your bugfix branches.' +                'config:Manage your configuration.' +                'release:Manage your release branches.' +                'hotfix:Manage your hotfix branches.' +                'support:Manage your support branches.' +                'version:Shows version information.' +                'finish:Finish the branch you are currently on.' +                'delete:Delete the branch you are currently on.' +                'publish:Publish the branch you are currently on.' +                'rebase:Rebase the branch you are currently on.' +            ) +            _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 +                    ;; +                    (bugfix) +                        __git-flow-bugfix +                    ;; + +                    (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.' -				'delete: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 +    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.' +                'rebase:Rebase from integration branch.' +                'delete: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' +                ;; + +                (rebase) +                    _arguments \ +                        -i'[Do an interactive rebase]' \ +                        ':branch:__git_branch_names' +                ;; + +                *) +                    _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 +    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.' +                'rebase:Rebase from integration branch.' +                'list:List all your hotfix branches. (Alias to `git flow hotfix`)' +                'rename:Rename a hotfix branch.' +            ) +            _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' +                ;; + +                (rebase) +                    _arguments \ +                        -i'[Do an interactive rebase]' \ +                        ':branch:__git_branch_names' +                ;; + +                *) +                    _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 +    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.' +                'rename:Rename a feature branch.' +            ) +            _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-bugfix () +{ +    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 bugfix branch.' +                'finish:Finish a bugfix branch.' +                'delete:Delete a bugfix branch.' +                'list:List all your bugfix branches. (Alias to `git flow bugfix`)' +                'publish:Publish bugfix branch to remote.' +                'track:Checkout remote bugfix branch.' +                'diff:Show all changes.' +                'rebase:Rebase from integration branch.' +                'checkout:Checkout local bugfix branch.' +                'pull:Pull changes from remote.' +                'rename:Rename a bugfix branch.' +            ) +            _describe -t commands 'git flow bugfix' subcommands +            _arguments \ +                -v'[Verbose (more) output]' +        ;; + +        (options) +            case $line[1] in + +                (start) +                    _arguments \ +                        -F'[Fetch from origin before performing finish]'\ +                        ':bugfix:__git_flow_bugfix_list'\ +                        ':branch-name:__git_branch_names' +                ;; + +                (finish) +                    _arguments \ +                        -F'[Fetch from origin before performing finish]' \ +                        -r'[Rebase instead of merge]'\ +                        ':bugfix:__git_flow_bugfix_list' +                ;; + +                (delete) +                    _arguments \ +                        -f'[Force deletion]' \ +                        -r'[Delete remote branch]' \ +                        ':bugfix:__git_flow_bugfix_list' +                ;; + +                (publish) +                    _arguments \ +                        ':bugfix:__git_flow_bugfix_list'\ +                ;; + +                (track) +                    _arguments \ +                        ':bugfix:__git_flow_bugfix_list'\ +                ;; + +                (diff) +                    _arguments \ +                        ':branch:__git_branch_names'\ +                ;; + +                (rebase) +                    _arguments \ +                        -i'[Do an interactive rebase]' \ +                        ':branch:__git_branch_names' +                ;; + +                (checkout) +                    _arguments \ +                        ':branch:__git_flow_bugfix_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 +    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 +    local expl +    declare -a versions -	versions=(${${(f)"$(_call_program versions git flow release list 2> /dev/null | tr -d ' |*')"}}) -	__git_command_successful || return +    versions=(${${(f)"$(_call_program versions git flow release list 2> /dev/null | tr -d ' |*')"}}) +    __git_command_successful || return -	_wanted versions expl 'version' compadd $versions +    _wanted versions expl 'version' compadd $versions  }  __git_flow_feature_list ()  { -	local expl -	declare -a features +    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_flow_bugfix_list () +{ +    local expl +    declare -a bugfixes -	features=(${${(f)"$(_call_program features git flow feature list 2> /dev/null | tr -d ' |*')"}}) -	__git_command_successful || return +    bugfixes=(${${(f)"$(_call_program bugfixes git flow bugfix list 2> /dev/null | tr -d ' |*')"}}) +    __git_command_successful || return -	_wanted features expl 'feature' compadd $features +    _wanted bugfixes expl 'bugfix' compadd $bugfixes  }  __git_remotes () { -	local expl gitdir remotes +    local expl gitdir remotes -	gitdir=$(_call_program gitdir git rev-parse --git-dir 2>/dev/null) -	__git_command_successful || return +    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 +    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 +    # 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 +    local expl +    declare -a hotfixes -	hotfixes=(${${(f)"$(_call_program hotfixes git flow hotfix list 2> /dev/null | tr -d ' |*')"}}) -	__git_command_successful || return +    hotfixes=(${${(f)"$(_call_program hotfixes git flow hotfix list 2> /dev/null | tr -d ' |*')"}}) +    __git_command_successful || return -	_wanted hotfixes expl 'hotfix' compadd $hotfixes +    _wanted hotfixes expl 'hotfix' compadd $hotfixes  }  __git_branch_names () { -	local expl -	declare -a 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 +    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 +    _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 +    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' | 
