#
# 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/git-model
#
# Feel free to contribute to this project at:
#    http://github.com/nvie/gitflow
#
# Copyright 2010 Vincent Driessen. All rights reserved.
# 
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are met:
# 
#    1. Redistributions of source code must retain the above copyright notice,
#       this list of conditions and the following disclaimer.
# 
#    2. Redistributions in binary form must reproduce the above copyright
#       notice, this list of conditions and the following disclaimer in the
#       documentation and/or other materials provided with the distribution.
# 
# THIS SOFTWARE IS PROVIDED BY VINCENT DRIESSEN ``AS IS'' AND ANY EXPRESS OR
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
# EVENT SHALL VINCENT DRIESSEN OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
# INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
# OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
# NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
# EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
# 
# The views and conclusions contained in the software and documentation are
# those of the authors and should not be interpreted as representing official
# policies, either expressed or implied, of Vincent Driessen.
#

require_git_repo
require_gitflow_initialized
gitflow_load_settings
VERSION_PREFIX=$(git config --get gitflow.prefix.versiontag)
PREFIX=$(git config --get gitflow.prefix.release)

usage() {
	echo "usage: git flow release [list] [-v]"
	echo "       git flow release start [-F] <version>"
	echo "       git flow release finish [-Fsump] <version>"
	echo "       git flow release publish <name>"
	echo "       git flow release track <name>"
}

