#!/bin/sh
#
# 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
#

# enable debug mode
if [ "$DEBUG" = "yes" ]; then
	set -x
fi

export GITFLOW_DIR=$(dirname "$0")
export MASTER_BRANCH=$(git config --get gitflow.branch.master || echo master)
export DEVELOP_BRANCH=$(git config --get gitflow.branch.develop || echo develop)
export ORIGIN=$(git config --get gitflow.origin || echo origin)
export README=$(git config --get gitflow.readme || echo README)

warn() { echo "$@" >&2; }
die() { warn "$@"; exit 1; }

has() {
	local item=$1; shift
	echo " $@ " | grep -q " $item "
}

usage() {
	. "$GITFLOW_DIR/git-flow-version"
	echo "git-flow, version $GITFLOW_VERSION"
	echo
	echo "usage: git flow <cmd> <type> <args>"
	echo "       git flow init [<url>]"
	echo
	echo "<type> can be any of: feature, release, hotfix, support"
	echo
	echo "Try 'git flow help <type>' for details."
}

main() {
	if [ $# -lt 1 ]; then
		usage
		exit 1
	fi

	# sanity checks
	ACTION="$1"; shift

	if [ "$ACTION" = "init" ]; then
		gitflow_init "$@"
		exit 0
	fi

	BTYPE="$1"; shift

	if [ ! -e "$GITFLOW_DIR/git-flow-$BTYPE" ]; then
		usage
		exit 1
	fi

	if ! git rev-parse --git-dir >/dev/null; then
		die "Not a git repository"
	fi

	# get all available branches
	LOCAL_BRANCHES=$(git branch | sed 's/^[* ] //')
	REMOTE_BRANCHES=$(git branch -r | sed 's/^[* ] //')
	ALL_BRANCHES="$LOCAL_BRANCHES $REMOTE_BRANCHES"

	# run command
	. "$GITFLOW_DIR/git-flow-$BTYPE"

	if ! typeset -f cmd_$ACTION >/dev/null; then
		usage
		exit 1
	fi

	# run command
	cmd_$ACTION "$@"
}

gitflow_init() {
	echo
	echo "Summary of actions:"

	if ! git rev-parse --git-dir 2>&1 >/dev/null; then
		git init --quiet
		echo "- A new git repository at $PWD was created"
	fi

	if ! git rev-parse --quiet --verify HEAD 2>&1 >/dev/null; then
		touch $README
		git add $README
		git commit --quiet -m "initial commit"
		if [ "$MASTER_BRANCH" != "master" ]; then
			git branch -m master $MASTER_BRANCH
		fi
		echo "- An initial commit was created at branch '$MASTER_BRANCH'"
	fi

	if ! git rev-parse --verify $MASTER_BRANCH 2>&1 >/dev/null; then
		die "Cannot find your master branch. Try: git branch -m <mymaster> $MASTER_BRANCH"
	fi

	gitflow_check_clean_working_tree

	if git remote | grep -q $ORIGIN; then
		git fetch -q $ORIGIN
		gitflow_require_branches_equal $MASTER_BRANCH $ORIGIN/$MASTER_BRANCH
	fi

	if git rev-parse --verify $DEVELOP_BRANCH 2>&1 >/dev/null; then
		gitflow_require_branches_equal $DEVELOP_BRANCH $ORIGIN/$DEVELOP_BRANCH
	else
		git checkout -q -b $DEVELOP_BRANCH $MASTER_BRANCH
		echo "- A new branch '$DEVELOP_BRANCH' was created"
		echo "- You are now on branch '$DEVELOP_BRANCH'"
	fi

	if ! git remote | grep -q $ORIGIN; then
		if [ "$1" = "" ]; then
			echo "- No remote location was added. Try: git remote add $ORIGIN <url>"
		else
			git remote add $ORIGIN $1
			echo "- A new remote location '$1' was added"
		fi
	fi

	echo

	if git remote | grep -q $ORIGIN; then
		git push $ORIGIN $MASTER_BRANCH $DEVELOP_BRANCH
	fi
}

gitflow_check_clean_working_tree() {
	if ! git diff --no-ext-diff --ignore-submodules --quiet --exit-code; then
		die "Working tree contains unstaged changes. Aborting ..."
	fi
	if ! git diff-index --cached --quiet --ignore-submodules HEAD --; then
		die "Index contains uncommited changes. Aborting ..."
	fi
}

gitflow_require_local_branch() {
	if ! has $1 $LOCAL_BRANCHES; then
		die "Local branch '$1' does not exist and is required."
	fi
}

gitflow_require_remote_branch() {
	if ! has $1 $REMOTE_BRANCHES; then
		die "Remote branch '$1' does not exist and is required."
	fi
}

gitflow_require_branch() {
	if ! has $1 $ALL_BRANCHES; then
		die "Branch '$1' does not exist and is required."
	fi
}

gitflow_require_branch_absent() {
	if has $1 $ALL_BRANCHES; then
		die "Branch '$1' already exists. Pick another name."
	fi
}

#
# gitflow_test_branches_equal()
#
# Tests whether branches and their "origin" counterparts have diverged and need
# merging first. It returns error codes to provide more detail, like so:
#
# 0    Branch heads point to the same commit
# 1    First given branch needs fast-forwarding
# 2    Second given branch needs fast-forwarding
# 3    Branch needs a real merge
#
gitflow_test_branches_equal() {
	commit1=$(git rev-parse "$1")
	commit2=$(git rev-parse "$2")
	if [ "$commit1" != "$commit2" ]; then
		base=$(git merge-base "$commit1" "$commit2")
		if [ "$commit1" = "$base" ]; then
			return 1
		elif [ "$commit2" = "$base" ]; then
			return 2
		else
			return 3
		fi
	else
		return 0
	fi
}

gitflow_require_branches_equal() {
	gitflow_require_local_branch "$1"
	gitflow_require_remote_branch "$2"
	gitflow_test_branches_equal "$1" "$2"
	status=$?
	if [ $status -gt 0 ]; then
		warn "Branches '$1' and '$2' have diverged."
		if [ $status -eq 1 ]; then
			die "And branch '$1' may be fast-forwarded."
		elif [ $status -eq 2 ]; then
			# Warn here, since there is no harm in being ahead
			warn "And local branch '$1' is ahead of '$2'."
		else
			die "Branches need merging first."
		fi
	fi
}

main "$@"
