#!/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 | chrome | google-chrome | chromium | 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 google-chrome chrome chromium 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 "$@" &
	;;
    google-chrome|chrome|chromium)
	# Actual command for chromium is chromium-browser.
	# No need to specify newTab. It's default in chromium
	eval "$browser_path" "$@" &
	;;
    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
