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

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

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

# basic math
min() { [ "$1" -le "$2" ] && echo "$1" || echo "$2"; }
max() { [ "$1" -ge "$2" ] && echo "$1" || echo "$2"; }

# basic string matching
startswith() { [ "$1" != "${1#$2}" ]; }
endswith() { [ "$1" != "${1#$2}" ]; }

# convenience functions for checking shFlags flags
flag() { local FLAG; eval FLAG='$FLAGS_'$1; [ $FLAG -eq $FLAGS_TRUE ]; }
noflag() { local FLAG; eval FLAG='$FLAGS_'$1; [ $FLAG -ne $FLAGS_TRUE ]; }

#
# Git specific common functionality
#

# get all available branches
gitflow_local_branches() { git branch | sed 's/^[* ] //'; }
gitflow_remote_branches() { git branch -r | sed 's/^[* ] //'; }
gitflow_all_branches() { git branch -a | sed 's/^[* ] //'; }
gitflow_all_tags() { git tag; }

# loading settings that can be overridden using git config
gitflow_load_settings() {
	export GIT_DIR=$(git rev-parse --git-dir >/dev/null 2>&1)
	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)
}

#
# resolve_nameprefix
#
# Inputs:
# $1 = name prefix to resolve
# $2 = branch prefix to use
#
# Searches branch names from gitflow_local_branches() to look for a unique
# branch name whose name starts with the given name prefix.
#
# There are multiple exit codes possible:
# 0: The unambiguous full name of the branch is written to stdout
#    (success)
# 1: No match is found.
# 2: Multiple matches found. These matches are written to stderr
#
resolve_nameprefix() {
	local name=$1
	local prefix=$2
	local matches
	local num_matches

	# first, check if there is a perfect match
	if has "$(gitflow_local_branches)" "$prefix$name"; then
		echo "$name"
		return 0
	fi

	matches=$(echo "$(gitflow_local_branches)" | grep "^$prefix$name")
	num_matches=$(echo "$matches" | wc -l)
	if [ -z "$matches" ]; then
		# no prefix match, so take it literally
		warn "No branch matches prefix '$name'"
		return 1
	else
		if [ $num_matches -eq 1 ]; then
			echo "${matches#$prefix}"
			return 0
		else
			# multiple matches, cannot decide
			warn "Multiple branches match prefix '$name':"
			for match in $matches; do
				warn "- $match"
			done
			return 2
		fi
	fi
}

gitflow_current_branch() {
	git branch | grep '^\* ' | grep -v 'no branch' | sed 's/^* //g'
}

gitflow_test_clean_working_tree() {
	if ! git diff --no-ext-diff --ignore-submodules --quiet --exit-code; then
		return 1
	elif ! git diff-index --cached --quiet --ignore-submodules HEAD --; then
		return 2
	else
		return 0
	fi
}

gitflow_require_git_repo() {
	if ! git rev-parse --git-dir >/dev/null 2>&1; then
		die "Not a git repository"
	fi
}

gitflow_require_clean_working_tree() {
	gitflow_test_clean_working_tree
	local result=$?
	if [ $result -eq 1 ]; then
		die "fatal: Working tree contains unstaged changes. Aborting."
	fi
	if [ $result -eq 2 ]; then
		die "fatal: Index contains uncommited changes. Aborting."
	fi
}

gitflow_branch_exists() {
	has $1 $(gitflow_all_branches)
}

gitflow_tag_exists() {
	has $1 $(gitflow_all_tags)
}

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

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

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

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

gitflow_require_tag_absent() {
	if has $1 $(gitflow_all_tags); then
		die "Tag '$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
# 4    There is no merge base, i.e. the branches have no common ancestors
#
gitflow_test_branches_equal() {
	local commit1=$(git rev-parse "$1")
	local commit2=$(git rev-parse "$2")
	if [ "$commit1" != "$commit2" ]; then
		local base=$(git merge-base "$commit1" "$commit2")
		if [ $? -ne 0 ]; then
			return 4
		elif [ "$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"
	local 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
}

#
# gitflow_is_branch_merged_into()
#
# Checks whether branch $1 is succesfully merged into $2
#
gitflow_is_branch_merged_into() {
	local subject=$1
	local base=$2
	local all_merges=$(git branch --contains $subject | sed 's/^[* ] //')
	has $base $all_merges
}
