#
# 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
#

VERSION_PREFIX=$(git config --get gitflow.prefix.versiontag)
PREFIX=$(git config --get gitflow.prefix.hotfix || echo hotfix/)

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"
}

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
	BRANCH=$PREFIX$VERSION
}

cmd_start() {
	parse_args "$@"

	# sanity checks
	gitflow_require_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_require_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 $VERSION_PREFIX$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 '$VERSION_PREFIX$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
}
