__git_imerge_branches () {
	git for-each-ref --format='%(refname)' refs/heads/ refs/remotes/ 2>/dev/null |
	sed -e 's!^refs/heads/!!' -e 's!^refs/remotes/!!'
}

__git_imerge_names () {
	git for-each-ref --format='%(refname)' refs/imerge/ 2>/dev/null |
	sed -e 's/^refs\/imerge\/\(.*\)\/.*/\1/' -e '/manual/d' -e '/auto/d'
}

__git_imerge_goals="\
merge
rebase
rebase-with-history
full
"

__git_imerge_commands="\
start
merge
rebase
continue
finish
diagram
list
init
record
autofill
simplify
remove
reparent
"

__git_imerge_start_options="\
--help
--manual
--name
--branch
--goal
--first-parent
"

__git_imerge_init_options=$__git_imerge_start_options

__git_imerge_continue_options="\
--help
--name
--edit
--no-edit
"

__git_imerge_finish_options="\
--help
--name
--goal
--branch
--force
"

__git_imerge_simplify_options=$__git_imerge_finish_options

__git_imerge_merge_options="\
--help
--name
--goal
--branch
--manual
"

__git_imerge_list_options="\
--help
"

__git_imerge_reparent_options=$__git_imerge_list_options

__git_imerge_record_options="\
--help
--name
--edit
--no-edit
"

__git_imerge_autofill_options="\
--help
--name
"

__git_imerge_diagram_options="\
--help
--name
--commits
--frontier
--html
--color
--no-color
"

__git_imerge_remove_options=$__git_imerge_autofill_options

__git_imerge_rebase_options=$__git_imerge_merge_options

__git-imerge_start_completion() {
	case "$1_$cur" in
	--help_|--branch_|_--branch=|--name_|_--name=)
		return
		;;
	--goal_*|*_--goal=*)
		__gitcomp "$__git_imerge_goals"  "" "${cur##--goal=}"
		return
		;;
	*-|*_-*?)
		__gitcomp "$__git_imerge_start_options"
		return
		;;
	esac
	__gitcomp "$(__git_imerge_branches)"
}

__git-imerge_init_completion() {
	__git-imerge_start_completion $1
}

__git-imerge_continue_completion() {
	case "$1_$cur" in
	--help_)
		return
		;;
	--name_*|*_--name=*)
                __gitcomp "$(__git_imerge_names)" "" "${cur##--name=}"
                return
                ;;
	esac
	__gitcomp "$__git_imerge_continue_options"
}

__git-imerge_finish_completion() {
	case "$1_$cur" in
	--help_)
		return
		;;
	--goal_*|*_--goal=*)
		__gitcomp "$__git_imerge_goals" "" "${cur##--goal=}"
		return
		;;
	--branch_*|*_--branch=*)
		__gitcomp "$(__git_imerge_branches)" "" "${cur##--branch=}"
		return
		;;
	--name_*|*_--name=*)
                __gitcomp "$(__git_imerge_names)" "" "${cur##--name=}"
                return
                ;;
	esac
	__gitcomp "$__git_imerge_finish_options"
}

__git-imerge_simplify_completion() {
	__git-imerge_finish_completion $1
}

__git-imerge_merge_completion() {
	case "$1_$cur" in
	--help_|--branch_|_--branch=|--name_|_--name=)
		return
		;;
	--goal_*|*_--goal=*)
		__gitcomp "$__git_imerge_goals" "" "${cur##--goal=}"
		return
		;;
	*-|*_-*?)
		__gitcomp "$__git_imerge_merge_options"
		return
		;;
	esac
	__gitcomp "$(__git_imerge_branches)"
}

__git-imerge_rebase_completion() {
	__git-imerge_merge_completion $1
}

__git-imerge_list_completion() {
	case "$1" in
	--help)
		return
		;;
	esac
	__gitcomp "$__git_imerge_list_options"
}

__git-imerge_reparent_completion() {
	__git-imerge_list_completion $1
}

__git-imerge_record_completion() {
	case "$1_$cur" in
	--help_)
		return
		;;
	--name_*|*_--name=*)
		__gitcomp "$(__git_imerge_names)" "" "${cur##--name=}"
                return
                ;;
	esac
	__gitcomp "$__git_imerge_record_options"
}

__git-imerge_autofill_completion() {
	case "$1_$cur" in
	--help_)
		return
		;;
	--name_*|*_--name=*)
		__gitcomp "$(__git_imerge_names)" "" "${cur##--name=}"
                return
                ;;
	esac
	__gitcomp "$__git_imerge_autofill_options"
}

__git-imerge_remove_completion() {
	__git-imerge_autofill_completion $1
}

__git-imerge_diagram_completion() {
	case "$1_$cur" in
	--help_|--html_|_--html=)
		return
		;;
	--name_*|*_--name=*)
		__gitcomp "$(__git_imerge_names)" "" "${cur##--name=}"
		return
                ;;
	esac
	__gitcomp "$__git_imerge_diagram_options"
}

_git_imerge () {
	# Disable default filename completion.  Note that "compopt" is only
	# available in Bash 4 and newer, so we check for existence before
	# trying to use it.
	type compopt >/dev/null 2>&1 && compopt +o default +o bashdefault

	local i command cur_opt
	for ((i=0; i <= ${cword}; i++)); do
		if [ -n "$command" ] && [ "${words[i]}" != "$cur" ]; then
			cur_opt="${words[i]}"
		fi
		if [ -z "$command" ] && \
		   [ "$i" -lt "${cword}" ] && \
		   [[ "${words[i-1]}" == *"imerge"* ]]
		then
			command="${words[i]}"
		fi
	done

	if test -z "$command"; then
		__gitcomp "$__git_imerge_commands"
		return
	fi

	if [ -z `type -t __git-imerge_"$command"_completion "$cur_opt"` ]; then
		return
	fi

	__git-imerge_"$command"_completion "$cur_opt"
}
