]>
Commit | Line | Data |
---|---|---|
1 | #!/bin/sh | |
2 | # | |
3 | # This program launch a web browser on the html page | |
4 | # describing a git command. | |
5 | # | |
6 | # Copyright (c) 2007 Christian Couder | |
7 | # Copyright (c) 2006 Theodore Y. Ts'o | |
8 | # | |
9 | # This file is heavily stolen from git-mergetool.sh, by | |
10 | # Theodore Y. Ts'o (thanks) that is: | |
11 | # | |
12 | # Copyright (c) 2006 Theodore Y. Ts'o | |
13 | # | |
14 | # This file is licensed under the GPL v2, or a later version | |
15 | # at the discretion of Junio C Hamano or any other official | |
16 | # git maintainer. | |
17 | # | |
18 | ||
19 | USAGE='[--browser=browser|--tool=browser] [--config=conf.var] url/file ...' | |
20 | ||
21 | # This must be capable of running outside of git directory, so | |
22 | # the vanilla git-sh-setup should not be used. | |
23 | NONGIT_OK=Yes | |
24 | . git-sh-setup | |
25 | ||
26 | valid_custom_tool() | |
27 | { | |
28 | browser_cmd="$(git config "browser.$1.cmd")" | |
29 | test -n "$browser_cmd" | |
30 | } | |
31 | ||
32 | valid_tool() { | |
33 | case "$1" in | |
34 | firefox | iceweasel | seamonkey | iceape | \ | |
35 | chrome | google-chrome | chromium | chromium-browser |\ | |
36 | konqueror | opera | w3m | elinks | links | lynx | dillo | open | start) | |
37 | ;; # happy | |
38 | *) | |
39 | valid_custom_tool "$1" || return 1 | |
40 | ;; | |
41 | esac | |
42 | } | |
43 | ||
44 | init_browser_path() { | |
45 | browser_path=$(git config "browser.$1.path") | |
46 | if test -z "$browser_path" && | |
47 | test "$1" = chromium && | |
48 | type chromium-browser >/dev/null 2>&1 | |
49 | then | |
50 | browser_path=chromium-browser | |
51 | fi | |
52 | : ${browser_path:="$1"} | |
53 | } | |
54 | ||
55 | while test $# != 0 | |
56 | do | |
57 | case "$1" in | |
58 | -b|--browser*|-t|--tool*) | |
59 | case "$#,$1" in | |
60 | *,*=*) | |
61 | browser=`expr "z$1" : 'z-[^=]*=\(.*\)'` | |
62 | ;; | |
63 | 1,*) | |
64 | usage ;; | |
65 | *) | |
66 | browser="$2" | |
67 | shift ;; | |
68 | esac | |
69 | ;; | |
70 | -c|--config*) | |
71 | case "$#,$1" in | |
72 | *,*=*) | |
73 | conf=`expr "z$1" : 'z-[^=]*=\(.*\)'` | |
74 | ;; | |
75 | 1,*) | |
76 | usage ;; | |
77 | *) | |
78 | conf="$2" | |
79 | shift ;; | |
80 | esac | |
81 | ;; | |
82 | --) | |
83 | break | |
84 | ;; | |
85 | -*) | |
86 | usage | |
87 | ;; | |
88 | *) | |
89 | break | |
90 | ;; | |
91 | esac | |
92 | shift | |
93 | done | |
94 | ||
95 | test $# = 0 && usage | |
96 | ||
97 | if test -z "$browser" | |
98 | then | |
99 | for opt in "$conf" "web.browser" | |
100 | do | |
101 | test -z "$opt" && continue | |
102 | browser="`git config $opt`" | |
103 | test -z "$browser" || break | |
104 | done | |
105 | if test -n "$browser" && ! valid_tool "$browser"; then | |
106 | echo >&2 "git config option $opt set to unknown browser: $browser" | |
107 | echo >&2 "Resetting to default..." | |
108 | unset browser | |
109 | fi | |
110 | fi | |
111 | ||
112 | if test -z "$browser" ; then | |
113 | if test -n "$DISPLAY"; then | |
114 | browser_candidates="firefox iceweasel google-chrome chrome chromium chromium-browser konqueror opera seamonkey iceape w3m elinks links lynx dillo" | |
115 | if test "$KDE_FULL_SESSION" = "true"; then | |
116 | browser_candidates="konqueror $browser_candidates" | |
117 | fi | |
118 | else | |
119 | browser_candidates="w3m elinks links lynx" | |
120 | fi | |
121 | # SECURITYSESSIONID indicates an OS X GUI login session | |
122 | if test -n "$SECURITYSESSIONID" \ | |
123 | -o "$TERM_PROGRAM" = "Apple_Terminal" ; then | |
124 | browser_candidates="open $browser_candidates" | |
125 | fi | |
126 | # /bin/start indicates MinGW | |
127 | if test -x /bin/start; then | |
128 | browser_candidates="start $browser_candidates" | |
129 | fi | |
130 | ||
131 | for i in $browser_candidates; do | |
132 | init_browser_path $i | |
133 | if type "$browser_path" > /dev/null 2>&1; then | |
134 | browser=$i | |
135 | break | |
136 | fi | |
137 | done | |
138 | test -z "$browser" && die "No known browser available." | |
139 | else | |
140 | valid_tool "$browser" || die "Unknown browser '$browser'." | |
141 | ||
142 | init_browser_path "$browser" | |
143 | ||
144 | if test -z "$browser_cmd" && ! type "$browser_path" > /dev/null 2>&1; then | |
145 | die "The browser $browser is not available as '$browser_path'." | |
146 | fi | |
147 | fi | |
148 | ||
149 | case "$browser" in | |
150 | firefox|iceweasel|seamonkey|iceape) | |
151 | # Check version because firefox < 2.0 does not support "-new-tab". | |
152 | vers=$(expr "$($browser_path -version)" : '.* \([0-9][0-9]*\)\..*') | |
153 | NEWTAB='-new-tab' | |
154 | test "$vers" -lt 2 && NEWTAB='' | |
155 | "$browser_path" $NEWTAB "$@" & | |
156 | ;; | |
157 | google-chrome|chrome|chromium|chromium-browser) | |
158 | # No need to specify newTab. It's default in chromium | |
159 | eval "$browser_path" "$@" & | |
160 | ;; | |
161 | konqueror) | |
162 | case "$(basename "$browser_path")" in | |
163 | konqueror) | |
164 | # It's simpler to use kfmclient to open a new tab in konqueror. | |
165 | browser_path="$(echo "$browser_path" | sed -e 's/konqueror$/kfmclient/')" | |
166 | type "$browser_path" > /dev/null 2>&1 || die "No '$browser_path' found." | |
167 | eval "$browser_path" newTab "$@" | |
168 | ;; | |
169 | kfmclient) | |
170 | eval "$browser_path" newTab "$@" | |
171 | ;; | |
172 | *) | |
173 | "$browser_path" "$@" & | |
174 | ;; | |
175 | esac | |
176 | ;; | |
177 | w3m|elinks|links|lynx|open) | |
178 | eval "$browser_path" "$@" | |
179 | ;; | |
180 | start) | |
181 | exec "$browser_path" '"web-browse"' "$@" | |
182 | ;; | |
183 | opera|dillo) | |
184 | "$browser_path" "$@" & | |
185 | ;; | |
186 | *) | |
187 | if test -n "$browser_cmd"; then | |
188 | ( eval $browser_cmd "$@" ) | |
189 | fi | |
190 | ;; | |
191 | esac |