#!/bin/sh
#
# This program launch a web browser on the html page
# describing a git command.
#
# Copyright (c) 2007 Christian Couder
# Copyright (c) 2006 Theodore Y. Ts'o
#
# This file is heavily stolen from git-mergetool.sh, by
# Theodore Y. Ts'o (thanks) that is:
#
# Copyright (c) 2006 Theodore Y. Ts'o
#
# This file is licensed under the GPL v2, or a later version
# at the discretion of Junio C Hamano or any other official
# git maintainer.
#

USAGE='[--browser=browser|--tool=browser] [--config=conf.var] url/file ...'

# This must be capable of running outside of git directory, so
# the vanilla git-sh-setup should not be used.
NONGIT_OK=Yes
. git-sh-setup

valid_custom_tool()
{
	browser_cmd="$(git config "browser.$1.cmd")"
	test -n "$browser_cmd"
}

valid_tool() {
	case "$1" in
		firefox | iceweasel | konqueror | w3m | links | lynx | dillo | open | start)
			;; # happy
		*)
			valid_custom_tool "$1" || return 1
			;;
	esac
}

init_browser_path() {
	browser_path=$(git config "browser.$1.path")
	test -z "$browser_path" && browser_path="$1"
}

while test $# != 0
do
    case "$1" in
	-b|--browser*|-t|--tool*)
	    case "$#,$1" in
		*,*=*)
		    browser=`expr "z$1" : 'z-[^=]*=\(.*\)'`
		    ;;
		1,*)
		    usage ;;
		*)
		    browser="$2"
		    shift ;;
	    esac
	    ;;
	-c|--config*)
	    case "$#,$1" in
		*,*=*)
		    conf=`expr "z$1" : 'z-[^=]*=\(.*\)'`
		    ;;
		1,*)
		    usage ;;
		*)
		    conf="$2"
		    shift ;;
	    esac
	    ;;
	--)
	    break
	    ;;
	-*)
	    usage
	    ;;
	*)
	    break
	    ;;
    esac
    shift
done

test $# = 0 && usage

if test -z "$browser"
then
    for opt in "$conf" "web.browser"
    do
	test -z "$opt" && continue
	browser="`git config $opt`"
	test -z "$browser" || break
    done
    if test -n "$browser" && ! valid_tool "$browser"; then
	echo >&2 "git config option $opt set to unknown browser: $browser"
	echo >&2 "Resetting to default..."
	unset browser
    fi
fi

if test -z "$browser" ; then
    if test -n "$DISPLAY"; then
	browser_candidates="firefox iceweasel konqueror w3m links lynx dillo"
	if test "$KDE_FULL_SESSION" = "true"; then
	    browser_candidates="konqueror $browser_candidates"
	fi
    else
	browser_candidates="w3m links lynx"
    fi
    # SECURITYSESSIONID indicates an OS X GUI login session
    if test -n "$SECURITYSESSIONID" \
	    -o "$TERM_PROGRAM" = "Apple_Terminal" ; then
	browser_candidates="open $browser_candidates"
    fi
    # /bin/start indicates MinGW
    if test -x /bin/start; then
	browser_candidates="start $browser_candidates"
    fi

    for i in $browser_candidates; do
	init_browser_path $i
	if type "$browser_path" > /dev/null 2>&1; then
	    browser=$i
	    break
	fi
    done
    test -z "$browser" && die "No known browser available."
else
    valid_tool "$browser" || die "Unknown browser '$browser'."

    init_browser_path "$browser"

    if test -z "$browser_cmd" && ! type "$browser_path" > /dev/null 2>&1; then
	die "The browser $browser is not available as '$browser_path'."
    fi
fi

case "$browser" in
    firefox|iceweasel)
	# Check version because firefox < 2.0 does not support "-new-tab".
	vers=$(expr "$($browser_path -version)" : '.* \([0-9][0-9]*\)\..*')
	NEWTAB='-new-tab'
	test "$vers" -lt 2 && NEWTAB=''
	"$browser_path" $NEWTAB "$@" &
	;;
    konqueror)
	case "$(basename "$browser_path")" in
	    konqueror)
		# It's simpler to use kfmclient to open a new tab in konqueror.
		browser_path="$(echo "$browser_path" | sed -e 's/konqueror$/kfmclient/')"
		type "$browser_path" > /dev/null 2>&1 || die "No '$browser_path' found."
		eval "$browser_path" newTab "$@"
		;;
	    kfmclient)
		eval "$browser_path" newTab "$@"
		;;
	    *)
		"$browser_path" "$@" &
		;;
	esac
	;;
    w3m|links|lynx|open)
	eval "$browser_path" "$@"
	;;
    start)
        exec "$browser_path" '"web-browse"' "$@"
        ;;
    dillo)
	"$browser_path" "$@" &
	;;
    *)
	if test -n "$browser_cmd"; then
	    ( eval $browser_cmd "$@" )
	fi
	;;
esac
