#!/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 | seamonkey | iceape | \
	chrome | google-chrome | chromium | chromium-browser |\
	konqueror | opera | w3m | elinks | links | lynx | dillo | open | start)
		;; # happy
	*)
		valid_custom_tool "$1" || return 1
		;;
	esac
}

init_browser_path() {
	browser_path=$(git config "browser.$1.path")
	if test -z "$browser_path" &&
	   test "$1" = chromium &&
	   type chromium-browser >/dev/null 2>&1
	then
		browser_path=chromium-browser
	fi
	: ${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 chromium-browser konqueror opera seamonkey iceape w3m elinks links lynx dillo"
		if test "$KDE_FULL_SESSION" = "true"; then
			browser_candidates="konqueror $browser_candidates"
		fi
	else
		browser_candidates="w3m elinks 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|seamonkey|iceape)
	# 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|chromium-browser)
	# No need to specify newTab. It's default in chromium
	"$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."
		"$browser_path" newTab "$@" &
		;;
	kfmclient)
		"$browser_path" newTab "$@" &
		;;
	*)
		"$browser_path" "$@" &
		;;
	esac
	;;
w3m|elinks|links|lynx|open)
	"$browser_path" "$@"
	;;
start)
	exec "$browser_path" '"web-browse"' "$@"
	;;
opera|dillo)
	"$browser_path" "$@" &
	;;
*)
	if test -n "$browser_cmd"; then
		( eval "$browser_cmd \"\$@\"" )
	fi
	;;
esac
