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

PREFIX=$(git config --get gitflow.prefix.feature || echo feature/)
FLAG_FETCH=0

usage() {
	echo "usage: git flow feature [list]"
	echo "       git flow feature start <name> [<base>]"
	echo "       git flow feature finish <name> [<base>]"
	echo "       git flow feature publish <name>"
	echo "       git flow feature track <name>"
	echo "       git flow feature diff <name>"
	# TODO
	#echo ""
	#echo "options:"
	#echo "--option    Explanation"
	#echo ""
	#echo "start-only options:"
	#echo "--option    Explanation"
	#echo ""
	#echo "finish-only options:"
	#echo "--rebase    Rebases the feature branch on top of develop, instead of merging"
	#echo "--squash    Squashes all commits of the feature branch into a single commit"
	#echo "            on develop"
	#echo "--push      Push to the origin repo when finished"
}

cmd_default() {
	cmd_list "$@"
}

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

cmd_help() {
	usage
	exit 0
}

parse_args() {
	# TODO: When we have a nice structured way of parsing flags with getopt,
	# implement the following flags:
	# --fetch, to set FLAG_FETCH=1
	# --no-fetch, to set FLAG_FETCH=0
	NAME="$1"
	BASE="${2:-$DEVELOP_BRANCH}"
	if [ "$NAME" = "" ]; then
		echo "Missing argument <name>."
		usage
		exit 1
	fi
	BRANCH=$PREFIX$NAME
}

cmd_start() {
	parse_args "$@"

	# sanity checks
	gitflow_require_clean_working_tree
	gitflow_require_branch_absent $BRANCH

	# update the local repo with remote changes, if asked
	if [ $FLAG_FETCH -eq 1 ]; then
		git fetch -q $ORIGIN $DEVELOP_BRANCH
	fi

	gitflow_require_branches_equal $DEVELOP_BRANCH $ORIGIN/$DEVELOP_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 "Now, start committing on your feature. When done, use:"
	echo ""
	echo "     git flow finish feature $NAME"
	echo
}

cmd_finish() {
	parse_args "$@"

	# sanity checks
	gitflow_require_branch $BRANCH

	# detect if we're restoring from a merge conflict
	if [ -f "$GIT_DIR/.gitflow/MERGE_BASE" ]; then
		#
		# TODO: detect that we're working on the correct branch here!
		# The user need not necessarily have given the same $NAME twice here
		# (although he/she should).
		# 

		# TODO: gitflow_test_clean_working_tree() should provide an alternative
		# exit code for "unmerged changes in working tree", which we should
		# actually be testing for here
		if gitflow_test_clean_working_tree; then
			FINISH_BASE="$(cat "$GIT_DIR/.gitflow/MERGE_BASE")"

			# Since the working tree is now clean, either the user did a
			# succesfull merge manually, or the merge was cancelled.
			# We detect this using gitflow_is_branch_merged_into()
			if gitflow_is_branch_merged_into $BRANCH $FINISH_BASE; then
				rm -f "$GIT_DIR/.gitflow/MERGE_BASE"
				helper_finish_cleanup
				exit 0
			else
				# If the user cancelled the merge and decided to wait until later,
				# that's fine. But we have to acknowledge this by removing the
				# MERGE_BASE file and continuing normal execution of the finish
				rm -f "$GIT_DIR/.gitflow/MERGE_BASE"
			fi
		else
			echo
			echo "Merge conflicts not resolved yet, use:"
			echo "    git mergetool"
			echo "    git commit"
			echo 
			echo "You can then complete the finish by running it again:"
			echo "    git flow feature finish $NAME"
			echo
			exit 1
		fi
	fi

	# sanity checks
	gitflow_require_clean_working_tree

	# update local repo with remote changes first, if asked
	if [ $FLAG_FETCH -eq 1 ]; then
		git fetch -q $ORIGIN $BRANCH
	fi

	if has $ORIGIN/$BRANCH $REMOTE_BRANCHES; then
		gitflow_require_branches_equal $BRANCH $ORIGIN/$BRANCH
	fi
	if [ "$BASE" = "$DEVELOP_BRANCH" ]; then
		gitflow_require_branches_equal $DEVELOP_BRANCH $ORIGIN/$DEVELOP_BRANCH
	fi

	# merge into BASE
	git checkout $BASE
	if [ "$(git rev-list -n2 $BASE..$BRANCH | wc -l)" = "1" ]; then
		git merge --ff $BRANCH
	else
		git merge --no-ff $BRANCH
	fi

	if [ $? -ne 0 ]; then
		# oops.. we have a merge conflict!
		# write the given $BASE to a temporary file (we need it later)
		mkdir -p "$GIT_DIR/.gitflow"
		echo "$BASE" > "$GIT_DIR/.gitflow/MERGE_BASE"
		echo
		echo "There were merge conflicts. To resolve the merge conflict manually, use:"
		echo "    git mergetool"
		echo "    git commit"
		echo 
		echo "You can then complete the finish by running it again:"
		echo "    git flow feature finish $NAME"
		echo
		exit 1
	fi

	# when no merge conflict is detected, just clean up the feature branch
	helper_finish_cleanup
}

helper_finish_cleanup() {
	# sanity checks
	gitflow_require_branch $BRANCH
	gitflow_require_clean_working_tree

	# delete branch
	git push $ORIGIN :refs/heads/$BRANCH
	git branch -d $BRANCH

	echo
	echo "Summary of actions:"
	echo "- The feature branch '$BRANCH' was merged into '$BASE'"
	#echo "- Merge conflicts were resolved"		# TODO: Add this line when it's supported
	echo "- Feature branch '$BRANCH' has been removed"
	echo "- You are now on branch '$BASE'"
	echo
}

cmd_publish() {
	parse_args "$@"

	# sanity checks
	gitflow_require_clean_working_tree
	gitflow_require_branch $BRANCH
	git fetch -q $ORIGIN
	gitflow_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 "$@"

	# sanity checks
	gitflow_require_clean_working_tree
	gitflow_require_branch_absent $BRANCH
	git fetch -q $ORIGIN
	gitflow_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
}

cmd_diff() {
	parse_args "$@"
	# TODO: if this feature has been based on a non-develop branch, we really
	# should not be comparing to $DEVELOP. How to deal with this?
	git diff $DEVELOP_BRANCH..$BRANCH
}
