git-web--browse.sh 4.27 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
#!/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.
#

19
USAGE='[--browser=browser|--tool=browser] [--config=conf.var] url/file ...'
20 21 22 23

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

26 27 28 29 30 31
valid_custom_tool()
{
	browser_cmd="$(git config "browser.$1.cmd")"
	test -n "$browser_cmd"
}

32 33
valid_tool() {
	case "$1" in
34
	firefox | iceweasel | seamonkey | iceape | \
35 36 37
	chrome | google-chrome | chromium | chromium-browser | \
	konqueror | opera | w3m | elinks | links | lynx | dillo | open | \
	start | cygstart)
38 39 40 41
		;; # happy
	*)
		valid_custom_tool "$1" || return 1
		;;
42 43 44 45
	esac
}

init_browser_path() {
46
	browser_path=$(git config "browser.$1.path")
47 48 49 50 51 52 53
	if test -z "$browser_path" &&
	   test "$1" = chromium &&
	   type chromium-browser >/dev/null 2>&1
	then
		browser_path=chromium-browser
	fi
	: ${browser_path:="$1"}
54 55 56 57
}

while test $# != 0
do
58
	case "$1" in
59
	-b|--browser*|-t|--tool*)
60
		case "$#,$1" in
61
		*,*=*)
62 63
			browser=`expr "z$1" : 'z-[^=]*=\(.*\)'`
			;;
64
		1,*)
65
			usage ;;
66
		*)
67 68 69 70
			browser="$2"
			shift ;;
		esac
		;;
71
	-c|--config*)
72
		case "$#,$1" in
73
		*,*=*)
74 75
			conf=`expr "z$1" : 'z-[^=]*=\(.*\)'`
			;;
76
		1,*)
77
			usage ;;
78
		*)
79 80 81 82
			conf="$2"
			shift ;;
		esac
		;;
83
	--)
84 85
		break
		;;
86
	-*)
87 88
		usage
		;;
89
	*)
90 91 92 93
		break
		;;
	esac
	shift
94 95
done

96 97
test $# = 0 && usage

98
if test -z "$browser"
99
then
100 101 102 103 104 105 106 107 108 109 110
	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
111 112 113
fi

if test -z "$browser" ; then
114
	if test -n "$DISPLAY"; then
115
		browser_candidates="firefox iceweasel google-chrome chrome chromium chromium-browser konqueror opera seamonkey iceape w3m elinks links lynx dillo"
116 117 118 119
		if test "$KDE_FULL_SESSION" = "true"; then
			browser_candidates="konqueror $browser_candidates"
		fi
	else
120
		browser_candidates="w3m elinks links lynx"
121
	fi
122
	# SECURITYSESSIONID indicates an OS X GUI login session
123 124
	if test -n "$SECURITYSESSIONID" || test -n "$TERM_PROGRAM"
	then
125
		browser_candidates="open $browser_candidates"
126
	fi
127 128 129 130
	# /bin/start indicates MinGW
	if test -x /bin/start; then
		browser_candidates="start $browser_candidates"
	fi
131 132 133 134
	# /usr/bin/cygstart indicates Cygwin
	if test -x /usr/bin/cygstart; then
		browser_candidates="cygstart $browser_candidates"
	fi
135 136 137 138 139 140 141 142 143

	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."
144
else
145
	valid_tool "$browser" || die "Unknown browser '$browser'."
146

147
	init_browser_path "$browser"
148

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

case "$browser" in
155
firefox|iceweasel|seamonkey|iceape)
156 157 158 159
	# 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=''
160
	"$browser_path" $NEWTAB "$@" &
161
	;;
162
google-chrome|chrome|chromium|chromium-browser)
163
	# No need to specify newTab. It's default in chromium
164
	"$browser_path" "$@" &
165
	;;
166
konqueror)
167
	case "$(basename "$browser_path")" in
168
	konqueror)
169 170 171
		# 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."
172
		"$browser_path" newTab "$@" &
173
		;;
174
	kfmclient)
175
		"$browser_path" newTab "$@" &
176
		;;
177
	*)
178
		"$browser_path" "$@" &
179 180 181
		;;
	esac
	;;
182
w3m|elinks|links|lynx|open|cygstart)
183
	"$browser_path" "$@"
184
	;;
185 186 187
start)
	exec "$browser_path" '"web-browse"' "$@"
	;;
188
opera|dillo)
189
	"$browser_path" "$@" &
190
	;;
191
*)
192
	if test -n "$browser_cmd"; then
193
		( eval "$browser_cmd \"\$@\"" )
194 195
	fi
	;;
196
esac