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

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

# Default entry when no SUBACTION is given
cmd_default() {
	DEFINE_boolean force false 'force setting of gitflow branches, even if already configured' f
	parse_args "$@"

	if ! git rev-parse --git-dir >/dev/null 2>&1; then
		git init
	else
		# TODO: This still fails when running:
		# git init
		# git flow init

		# assure that we are not working in a repo with local changes
		gitflow_require_clean_working_tree
	fi

	# running git flow init on an already initialized repo is fine
	if gitflow_is_initialized && ! flag force; then
		warn "Already initialized for gitflow."
		warn "To force reinitialization, use: git flow init -f"
		exit 0
	fi

	local branch_count
	local answer

	# add a master branch if no such branch exists yet
	local master_branch
	if gitflow_has_master_configured && ! flag force; then
		master_branch=$(git config --get gitflow.branch.master)
	else
		# Two cases are distinguished:
		# 1. A fresh git repo (without any branches)
		#    We will create a new master/develop branch for the user
		# 2. Some branches do already exist
		#    We will disallow creation of new master/develop branches and
		#    rather allow to use existing branches for git-flow.
		local default_suggestion
		local should_check_existence
		branch_count=$(gitflow_local_branches | wc -l)
		if [ "$branch_count" -eq 0 ]; then
			echo "No branches exist yet. Base branches must be created now."
			should_check_existence=NO
			default_suggestion=master
		else
			echo
			echo "Which branch should be used for bringing forth production releases?"
			gitflow_local_branches | sed 's/^.*$/   - &/g'

			should_check_existence=YES
			default_suggestion=
			for guess in 'production' 'main' 'master'; do
				if gitflow_local_branch_exists "$guess"; then
					default_suggestion="$guess"
					break
				fi
			done
		fi

		echo "Branch name for production releases: [$default_suggestion] \c"
		read answer
		master_branch=${answer:-$default_suggestion}

		# check existence in case of an already existing repo
		if [ "$should_check_existence" = "YES" ]; then
			gitflow_local_branch_exists "$master_branch" || \
				die "Local branch '$master_branch' does not exist."
		fi

		# 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
	if gitflow_has_develop_configured && ! flag force; then
		develop_branch=$(git config --get gitflow.branch.develop)
	else
		# Again, the same two cases as with the master selection are
		# considered (fresh repo or repo that contains branches)
		local default_suggestion
		local should_check_existence
		branch_count=$(gitflow_local_branches | grep -v "^${master_branch}\$" | wc -l)
		if [ "$branch_count" -eq 0 ]; then
			should_check_existence=NO
			default_suggestion=develop
		else
			echo
			echo "Which branch should be used for integration of the \"next release\"?"
			gitflow_local_branches | grep -v "^${master_branch}\$" | sed 's/^.*$/   - &/g'

			should_check_existence=YES
			default_suggestion=
			for guess in 'develop' 'int' 'integration' 'master'; do
				if gitflow_local_branch_exists "$guess"; then
					default_suggestion="$guess"
					break
				fi
			done
		fi

		echo "Branch name for \"next release\" development: [$default_suggestion] \c"
		read answer
		develop_branch=${answer:-$default_suggestion}

		if [ "$master_branch" = "$develop_branch" ]; then
			die "Production and integration branches should differ."
		fi

		# check existence in case of an already existing repo
		if [ "$should_check_existence" = "YES" ]; then
			gitflow_local_branch_exists "$develop_branch" || \
				die "Local branch '$develop_branch' does not exist."
		fi

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

	# Creation of HEAD
	# ----------------
	# We create a HEAD now, if it does not exist yet (in a fresh repo). We need
	# it to be able to create new branches.
	local created_gitflow_branch=0
	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"
		created_gitflow_branch=1
	fi

	# Creation of master
	# ------------------
	# At this point, there always is a master branch: either it existed already
	# (and was picked interactively as the production branch) or it has just
	# been created in a fresh repo

	# Creation of develop
	# -------------------
	# The develop branch possibly does not exist yet.  This is the case when,
	# in a git init'ed repo with one or more commits, master was picked as the
	# default production branch and develop was "created".  We should create
	# the develop branch now in that case (we base it on master, of course)
	if ! gitflow_local_branch_exists "$develop_branch"; then
		git branch "$develop_branch" "$master_branch"
		created_gitflow_branch=1
	fi

	# assert the gitflow repo has been correctly initialized
	gitflow_is_initialized

	# switch to develop branch if its newly created
	if [ $created_gitflow_branch -eq 1 ]; then
		git checkout -q "$develop_branch"
	fi

	# finally, ask the user for naming conventions (branch and tag prefixes)
	echo
	echo "How to name your supporting branch prefixes?"

	local prefix

	# Feature branches
	if ! git config --get gitflow.prefix.feature >/dev/null 2>&1 || flag force; then
		default_suggestion=$(git config --get gitflow.prefix.feature || echo feature/)
		echo "Feature branches? [$default_suggestion] \c"
		read answer
		[ "$answer" = "-" ] && prefix= || prefix=${answer:-$default_suggestion}
		git config gitflow.prefix.feature "$prefix"
	fi

	# Release branches
	if ! git config --get gitflow.prefix.release >/dev/null 2>&1 || flag force; then
		default_suggestion=$(git config --get gitflow.prefix.release || echo release/)
		echo "Release branches? [$default_suggestion] \c"
		read answer
		[ "$answer" = "-" ] && prefix= || prefix=${answer:-$default_suggestion}
		git config gitflow.prefix.release "$prefix"
	fi


	# Hotfix branches
	if ! git config --get gitflow.prefix.hotfix >/dev/null 2>&1 || flag force; then
		default_suggestion=$(git config --get gitflow.prefix.hotfix || echo hotfix/)
		echo "Hotfix branches? [$default_suggestion] \c"
		read answer
		[ "$answer" = "-" ] && prefix= || prefix=${answer:-$default_suggestion}
		git config gitflow.prefix.hotfix "$prefix"
	fi


	# Support branches
	if ! git config --get gitflow.prefix.support >/dev/null 2>&1 || flag force; then
		default_suggestion=$(git config --get gitflow.prefix.support || echo support/)
		echo "Support branches? [$default_suggestion] \c"
		read answer
		[ "$answer" = "-" ] && prefix= || prefix=${answer:-$default_suggestion}
		git config gitflow.prefix.support "$prefix"
	fi


	# Version tag prefix
	if ! git config --get gitflow.prefix.versiontag >/dev/null 2>&1 || flag force; then
		default_suggestion=$(git config --get gitflow.prefix.versiontag || echo "")
		echo "Version tag prefix? [$default_suggestion] \c"
		read answer
		[ "$answer" = "-" ] && prefix= || prefix=${answer:-$default_suggestion}
		git config gitflow.prefix.versiontag "$prefix"
	fi


	# TODO: what to do with origin?
}

cmd_help() {
	usage
	exit 0
}
