#!/bin/sh
#
# gitflow -- A collection of Git wrapper scripts 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)

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

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

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

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

	# sanity checks
	ACTION="$1"
	BTYPE="$2"
	shift 2

	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 ! declare -f cmd_$ACTION >/dev/null; then
		usage
		exit 1
	fi

	# run command
	cmd_$ACTION "$@"
}

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 "$@"