cmd_default() {
	cmd_list "$@"
}

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

	local release_branches
	local current_branch
	local short_names
	release_branches=$(echo "$(git_local_branches)" | grep "^$PREFIX")
	if [ -z "$release_branches" ]; then
		warn "No release branches exist."
                warn ""
                warn "You can start a new release branch:"
                warn ""
                warn "    git flow release start <name> [<base>]"
                warn ""
		exit 0
	fi

	current_branch=$(git branch --no-color | grep '^\* ' | grep -v 'no branch' | sed 's/^* //g')
	short_names=$(echo "$release_branches" | sed "s ^$PREFIX  g")

	# determine column width first
	local width=0
	local branch
	for branch in $short_names; do
		local len=${#branch}
		width=$(max $width $len)
	done
	width=$(($width+3))

	local branch
	for branch in $short_names; do
		local fullname=$PREFIX$branch
		local base=$(git merge-base "$fullname" "$DEVELOP_BRANCH")
		local develop_sha=$(git rev-parse "$DEVELOP_BRANCH")
		local 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" = "$develop_sha" ]; then
				printf "(no commits yet)"
			else
				local nicename=$(git rev-parse --short "$base")
				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_develop() {
	if ! git branch --no-color --contains "$BASE" 2>/dev/null \
			| sed 's/[* ] //g' \
	  		| grep -q "^$DEVELOP_BRANCH\$"; then
		die "fatal: Given base '$BASE' is not a valid commit on '$DEVELOP_BRANCH'."
	fi
}

require_no_existing_release_branches() {
	local release_branches=$(echo "$(git_local_branches)" | grep "^$PREFIX")
	local first_branch=$(echo ${release_branches} | head -n1)
	first_branch=${first_branch#$PREFIX}
	[ -z "$release_branches" ] || \
		die "There is an existing release branch ($first_branch). Finish that one first."
}

git_actual_branch(){
	git branch --no-color | grep '^*' | sed 's/^[* ] //'
}
require_not_being_in_release_branch() {
	if has $BRANCH $(git_actual_branch); then
		die "You cannot be in the '$BRANCH' branch when you finnish it."
	fi
}

cmd_start() {
	DEFINE_boolean fetch false "fetch from $ORIGIN before performing finish" F
	parse_args "$@"
	BASE=${2:-$DEVELOP_BRANCH}
	require_version_arg
	require_base_is_on_develop
	require_no_existing_release_branches

	# sanity checks
	require_clean_working_tree
	require_branch_absent "$BRANCH"
	require_tag_absent "$VERSION_PREFIX$VERSION"
	if flag fetch; then
		git fetch -q "$ORIGIN" "$DEVELOP_BRANCH"
	fi
	if has "$ORIGIN/$DEVELOP_BRANCH" "$(git_remote_branches)"; then
		require_branches_equal "$DEVELOP_BRANCH" "$ORIGIN/$DEVELOP_BRANCH"
	fi

	# 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 last-minute fixes in preparing your release"
	echo "- When done, run:"
	echo
	echo "     git flow release finish '$VERSION'"
	echo
}

cmd_finish() {
	DEFINE_boolean fetch false "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
	DEFINE_boolean push false "push to $ORIGIN after performing finish" p

	parse_args "$@"
	require_version_arg

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

	# sanity checks
	require_branch "$BRANCH"
	require_clean_working_tree
	require_not_being_in_release_branch
	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
	if has "$ORIGIN/$MASTER_BRANCH" "$(git_remote_branches)"; then
		require_branches_equal "$MASTER_BRANCH" "$ORIGIN/$MASTER_BRANCH"
	fi
	if has "$ORIGIN/$DEVELOP_BRANCH" "$(git_remote_branches)"; then
		require_branches_equal "$DEVELOP_BRANCH" "$ORIGIN/$DEVELOP_BRANCH"
	fi

	# try to merge into master
	# in case a previous attempt to finish this release branch has failed,
	# but the merge into master was successful, we skip it now
	if ! git_is_branch_merged_into "$BRANCH" "$MASTER_BRANCH"; then
		git checkout "$MASTER_BRANCH" || \
		  die "Could not check out $MASTER_BRANCH."
		git merge --no-ff "$BRANCH" || \
		  die "There were merge conflicts."
		  # TODO: What do we do now?
	fi

	# try to tag the release
	# in case a previous attempt to finish this release branch has failed,
	# but the tag was set successful, we skip it now
	local tagname=$VERSION_PREFIX$VERSION
	if ! git_tag_exists "$tagname"; then
		local opts="-a"
		flag sign && opts="$opts -s"
		[ "$FLAGS_signingkey" != "" ] && opts="$opts -u '$FLAGS_signingkey'"
		[ "$FLAGS_message" != "" ] && opts="$opts -m '$FLAGS_message'"
		git tag $opts "$tagname" || \
		  die "Tagging failed. Please run finish again to retry."
	fi

	# try to merge into develop
	# in case a previous attempt to finish this release branch has failed,
	# but the merge into develop was successful, we skip it now
	if ! git_is_branch_merged_into "$BRANCH" "$DEVELOP_BRANCH"; then
		git checkout "$DEVELOP_BRANCH" || \
		  die "Could not check out $DEVELOP_BRANCH."

		# TODO: Actually, accounting for 'git describe' pays, so we should
		# ideally git merge --no-ff $tagname here, instead!
		git merge --no-ff "$BRANCH" || \
		  die "There were merge conflicts."
		  # TODO: What do we do now?
	fi

	# delete branch
	git branch -d "$BRANCH"

	if flag push; then
		git push "$ORIGIN" "$DEVELOP_BRANCH" || \
			die "Could not push to $DEVELOP_BRANCH from $ORIGIN."
		git push "$ORIGIN" "$MASTER_BRANCH" || \
			die "Could not push to $MASTER_BRANCH from $ORIGIN."
		git push --tags "$ORIGIN" || \
			die "Could not push tags to $ORIGIN."
		git push "$ORIGIN" :"$BRANCH" || \
			die "Could not delete the remote $BRANCH in $ORIGIN."
	fi

	echo
	echo "Summary of actions:"
	echo "- Latest objects have been fetched from '$ORIGIN'"
	echo "- Release branch has been merged into '$MASTER_BRANCH'"
	echo "- The release was tagged '$tagname'"
	echo "- Release branch has been back-merged into '$DEVELOP_BRANCH'"
	echo "- Release branch '$BRANCH' has been deleted"
	if flag push; then
		echo "- '$DEVELOP_BRANCH', '$MASTER_BRANCH' and tags have been pushed to '$ORIGIN'"
		echo "- Release branch '$BRANCH' in '$ORIGIN' has been deleted."
	fi
	echo
}

cmd_publish() {
	parse_args "$@"
	require_version_arg

	# sanity checks
	require_clean_working_tree
	require_branch "$BRANCH"
	git fetch -q "$ORIGIN"
	require_branch_absent "$ORIGIN/$BRANCH"

	# create remote branch
	git push "$ORIGIN" "$BRANCH:refs/heads/$BRANCH"
	git fetch -q "$ORIGIN"

	# configure remote tracking
	git config "branch.$BRANCH.remote" "$ORIGIN"
	git config "branch.$BRANCH.merge" "refs/heads/$BRANCH"
	git checkout "$BRANCH"

	echo
	echo "Summary of actions:"
	echo "- A new remote branch '$BRANCH' was created"
	echo "- The local branch '$BRANCH' was configured to track the remote branch"
	echo "- You are now on branch '$BRANCH'"
	echo
}

cmd_track() {
	parse_args "$@"
	require_version_arg

	# sanity checks
	require_clean_working_tree
	require_branch_absent "$BRANCH"
	git fetch -q "$ORIGIN"
	require_branch "$ORIGIN/$BRANCH"

	# create tracking branch
	git checkout -b "$BRANCH" "$ORIGIN/$BRANCH"

	echo
	echo "Summary of actions:"
	echo "- A new remote tracking branch '$BRANCH' was created"
	echo "- You are now on branch '$BRANCH'"
	echo
}
