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

# Default entry when no SUBACTION is given
cmd_default() {
	if ! git rev-parse --git-dir >/dev/null 2>&1; then
		git init
	else
		echo "Will try to incorporate git-flow into your current repo."
	fi

	local branch_count

	# add a master branch if no such branch exists yet
	# TODO: Distinguish two cases:
	#       1. NO BRANCHES EXIST AT ALL! (fresh repo):
	#          allow a name for the branch-to-be-created
	#       2. THERE EXIST SOME BRANCHES
	#          master must be based on (or *be*) one of those!
	local master_branch
	master_branch=$(git config --get gitflow.branch.master)
	if [ "$master_branch" = "" ]; then
		# first, ask how to create the master branch
		echo
		echo "Which branch should be used for bringing forth production releases?"
		branch_count=$(gitflow_all_branches | wc -l)
		if [ "$branch_count" -gt 0 ]; then
			gitflow_all_branches | sed 's/^.*$/   - &/g'
			echo "You may use an existing branch name, or specify a new one."
		fi
		echo "Branch name for production releases: [master] \c"
		read master_branch
		master_branch=${master_branch:-master}

		# store the name of the master branch
		git config gitflow.branch.master "$master_branch"
	fi

	# add a develop branch if no such branch exists yet
	local develop_branch
	develop_branch=$(git config --get gitflow.branch.develop)
	if [ "$develop_branch" = "" ]; then
		# next, ask how to create the develop branch
		echo
		echo "Which branch should be used for developing the \"next release\"?"
		branch_count=$(gitflow_all_branches | grep -v "^${master_branch}\$" | wc -l)
		if [ "$branch_count" -gt 0 ]; then
			gitflow_all_branches | grep -v "^${master_branch}\$" | sed 's/^.*$/   - &/g'
			echo "You may use an existing branch name, or specify a new one."
		fi
		echo "Branch name for \"next release\" development: [develop] \c"
		read develop_branch
		develop_branch=${develop_branch:-develop}

		# store the name of the develop branch
		git config gitflow.branch.develop "$develop_branch"
	fi

	# create a HEAD now, if it does not exist yet (in a just init'ed repo)
	if ! git rev-parse --quiet --verify HEAD >/dev/null 2>&1; then
		git symbolic-ref HEAD "refs/heads/$master_branch"
		git commit --allow-empty --quiet -m "Initial commit"
	fi

	# if the selected master branch exists, it's okay, else create it (base on
	# the currently checked out branch)
	if ! gitflow_branch_exists "$master_branch"; then
		git branch "$master_branch"
	fi

	if ! gitflow_branch_exists "$develop_branch"; then
		git branch "$develop_branch" "$master_branch"	 # base it on the master branch!
	else
		# TODO: this test should be moved up, in the selection of the develop
		# branch! Branches that do not have a merge base with master shouldn't
		# be allowed to pick in the first place!
		gitflow_test_branches_equal "$develop_branch" "$master_branch"
		if [ $? -eq 4 ]; then
			warn "fatal: $develop_branch and $master_branch have no common ancestors."
			die "fatal: $develop_branch cannot be used for development."
		fi
	fi

	gitflow_require_clean_working_tree

	# checkout the develop branch to start working
	git checkout -q "$develop_branch"

	# TODO: finally, ask the user for naming convention preferences
	# i.e. tag prefixes, prefixes for supporting branches, etc.

	# TODO: what to do with origin?
}

cmd_help() {
	usage
	exit 0
}
