#!/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/git-model
#
# Feel free to contribute to this project at:
#    http://github.com/nvie/gitflow
#
# Copyright 2010 Vincent Driessen. All rights reserved.
# 
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are met:
# 
#    1. Redistributions of source code must retain the above copyright notice,
#       this list of conditions and the following disclaimer.
# 
#    2. Redistributions in binary form must reproduce the above copyright
#       notice, this list of conditions and the following disclaimer in the
#       documentation and/or other materials provided with the distribution.
# 
# THIS SOFTWARE IS PROVIDED BY VINCENT DRIESSEN ``AS IS'' AND ANY EXPRESS OR
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
# EVENT SHALL VINCENT DRIESSEN OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
# INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
# OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
# NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
# EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
# 
# The views and conclusions contained in the software and documentation are
# those of the authors and should not be interpreted as representing official
# policies, either expressed or implied, of Vincent Driessen.
#

# set this to workaround expr problems in shFlags on freebsd
if uname -s | egrep -iq 'bsd'; then export EXPR_COMPAT=1; fi

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

# The sed expression here replaces all backslashes by forward slashes.
# This helps our Windows users, while not bothering our Unix users.
export GITFLOW_DIR=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")

usage() {
	echo "usage: git flow <subcommand>"
	echo
	echo "Available subcommands are:"
	echo "   init      Initialize a new git repo with support for the branching model."
	echo "   feature   Manage your feature branches."
	echo "   release   Manage your release branches."
	echo "   hotfix    Manage your hotfix branches."
	echo "   support   Manage your support branches."
	echo "   version   Shows version information."
	echo
	echo "Try 'git flow <subcommand> help' for details."
}

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

	# load common functionality
	. "$GITFLOW_DIR/gitflow-common"

	# This environmental variable fixes non-POSIX getopt style argument
	# parsing, effectively breaking git-flow subcommand parsing on several
	# Linux platforms.
	export POSIXLY_CORRECT=1

	# use the shFlags project to parse the command line arguments
	. "$GITFLOW_DIR/gitflow-shFlags"
	FLAGS_PARENT="git flow"
	FLAGS "$@" || exit $?
	eval set -- "${FLAGS_ARGV}"

	# sanity checks
	SUBCOMMAND="$1"; shift

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

	# run command
	. "$GITFLOW_DIR/git-flow-$SUBCOMMAND"
	FLAGS_PARENT="git flow $SUBCOMMAND"

	# test if the first argument is a flag (i.e. starts with '-')
	# in that case, we interpret this arg as a flag for the default
	# command
	SUBACTION="default"
	if [ "$1" != "" ] && { ! echo "$1" | grep -q "^-"; } then
		SUBACTION="$1"; shift
	fi
	if ! type "cmd_$SUBACTION" >/dev/null 2>&1; then
		warn "Unknown subcommand: '$SUBACTION'"
		usage
		exit 1
	fi

	# run the specified action
	cmd_$SUBACTION "$@"
}

main "$@"
