#!/usr/bin/env bash
#
# HubFlow - a fork of the git-flow tools to apply Vincent Driessen's
# branching model to working with GitHub
#
# Original blog post presenting this model is found at:
#    http://nvie.com/git-model
#
# The HubFlow documentation is found at:
#    http://datasift.github.com/gitflow/
#
# Feel free to contribute to this project at:
#    http://github.com/datasift/gitflow
#
# Copyright 2010 Vincent Driessen. All rights reserved.
# Copyright 2012 MediaSift Ltd. 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 HUBFLOW_DIR=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")

usage() {
	echo "usage: git hf <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 "   push      Push the changes from your current branch (plus any new tags) back upstream."
	echo "   pull      Pull upstream changes down into your master, develop, and current branches."
	echo "   update    Pull upstream changes down into your master and develop branches."
	echo "   version   Shows version information."
	echo
	echo "Try 'git hf <subcommand> help' for details."
}

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

	# load common functionality
	. "$HUBFLOW_DIR/hubflow-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
	. "$HUBFLOW_DIR/hubflow-shFlags"
	FLAGS_PARENT="git hf"
	FLAGS "$@" || exit $?
	eval set -- "${FLAGS_ARGV}"

	# sanity checks
	SUBCOMMAND="$1"; shift

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

	# run command
	. "$HUBFLOW_DIR/git-hf-$SUBCOMMAND"
	FLAGS_PARENT="git hf $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 "$@"
