2006-07-02 06:14:14 +08:00
|
|
|
#!/bin/sh
|
|
|
|
#
|
|
|
|
# Copyright (c) 2006 Eric Wong
|
|
|
|
#
|
2007-11-04 18:30:59 +08:00
|
|
|
|
2007-12-19 20:25:27 +08:00
|
|
|
PERL='@@PERL@@'
|
2007-11-04 18:30:59 +08:00
|
|
|
OPTIONS_KEEPDASHDASH=
|
|
|
|
OPTIONS_SPEC="\
|
2008-07-13 21:36:15 +08:00
|
|
|
git instaweb [options] (--start | --stop | --restart)
|
2007-11-04 18:30:59 +08:00
|
|
|
--
|
|
|
|
l,local only bind on 127.0.0.1
|
|
|
|
p,port= the port to bind to
|
|
|
|
d,httpd= the command to launch
|
|
|
|
b,browser= the browser to launch
|
|
|
|
m,module-path= the module path (only needed for apache2)
|
|
|
|
Action
|
|
|
|
stop stop the web server
|
|
|
|
start start the web server
|
|
|
|
restart restart the web server
|
|
|
|
"
|
2006-07-02 06:14:14 +08:00
|
|
|
|
|
|
|
. git-sh-setup
|
|
|
|
|
2007-08-11 21:36:28 +08:00
|
|
|
fqgitdir="$GIT_DIR"
|
2008-06-13 05:54:55 +08:00
|
|
|
local="$(git config --bool --get instaweb.local)"
|
|
|
|
httpd="$(git config --get instaweb.httpd)"
|
|
|
|
port=$(git config --get instaweb.port)
|
|
|
|
module_path="$(git config --get instaweb.modulepath)"
|
2006-07-02 06:14:14 +08:00
|
|
|
|
2007-11-09 07:21:42 +08:00
|
|
|
conf="$GIT_DIR/gitweb/httpd.conf"
|
2006-07-02 06:14:14 +08:00
|
|
|
|
|
|
|
# Defaults:
|
|
|
|
|
2006-07-10 13:50:18 +08:00
|
|
|
# if installed, it doesn't need further configuration (module_path)
|
2006-07-02 06:14:14 +08:00
|
|
|
test -z "$httpd" && httpd='lighttpd -f'
|
|
|
|
|
|
|
|
# any untaken local port will do...
|
|
|
|
test -z "$port" && port=1234
|
|
|
|
|
2008-06-13 05:54:55 +08:00
|
|
|
resolve_full_httpd () {
|
|
|
|
case "$httpd" in
|
|
|
|
*apache2*|*lighttpd*)
|
|
|
|
# ensure that the apache2/lighttpd command ends with "-f"
|
2009-11-24 07:56:32 +08:00
|
|
|
if ! echo "$httpd" | sane_grep -- '-f *$' >/dev/null 2>&1
|
2008-06-13 05:54:55 +08:00
|
|
|
then
|
|
|
|
httpd="$httpd -f"
|
|
|
|
fi
|
|
|
|
;;
|
|
|
|
esac
|
|
|
|
|
|
|
|
httpd_only="$(echo $httpd | cut -f1 -d' ')"
|
2009-03-10 02:31:55 +08:00
|
|
|
if case "$httpd_only" in /*) : ;; *) which $httpd_only >/dev/null 2>&1;; esac
|
2006-07-02 06:14:14 +08:00
|
|
|
then
|
2008-06-13 05:54:55 +08:00
|
|
|
full_httpd=$httpd
|
2006-07-02 06:14:14 +08:00
|
|
|
else
|
|
|
|
# many httpds are installed in /usr/sbin or /usr/local/sbin
|
|
|
|
# these days and those are not in most users $PATHs
|
2007-10-07 01:29:48 +08:00
|
|
|
# in addition, we may have generated a server script
|
|
|
|
# in $fqgitdir/gitweb.
|
|
|
|
for i in /usr/local/sbin /usr/sbin "$fqgitdir/gitweb"
|
2006-07-02 06:14:14 +08:00
|
|
|
do
|
|
|
|
if test -x "$i/$httpd_only"
|
|
|
|
then
|
2008-06-13 05:54:55 +08:00
|
|
|
full_httpd=$i/$httpd
|
2006-07-02 06:14:14 +08:00
|
|
|
return
|
|
|
|
fi
|
|
|
|
done
|
2008-06-13 05:54:55 +08:00
|
|
|
|
|
|
|
echo >&2 "$httpd_only not found. Install $httpd_only or use" \
|
|
|
|
"--httpd to specify another httpd daemon."
|
2007-01-06 18:40:06 +08:00
|
|
|
exit 1
|
2006-07-02 06:14:14 +08:00
|
|
|
fi
|
2008-06-13 05:54:55 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
start_httpd () {
|
2009-11-23 15:09:12 +08:00
|
|
|
if test -f "$fqgitdir/pid"; then
|
|
|
|
say "Instance already running. Restarting..."
|
|
|
|
stop_httpd
|
|
|
|
fi
|
|
|
|
|
2008-06-13 05:54:55 +08:00
|
|
|
# here $httpd should have a meaningful value
|
|
|
|
resolve_full_httpd
|
|
|
|
|
|
|
|
# don't quote $full_httpd, there can be arguments to it (-f)
|
2009-08-21 22:24:48 +08:00
|
|
|
case "$httpd" in
|
|
|
|
*mongoose*)
|
|
|
|
#The mongoose server doesn't have a daemon mode so we'll have to fork it
|
|
|
|
$full_httpd "$fqgitdir/gitweb/httpd.conf" &
|
|
|
|
#Save the pid before doing anything else (we'll print it later)
|
|
|
|
pid=$!
|
|
|
|
|
|
|
|
if test $? != 0; then
|
|
|
|
echo "Could not execute http daemon $httpd."
|
|
|
|
exit 1
|
|
|
|
fi
|
|
|
|
|
|
|
|
cat > "$fqgitdir/pid" <<EOF
|
|
|
|
$pid
|
|
|
|
EOF
|
|
|
|
;;
|
|
|
|
*)
|
|
|
|
$full_httpd "$fqgitdir/gitweb/httpd.conf"
|
|
|
|
if test $? != 0; then
|
|
|
|
echo "Could not execute http daemon $httpd."
|
|
|
|
exit 1
|
|
|
|
fi
|
|
|
|
;;
|
|
|
|
esac
|
2006-07-02 06:14:14 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
stop_httpd () {
|
2008-06-13 05:54:55 +08:00
|
|
|
test -f "$fqgitdir/pid" && kill $(cat "$fqgitdir/pid")
|
2006-07-02 06:14:14 +08:00
|
|
|
}
|
|
|
|
|
2007-09-24 04:42:08 +08:00
|
|
|
while test $# != 0
|
2006-07-02 06:14:14 +08:00
|
|
|
do
|
|
|
|
case "$1" in
|
|
|
|
--stop|stop)
|
|
|
|
stop_httpd
|
|
|
|
exit 0
|
|
|
|
;;
|
|
|
|
--start|start)
|
|
|
|
start_httpd
|
|
|
|
exit 0
|
|
|
|
;;
|
|
|
|
--restart|restart)
|
|
|
|
stop_httpd
|
|
|
|
start_httpd
|
|
|
|
exit 0
|
|
|
|
;;
|
2007-11-04 18:30:59 +08:00
|
|
|
-l|--local)
|
2006-07-02 06:14:14 +08:00
|
|
|
local=true
|
|
|
|
;;
|
2007-11-04 18:30:59 +08:00
|
|
|
-d|--httpd)
|
|
|
|
shift
|
|
|
|
httpd="$1"
|
|
|
|
;;
|
|
|
|
-b|--browser)
|
|
|
|
shift
|
|
|
|
browser="$1"
|
2006-07-02 06:14:14 +08:00
|
|
|
;;
|
2007-11-04 18:30:59 +08:00
|
|
|
-p|--port)
|
|
|
|
shift
|
|
|
|
port="$1"
|
2006-07-02 06:14:14 +08:00
|
|
|
;;
|
2007-11-04 18:30:59 +08:00
|
|
|
-m|--module-path)
|
|
|
|
shift
|
|
|
|
module_path="$1"
|
2006-07-02 06:14:14 +08:00
|
|
|
;;
|
2007-11-04 18:30:59 +08:00
|
|
|
--)
|
2006-07-02 06:14:14 +08:00
|
|
|
;;
|
|
|
|
*)
|
|
|
|
usage
|
|
|
|
;;
|
|
|
|
esac
|
|
|
|
shift
|
|
|
|
done
|
|
|
|
|
|
|
|
mkdir -p "$GIT_DIR/gitweb/tmp"
|
2008-06-13 05:54:55 +08:00
|
|
|
GIT_EXEC_PATH="$(git --exec-path)"
|
2006-07-02 06:14:14 +08:00
|
|
|
GIT_DIR="$fqgitdir"
|
|
|
|
export GIT_EXEC_PATH GIT_DIR
|
|
|
|
|
|
|
|
|
2007-10-07 01:29:49 +08:00
|
|
|
webrick_conf () {
|
|
|
|
# generate a standalone server script in $fqgitdir/gitweb.
|
|
|
|
cat >"$fqgitdir/gitweb/$httpd.rb" <<EOF
|
|
|
|
require 'webrick'
|
|
|
|
require 'yaml'
|
|
|
|
options = YAML::load_file(ARGV[0])
|
|
|
|
options[:StartCallback] = proc do
|
|
|
|
File.open(options[:PidFile],"w") do |f|
|
|
|
|
f.puts Process.pid
|
|
|
|
end
|
|
|
|
end
|
|
|
|
options[:ServerType] = WEBrick::Daemon
|
|
|
|
server = WEBrick::HTTPServer.new(options)
|
|
|
|
['INT', 'TERM'].each do |signal|
|
|
|
|
trap(signal) {server.shutdown}
|
|
|
|
end
|
|
|
|
server.start
|
|
|
|
EOF
|
|
|
|
# generate a shell script to invoke the above ruby script,
|
|
|
|
# which assumes _ruby_ is in the user's $PATH. that's _one_
|
|
|
|
# portable way to run ruby, which could be installed anywhere,
|
|
|
|
# really.
|
|
|
|
cat >"$fqgitdir/gitweb/$httpd" <<EOF
|
|
|
|
#!/bin/sh
|
|
|
|
exec ruby "$fqgitdir/gitweb/$httpd.rb" \$*
|
|
|
|
EOF
|
|
|
|
chmod +x "$fqgitdir/gitweb/$httpd"
|
|
|
|
|
|
|
|
cat >"$conf" <<EOF
|
|
|
|
:Port: $port
|
|
|
|
:DocumentRoot: "$fqgitdir/gitweb"
|
|
|
|
:DirectoryIndex: ["gitweb.cgi"]
|
|
|
|
:PidFile: "$fqgitdir/pid"
|
|
|
|
EOF
|
|
|
|
test "$local" = true && echo ':BindAddress: "127.0.0.1"' >> "$conf"
|
|
|
|
}
|
|
|
|
|
2006-07-02 06:14:14 +08:00
|
|
|
lighttpd_conf () {
|
|
|
|
cat > "$conf" <<EOF
|
|
|
|
server.document-root = "$fqgitdir/gitweb"
|
|
|
|
server.port = $port
|
2009-03-10 02:31:55 +08:00
|
|
|
server.modules = ( "mod_setenv", "mod_cgi" )
|
2006-07-02 06:14:14 +08:00
|
|
|
server.indexfiles = ( "gitweb.cgi" )
|
|
|
|
server.pid-file = "$fqgitdir/pid"
|
2009-03-10 02:31:55 +08:00
|
|
|
server.errorlog = "$fqgitdir/gitweb/error.log"
|
|
|
|
|
|
|
|
# to enable, add "mod_access", "mod_accesslog" to server.modules
|
|
|
|
# variable above and uncomment this
|
|
|
|
#accesslog.filename = "$fqgitdir/gitweb/access.log"
|
|
|
|
|
|
|
|
setenv.add-environment = ( "PATH" => "/usr/local/bin:/usr/bin:/bin" )
|
|
|
|
|
2006-07-02 06:14:14 +08:00
|
|
|
cgi.assign = ( ".cgi" => "" )
|
2009-03-10 02:31:55 +08:00
|
|
|
|
|
|
|
# mimetype mapping
|
|
|
|
mimetype.assign = (
|
|
|
|
".pdf" => "application/pdf",
|
|
|
|
".sig" => "application/pgp-signature",
|
|
|
|
".spl" => "application/futuresplash",
|
|
|
|
".class" => "application/octet-stream",
|
|
|
|
".ps" => "application/postscript",
|
|
|
|
".torrent" => "application/x-bittorrent",
|
|
|
|
".dvi" => "application/x-dvi",
|
|
|
|
".gz" => "application/x-gzip",
|
|
|
|
".pac" => "application/x-ns-proxy-autoconfig",
|
|
|
|
".swf" => "application/x-shockwave-flash",
|
|
|
|
".tar.gz" => "application/x-tgz",
|
|
|
|
".tgz" => "application/x-tgz",
|
|
|
|
".tar" => "application/x-tar",
|
|
|
|
".zip" => "application/zip",
|
|
|
|
".mp3" => "audio/mpeg",
|
|
|
|
".m3u" => "audio/x-mpegurl",
|
|
|
|
".wma" => "audio/x-ms-wma",
|
|
|
|
".wax" => "audio/x-ms-wax",
|
|
|
|
".ogg" => "application/ogg",
|
|
|
|
".wav" => "audio/x-wav",
|
|
|
|
".gif" => "image/gif",
|
|
|
|
".jpg" => "image/jpeg",
|
|
|
|
".jpeg" => "image/jpeg",
|
|
|
|
".png" => "image/png",
|
|
|
|
".xbm" => "image/x-xbitmap",
|
|
|
|
".xpm" => "image/x-xpixmap",
|
|
|
|
".xwd" => "image/x-xwindowdump",
|
|
|
|
".css" => "text/css",
|
|
|
|
".html" => "text/html",
|
|
|
|
".htm" => "text/html",
|
|
|
|
".js" => "text/javascript",
|
|
|
|
".asc" => "text/plain",
|
|
|
|
".c" => "text/plain",
|
|
|
|
".cpp" => "text/plain",
|
|
|
|
".log" => "text/plain",
|
|
|
|
".conf" => "text/plain",
|
|
|
|
".text" => "text/plain",
|
|
|
|
".txt" => "text/plain",
|
|
|
|
".dtd" => "text/xml",
|
|
|
|
".xml" => "text/xml",
|
|
|
|
".mpeg" => "video/mpeg",
|
|
|
|
".mpg" => "video/mpeg",
|
|
|
|
".mov" => "video/quicktime",
|
|
|
|
".qt" => "video/quicktime",
|
|
|
|
".avi" => "video/x-msvideo",
|
|
|
|
".asf" => "video/x-ms-asf",
|
|
|
|
".asx" => "video/x-ms-asf",
|
|
|
|
".wmv" => "video/x-ms-wmv",
|
|
|
|
".bz2" => "application/x-bzip",
|
|
|
|
".tbz" => "application/x-bzip-compressed-tar",
|
|
|
|
".tar.bz2" => "application/x-bzip-compressed-tar",
|
|
|
|
"" => "text/plain"
|
|
|
|
)
|
2006-07-02 06:14:14 +08:00
|
|
|
EOF
|
2007-11-09 07:21:42 +08:00
|
|
|
test x"$local" = xtrue && echo 'server.bind = "127.0.0.1"' >> "$conf"
|
2006-07-02 06:14:14 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
apache2_conf () {
|
|
|
|
test -z "$module_path" && module_path=/usr/lib/apache2/modules
|
|
|
|
mkdir -p "$GIT_DIR/gitweb/logs"
|
|
|
|
bind=
|
2007-11-09 07:21:42 +08:00
|
|
|
test x"$local" = xtrue && bind='127.0.0.1:'
|
2009-07-19 00:45:44 +08:00
|
|
|
echo 'text/css css' > "$fqgitdir/mime.types"
|
2006-07-02 06:14:14 +08:00
|
|
|
cat > "$conf" <<EOF
|
2007-01-02 16:57:11 +08:00
|
|
|
ServerName "git-instaweb"
|
2006-07-02 06:14:14 +08:00
|
|
|
ServerRoot "$fqgitdir/gitweb"
|
|
|
|
DocumentRoot "$fqgitdir/gitweb"
|
|
|
|
PidFile "$fqgitdir/pid"
|
|
|
|
Listen $bind$port
|
2007-01-02 16:57:11 +08:00
|
|
|
EOF
|
|
|
|
|
|
|
|
for mod in mime dir; do
|
|
|
|
if test -e $module_path/mod_${mod}.so; then
|
|
|
|
echo "LoadModule ${mod}_module " \
|
|
|
|
"$module_path/mod_${mod}.so" >> "$conf"
|
|
|
|
fi
|
|
|
|
done
|
|
|
|
cat >> "$conf" <<EOF
|
2009-07-19 00:45:44 +08:00
|
|
|
TypesConfig "$fqgitdir/mime.types"
|
2006-07-02 06:14:14 +08:00
|
|
|
DirectoryIndex gitweb.cgi
|
|
|
|
EOF
|
|
|
|
|
|
|
|
# check to see if Dennis Stosberg's mod_perl compatibility patch
|
|
|
|
# (<20060621130708.Gcbc6e5c@leonov.stosberg.net>) has been applied
|
2009-11-24 07:56:32 +08:00
|
|
|
if test -f "$module_path/mod_perl.so" &&
|
|
|
|
sane_grep 'MOD_PERL' "$GIT_DIR/gitweb/gitweb.cgi" >/dev/null
|
2006-07-02 06:14:14 +08:00
|
|
|
then
|
|
|
|
# favor mod_perl if available
|
|
|
|
cat >> "$conf" <<EOF
|
|
|
|
LoadModule perl_module $module_path/mod_perl.so
|
|
|
|
PerlPassEnv GIT_DIR
|
|
|
|
PerlPassEnv GIT_EXEC_DIR
|
|
|
|
<Location /gitweb.cgi>
|
|
|
|
SetHandler perl-script
|
|
|
|
PerlResponseHandler ModPerl::Registry
|
|
|
|
PerlOptions +ParseHeaders
|
|
|
|
Options +ExecCGI
|
|
|
|
</Location>
|
|
|
|
EOF
|
|
|
|
else
|
|
|
|
# plain-old CGI
|
2008-06-13 05:54:55 +08:00
|
|
|
resolve_full_httpd
|
2010-01-27 07:08:31 +08:00
|
|
|
list_mods=$(echo "$full_httpd" | sed 's/-f$/-l/')
|
2009-11-24 07:56:32 +08:00
|
|
|
$list_mods | sane_grep 'mod_cgi\.c' >/dev/null 2>&1 || \
|
2009-09-27 02:12:32 +08:00
|
|
|
if test -f "$module_path/mod_cgi.so"
|
|
|
|
then
|
|
|
|
echo "LoadModule cgi_module $module_path/mod_cgi.so" >> "$conf"
|
|
|
|
else
|
|
|
|
$list_mods | grep 'mod_cgid\.c' >/dev/null 2>&1 || \
|
|
|
|
if test -f "$module_path/mod_cgid.so"
|
|
|
|
then
|
|
|
|
echo "LoadModule cgid_module $module_path/mod_cgid.so" \
|
|
|
|
>> "$conf"
|
|
|
|
else
|
|
|
|
echo "You have no CGI support!"
|
|
|
|
exit 2
|
|
|
|
fi
|
|
|
|
echo "ScriptSock logs/gitweb.sock" >> "$conf"
|
|
|
|
fi
|
2006-07-02 06:14:14 +08:00
|
|
|
cat >> "$conf" <<EOF
|
|
|
|
AddHandler cgi-script .cgi
|
|
|
|
<Location /gitweb.cgi>
|
|
|
|
Options +ExecCGI
|
|
|
|
</Location>
|
|
|
|
EOF
|
|
|
|
fi
|
|
|
|
}
|
|
|
|
|
2009-08-21 22:24:48 +08:00
|
|
|
mongoose_conf() {
|
|
|
|
cat > "$conf" <<EOF
|
|
|
|
# Mongoose web server configuration file.
|
|
|
|
# Lines starting with '#' and empty lines are ignored.
|
|
|
|
# For detailed description of every option, visit
|
|
|
|
# http://code.google.com/p/mongoose/wiki/MongooseManual
|
|
|
|
|
|
|
|
root $fqgitdir/gitweb
|
|
|
|
ports $port
|
|
|
|
index_files gitweb.cgi
|
|
|
|
#ssl_cert $fqgitdir/gitweb/ssl_cert.pem
|
|
|
|
error_log $fqgitdir/gitweb/error.log
|
|
|
|
access_log $fqgitdir/gitweb/access.log
|
|
|
|
|
|
|
|
#cgi setup
|
|
|
|
cgi_env PATH=/usr/local/bin:/usr/bin:/bin,GIT_DIR=$GIT_DIR,GIT_EXEC_PATH=$GIT_EXEC_PATH
|
|
|
|
cgi_interp $PERL
|
|
|
|
cgi_ext cgi,pl
|
|
|
|
|
|
|
|
# mimetype mapping
|
|
|
|
mime_types .gz=application/x-gzip,.tar.gz=application/x-tgz,.tgz=application/x-tgz,.tar=application/x-tar,.zip=application/zip,.gif=image/gif,.jpg=image/jpeg,.jpeg=image/jpeg,.png=image/png,.css=text/css,.html=text/html,.htm=text/html,.js=text/javascript,.c=text/plain,.cpp=text/plain,.log=text/plain,.conf=text/plain,.text=text/plain,.txt=text/plain,.dtd=text/xml,.bz2=application/x-bzip,.tbz=application/x-bzip-compressed-tar,.tar.bz2=application/x-bzip-compressed-tar
|
|
|
|
EOF
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2006-07-02 06:14:14 +08:00
|
|
|
script='
|
2007-12-19 20:25:27 +08:00
|
|
|
s#^(my|our) \$projectroot =.*#$1 \$projectroot = "'$(dirname "$fqgitdir")'";#;
|
|
|
|
s#(my|our) \$gitbin =.*#$1 \$gitbin = "'$GIT_EXEC_PATH'";#;
|
|
|
|
s#(my|our) \$projects_list =.*#$1 \$projects_list = \$projectroot;#;
|
|
|
|
s#(my|our) \$git_temp =.*#$1 \$git_temp = "'$fqgitdir/gitweb/tmp'";#;'
|
2006-07-02 06:14:14 +08:00
|
|
|
|
|
|
|
gitweb_cgi () {
|
|
|
|
cat > "$1.tmp" <<\EOFGITWEB
|
|
|
|
@@GITWEB_CGI@@
|
|
|
|
EOFGITWEB
|
2007-12-19 20:25:27 +08:00
|
|
|
# Use the configured full path to perl to match the generated
|
|
|
|
# scripts' 'hashpling' line
|
|
|
|
"$PERL" -p -e "$script" "$1.tmp" > "$1"
|
2006-07-02 06:14:14 +08:00
|
|
|
chmod +x "$1"
|
|
|
|
rm -f "$1.tmp"
|
|
|
|
}
|
|
|
|
|
|
|
|
gitweb_css () {
|
|
|
|
cat > "$1" <<\EOFGITWEB
|
|
|
|
@@GITWEB_CSS@@
|
|
|
|
EOFGITWEB
|
|
|
|
}
|
|
|
|
|
gitweb: Incremental blame (using JavaScript)
Add 'blame_incremental' view, which uses "git blame --incremental"
and JavaScript (Ajax), where 'blame' use "git blame --porcelain".
* gitweb generates initial info by putting file contents (from
"git cat-file") together with line numbers in blame table
* then gitweb makes web browser JavaScript engine call startBlame()
function from gitweb.js
* startBlame() opens XMLHttpRequest connection to 'blame_data' view,
which in turn calls "git blame --incremental" for a file, and
streams output of git-blame to JavaScript (gitweb.js)
* XMLHttpRequest event handler updates line info in blame view as soon
as it gets data from 'blame_data' (from server), and it also updates
progress info
* when 'blame_data' ends, and gitweb.js finishes updating line info,
it fixes colors to match (as far as possible) ordinary 'blame' view,
and updates information about how long it took to generate page.
Gitweb deals with streamed 'blame_data' server errors by displaying
them in the progress info area (just in case).
The 'blame_incremental' view tries to be equivalent to 'blame' action;
there are however a few differences in output between 'blame' and
'blame_incremental' view:
* 'blame_incremental' always used query form for this part of link(s)
which is generated by JavaScript code. The difference is visible
if we use path_info link (pass some or all arguments in path_info).
Changing this would require implementing something akin to href()
subroutine from gitweb.perl in JavaScript (in gitweb.js).
* 'blame_incremental' always uses "rowspan" attribute, even if
rowspan="1". This simplifies code, and is not visible to user.
* The progress bar and progress info are still there even after
JavaScript part of 'blame_incremental' finishes work.
Note that currently no link generated by gitweb leads to this new view.
This code is based on patch by Petr Baudis <pasky@suse.cz> patch, which
in turn was tweaked up version of Fredrik Kuivinen <frekui@gmail.com>'s
proof of concept patch.
This patch adds GITWEB_JS compile configuration option, and modifies
git-instaweb.sh to take gitweb.js into account. The code for
git-instaweb.sh was taken from Pasky's patch.
Signed-off-by: Fredrik Kuivinen <frekui@gmail.com>
Signed-off-by: Petr Baudis <pasky@suse.cz>
Signed-off-by: Jakub Narebski <jnareb@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2009-09-01 19:39:17 +08:00
|
|
|
gitweb_js () {
|
|
|
|
cat > "$1" <<\EOFGITWEB
|
|
|
|
@@GITWEB_JS@@
|
|
|
|
EOFGITWEB
|
|
|
|
}
|
|
|
|
|
2007-11-09 07:21:42 +08:00
|
|
|
gitweb_cgi "$GIT_DIR/gitweb/gitweb.cgi"
|
|
|
|
gitweb_css "$GIT_DIR/gitweb/gitweb.css"
|
gitweb: Incremental blame (using JavaScript)
Add 'blame_incremental' view, which uses "git blame --incremental"
and JavaScript (Ajax), where 'blame' use "git blame --porcelain".
* gitweb generates initial info by putting file contents (from
"git cat-file") together with line numbers in blame table
* then gitweb makes web browser JavaScript engine call startBlame()
function from gitweb.js
* startBlame() opens XMLHttpRequest connection to 'blame_data' view,
which in turn calls "git blame --incremental" for a file, and
streams output of git-blame to JavaScript (gitweb.js)
* XMLHttpRequest event handler updates line info in blame view as soon
as it gets data from 'blame_data' (from server), and it also updates
progress info
* when 'blame_data' ends, and gitweb.js finishes updating line info,
it fixes colors to match (as far as possible) ordinary 'blame' view,
and updates information about how long it took to generate page.
Gitweb deals with streamed 'blame_data' server errors by displaying
them in the progress info area (just in case).
The 'blame_incremental' view tries to be equivalent to 'blame' action;
there are however a few differences in output between 'blame' and
'blame_incremental' view:
* 'blame_incremental' always used query form for this part of link(s)
which is generated by JavaScript code. The difference is visible
if we use path_info link (pass some or all arguments in path_info).
Changing this would require implementing something akin to href()
subroutine from gitweb.perl in JavaScript (in gitweb.js).
* 'blame_incremental' always uses "rowspan" attribute, even if
rowspan="1". This simplifies code, and is not visible to user.
* The progress bar and progress info are still there even after
JavaScript part of 'blame_incremental' finishes work.
Note that currently no link generated by gitweb leads to this new view.
This code is based on patch by Petr Baudis <pasky@suse.cz> patch, which
in turn was tweaked up version of Fredrik Kuivinen <frekui@gmail.com>'s
proof of concept patch.
This patch adds GITWEB_JS compile configuration option, and modifies
git-instaweb.sh to take gitweb.js into account. The code for
git-instaweb.sh was taken from Pasky's patch.
Signed-off-by: Fredrik Kuivinen <frekui@gmail.com>
Signed-off-by: Petr Baudis <pasky@suse.cz>
Signed-off-by: Jakub Narebski <jnareb@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2009-09-01 19:39:17 +08:00
|
|
|
gitweb_js "$GIT_DIR/gitweb/gitweb.js"
|
2006-07-02 06:14:14 +08:00
|
|
|
|
|
|
|
case "$httpd" in
|
|
|
|
*lighttpd*)
|
|
|
|
lighttpd_conf
|
|
|
|
;;
|
|
|
|
*apache2*)
|
|
|
|
apache2_conf
|
|
|
|
;;
|
2007-10-07 01:29:49 +08:00
|
|
|
webrick)
|
|
|
|
webrick_conf
|
|
|
|
;;
|
2009-08-21 22:24:48 +08:00
|
|
|
*mongoose*)
|
|
|
|
mongoose_conf
|
|
|
|
;;
|
2006-07-02 06:14:14 +08:00
|
|
|
*)
|
|
|
|
echo "Unknown httpd specified: $httpd"
|
|
|
|
exit 1
|
|
|
|
;;
|
|
|
|
esac
|
|
|
|
|
|
|
|
start_httpd
|
2006-07-27 05:11:46 +08:00
|
|
|
url=http://127.0.0.1:$port
|
2008-02-02 14:32:56 +08:00
|
|
|
|
|
|
|
if test -n "$browser"; then
|
|
|
|
git web--browse -b "$browser" $url || echo $url
|
|
|
|
else
|
|
|
|
git web--browse -c "instaweb.browser" $url || echo $url
|
|
|
|
fi
|