# shellcheck shell=bash
#
# git-flow-completion
# ===================
#
# Bash completion support for [git-flow](http://github.com/nvie/gitflow)
#
# The contained completion routines provide support for completing:
#
#  * git-flow init and version
#  * feature, hotfix and release branches
#  * remote feature branch names (for `git-flow feature track`)
#
#
# Installation
# ------------
#
# To achieve git-flow completion nirvana:
#
#  0. Install git-completion.
#
#  1. Install this file. Either:
#
#     a. Place it in a `bash-completion.d` folder:
#
#        * /etc/bash-completion.d
#        * /usr/local/etc/bash-completion.d
#        * ~/bash-completion.d
#
#     b. Or, copy it somewhere (e.g. ~/.git-flow-completion.sh) and put the following line in
#        your .bashrc:
#
#            source ~/.git-flow-completion.sh
#
#  2. If you are using Git < 1.7.1: Edit git-completion.sh and add the following line to the giant
#     $command case in _git:
#
#         flow)        _git_flow ;;
#
#
# The Fine Print
# --------------
#
# Copyright (c) 2010 [Justin Hileman](http://justinhileman.com)
#
# Distributed under the [MIT License](http://creativecommons.org/licenses/MIT/)

_git_flow() {
	local subcommands subcommand
	subcommands="init feature release hotfix"
	subcommand="$(__git_find_subcommand "$subcommands")"
	if [ -z "$subcommand" ]; then
		__gitcomp "$subcommands"
		return
	fi

	case "$subcommand" in
		feature)
			__git_flow_feature
			return
			;;
		release)
			__git_flow_release
			return
			;;
		hotfix)
			__git_flow_hotfix
			return
			;;
		*)
			COMPREPLY=()
			;;
	esac
}

__git_flow_feature() {
	local subcommands subcommand
	subcommands="list start finish publish track diff rebase checkout pull"
	subcommand="$(__git_find_subcommand "$subcommands")"
	if [ -z "$subcommand" ]; then
		__gitcomp "$subcommands"
		return
	fi

	case "$subcommand" in
		pull)
			__gitcomp "$(__git_remotes)"
			return
			;;
		checkout | finish | diff | rebase)
			__gitcomp "$(__git_flow_list_features)"
			return
			;;
		publish)
			__gitcomp "$(comm -23 <(__git_flow_list_features) <(__git_flow_list_remote_features))"
			return
			;;
		track)
			__gitcomp "$(__git_flow_list_remote_features)"
			return
			;;
		*)
			COMPREPLY=()
			;;
	esac
}

__git_flow_list_features() {
	git flow feature list 2> /dev/null | tr -d ' |*'
}

__git_flow_list_remote_features() {
	git branch -r 2> /dev/null | grep "origin/$(__git_flow_feature_prefix)" | awk '{ sub(/^origin\/$(__git_flow_feature_prefix)/, "", $1); print }'
}

__git_flow_feature_prefix() {
	git config gitflow.prefix.feature 2> /dev/null || echo "feature/"
}

__git_flow_release() {
	local subcommands subcommand
	subcommands="list start finish"
	subcommand="$(__git_find_subcommand "$subcommands")"
	if [ -z "$subcommand" ]; then
		__gitcomp "$subcommands"
		return
	fi

	case "$subcommand" in
		finish)
			__gitcomp "$(__git_flow_list_releases)"
			return
			;;
		*)
			COMPREPLY=()
			;;
	esac

}

__git_flow_list_releases() {
	git flow release list 2> /dev/null
}

__git_flow_hotfix() {
	local subcommands subcommand
	subcommands="list start finish"
	subcommand="$(__git_find_subcommand "$subcommands")"
	if [ -z "$subcommand" ]; then
		__gitcomp "$subcommands"
		return
	fi

	case "$subcommand" in
		finish)
			__gitcomp "$(__git_flow_list_hotfixes)"
			return
			;;
		*)
			COMPREPLY=()
			;;
	esac
}

__git_flow_list_hotfixes() {
	git flow hotfix list 2> /dev/null
}

# temporarily wrap __git_find_on_cmdline() for backwards compatibility
if ! _command_exists __git_find_subcommand; then
	alias __git_find_subcommand=__git_find_on_cmdline
fi
