#
# 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] [-v]"
	echo "       git flow hotfix start <version> [<base>]"
	echo "       git flow hotfix finish <version>"
}

cmd_default() {
	cmd_list "$@"
}

cmd_list() {
	DEFINE_boolean verbose false 'verbose (more) output' v
	parse_args "$@"

	typeset hotfix_branches
	typeset current_branch
	typeset short_names
	hotfix_branches="$(echo "$LOCAL_BRANCHES" | grep "^$PREFIX")"
	if [ -z "$hotfix_branches" ]; then
		warn "No hotfix branches exist."
		exit 0
	fi
	current_branch=$(git branch | grep '^\* ' | grep -v 'no branch' | sed 's/^* //g')
	short_names=$(echo "$hotfix_branches" | sed "s?^$PREFIX??g")

	# determine column width first
	typeset -i width=0
	typeset branch
	for branch in $short_names; do
		typeset -i len=$(($(echo "$branch" | wc -c) - 1))
		width=$(max $width $len)
	done
	width=width+3

	typeset branch
	for branch in $short_names; do
		typeset fullname="$PREFIX$branch"
		typeset base=$(git merge-base "$fullname" "$MASTER_BRANCH")
		typeset master_sha=$(git rev-parse "$MASTER_BRANCH")
		typeset branch_sha=$(git rev-parse "$fullname")
		if [ "$fullname" = "$current_branch" ]; then
			printf "* "
		else
			printf "  "
		fi
		if flag verbose; then
			printf "%-${width}s" "$branch"
			if [ "$branch_sha" = "$master_sha" ]; then
				printf "(no commits yet)"
			else
				typeset tagname=$(git name-rev --tags --no-undefined --name-only $base)
				typeset nicename
				if [ "$tagname" != "" ]; then
					nicename="$tagname"
				else
					nicename="$(git rev-parse --short $base)"
				fi
				printf "(based on $nicename)"
			fi
		else
			printf "%s" "$branch"
		fi
		echo
	done
}

cmd_help() {
	usage
	exit 0
}

parse_args() {
	# parse options
	FLAGS "$@" || exit $?
	eval set -- "${FLAGS_ARGV}"

	# read arguments into global variables
	VERSION="$1"
	BRANCH=$PREFIX$VERSION
}

require_version_arg() {
	if [ "$VERSION" = "" ]; then
		warn "Missing argument <version>"
		usage
		exit 1
	fi
}

require_base_is_on_master() {
	if ! git branch --contains "$BASE" 2>/dev/null \
			| sed 's/[* ] //g' \
	  		| grep -q "^$MASTER_BRANCH\$"; then
		die "fatal: Given base '$BASE' is not a valid commit on '$MASTER_BRANCH'."
	fi
}

cmd_start() {
	DEFINE_boolean fetch true "fetch from $ORIGIN before performing finish" F
	parse_args "$@"
	BASE="${2:-$MASTER_BRANCH}"
	require_version_arg
	require_base_is_on_master

	# sanity checks
	gitflow_require_clean_working_tree
	gitflow_require_branch_absent $BRANCH
	gitflow_require_tag_absent $VERSION_PREFIX$VERSION
	if flag fetch; then
		git fetch -q $ORIGIN $MASTER_BRANCH
	fi
	gitflow_require_branches_equal $MASTER_BRANCH $ORIGIN/$MASTER_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 hotfix finish '$VERSION'"
	echo
}

cmd_finish() {
	DEFINE_boolean fetch true "fetch from $ORIGIN before performing finish" F
	DEFINE_boolean sign false "sign the release tag cryptographically" s
	DEFINE_string signingkey "" "use the given GPG-key for the digital signature (implies -s)" u
	DEFINE_string message "" "use the given tag message" m
	parse_args "$@"
	require_version_arg

	# handle flags that imply other flags
	if [ "$FLAGS_signingkey" != "" ]; then
		FLAGS_sign=$FLAGS_TRUE
	fi

	# sanity checks
	gitflow_require_branch $BRANCH
	gitflow_require_clean_working_tree
	if flag fetch; then
		git fetch -q $ORIGIN $MASTER_BRANCH || \
		  die "Could not fetch $MASTER_BRANCH from $ORIGIN."
		git fetch -q $ORIGIN $DEVELOP_BRANCH || \
		  die "Could not fetch $DEVELOP_BRANCH from $ORIGIN."
	fi
	gitflow_require_branches_equal $MASTER_BRANCH $ORIGIN/$MASTER_BRANCH
	gitflow_require_branches_equal $DEVELOP_BRANCH $ORIGIN/$DEVELOP_BRANCH

	# merge into master
	git checkout $MASTER_BRANCH || \
	  die "Could not check out $MASTER_BRANCH."
	git merge --no-ff $BRANCH	# TODO: This can fail!

	typeset opts="-a"
	flag sign && opts="$opts -s"
	[ "$FLAGS_signingkey" != "" ] && opts="$opts -u '$FLAGS_signingkey'"
	[ "$FLAGS_message" != "" ] && opts="$opts -m '$FLAGS_message'"
	git tag $opts "$VERSION_PREFIX$VERSION" || \
	  die "Tagging failed. Please run finish again to retry."

	# merge into develop
	git checkout $DEVELOP_BRANCH || \
	  die "Could not check out $DEVELOP_BRANCH."
	git merge --no-ff $BRANCH	# TODO: This can fail!

	# 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 '$MASTER_BRANCH'"
	echo "- The hotfix was tagged '$VERSION_PREFIX$VERSION'"
	echo "- Hotfix branch has been back-merged into '$DEVELOP_BRANCH'"
	echo "- Hotfix branch '$BRANCH' has been deleted"
	echo
}
