#
# git-flow -- A collection of Git extensions to provide high-level
# repository operations for Vincent Driessen's branching model.
#
# Original blog post presenting this model is found at:
#    http://nvie.com/archives/323
#
# Feel free to contribute to this project at:
#    http://github.com/nvie/gitflow
#
# Copyright (c) 2010 by Vincent Driessen
# Copyright (c) 2010 by Benedikt Böhm
#

usage() {
	echo "usage: git flow hotfix [list]"
	echo "       git flow hotfix start <version> [<base>]"
	echo "       git flow hotfix finish <version> [<base>]"
	# TODO
	#echo ""
	#echo "options:"
	#echo "--option    Explanation"
	#echo ""
	#echo "start-only options:"
	#echo "--option    Explanation"
	#echo ""
	#echo "finish-only options:"
	#echo "--push      Push to the origin repo when finished"
}

# setup will always be called before the actual cmd_* functions
setup() {
	PREFIX=$(git config --get gitflow.prefix.hotfix || echo hotfix/)
}

cmd_default() {
	cmd_list "$@"
}

cmd_list() {
	HOTFIX_BRANCHES="$(echo "$LOCAL_BRANCHES" | grep "^$PREFIX")"
	if [ -z "$HOTFIX_BRANCHES" ]; then
		warn "No hotfix branches exist."
		exit 0
	fi
	echo "$HOTFIX_BRANCHES" | sed "s?^$PREFIX??g"
}

cmd_help() {
	usage
	exit 0
}

parse_args() {
	VERSION="$1"
	BASE="${2:-$MASTER_BRANCH}"
	if [ "$VERSION" = "" ]; then
		echo "Missing argument <version>."
		usage
		exit 1
	fi
	PREFIX=$(git config --get gitflow.prefix.hotfix || echo hotfix/)
	BRANCH=$PREFIX$VERSION
}

cmd_start() {
	parse_args "$@"

	# sanity checks
	gitflow_check_clean_working_tree
	git fetch -q $ORIGIN
	gitflow_require_branches_equal $MASTER_BRANCH $ORIGIN/$MASTER_BRANCH
	gitflow_require_branch_absent $BRANCH

	# create branch
	git checkout -b $BRANCH $BASE

	echo
	echo "Summary of actions:"
	echo "- A new branch '$BRANCH' was created, based on '$BASE'"
	echo "- You are now on branch '$BRANCH'"
	echo
	echo "Follow-up actions:"
	echo "- Bump the version number now!"
	echo "- Start committing your hot fixes"
	echo "- When done, run:"
	echo
	echo "     git flow finish hotfix '$HOTFIX_BRANCH'"
	echo
}

cmd_finish() {
	parse_args "$@"

	# sanity checks
	gitflow_check_clean_working_tree
	git fetch -q $ORIGIN $MASTER_BRANCH
	git fetch -q $ORIGIN $DEVELOP_BRANCH
	gitflow_require_branches_equal $MASTER_BRANCH $ORIGIN/$MASTER_BRANCH
	gitflow_require_branches_equal $DEVELOP_BRANCH $ORIGIN/$DEVELOP_BRANCH

	# merge into BASE
	git checkout $BASE
	git merge --no-ff $BRANCH
	git tag v$VERSION

	# merge into develop if we fixed a master issue
	# TODO: merge into support branch
	if [ "$BASE" = "$MASTER_BRANCH" ]; then
		git checkout $DEVELOP_BRANCH
		git merge --no-ff $BRANCH
	fi

	# delete branch
	git branch -d $BRANCH

	# TODO: Implement an optional push to master
	# git push origin develop; git push origin master; git push --tags origin

	echo
	echo "Summary of actions:"
	echo "- Latest objects have been fetched from '$ORIGIN'"
	echo "- Hotfix branch has been merged into '$BASE'"
	echo "- The hotfix was tagged 'v$VERSION'"
	if [ "$BASE" = "$MASTER_BRANCH" ]; then
		echo "- Hotfix branch has been back-merged into '$DEVELOP_BRANCH'"
	fi
	echo "- Hotfix branch '$BRANCH' has been deleted"
	echo
}
