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=
|
2014-02-01 10:17:59 +08:00
|
|
|
OPTIONS_STUCKLONG=
|
2007-11-04 18:30:59 +08:00
|
|
|
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
|
|
|
|
2015-03-08 13:04:09 +08:00
|
|
|
SUBDIRECTORY_OK=Yes
|
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)"
|
2010-05-28 14:25:52 +08:00
|
|
|
root="$(git config --get instaweb.gitwebdir)"
|
2008-06-13 05:54:55 +08:00
|
|
|
port=$(git config --get instaweb.port)
|
|
|
|
module_path="$(git config --get instaweb.modulepath)"
|
2011-06-24 04:59:26 +08:00
|
|
|
action="browse"
|
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'
|
|
|
|
|
2010-05-28 14:25:52 +08:00
|
|
|
# Default is @@GITWEBDIR@@
|
|
|
|
test -z "$root" && root='@@GITWEBDIR@@'
|
|
|
|
|
2006-07-02 06:14:14 +08:00
|
|
|
# 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
|
2010-06-30 20:29:08 +08:00
|
|
|
*apache2*|*lighttpd*|*httpd*)
|
|
|
|
# yes, *httpd* covers *lighttpd* above, but it is there for clarity
|
2008-06-13 05:54:55 +08:00
|
|
|
# ensure that the apache2/lighttpd command ends with "-f"
|
2021-10-22 03:58:00 +08:00
|
|
|
if ! echo "$httpd" | grep -- '-f *$' >/dev/null 2>&1
|
2008-06-13 05:54:55 +08:00
|
|
|
then
|
|
|
|
httpd="$httpd -f"
|
|
|
|
fi
|
|
|
|
;;
|
git-instaweb: Add support for running gitweb via 'plackup'
PSGI is an interface between Perl web applications and web servers, and
Plack is a Perl module and toolkit that contains PSGI middleware, helpers
and adapters to web servers; see http://plackperl.org
PSGI and Plack are inspired by Python's WSGI and Ruby's Rack (and
probably JavaScript's Jack/JSGI).
Plack core distribution includes HTTP::Server::PSGI, a reference PSGI
standalone web server implementation. 'plackup' is a command line
launcher to run PSGI applications from command line, connecting web
app to a web server via Plack::Runner module. By default it uses
HTTP::Server::PSGI as a web server.
git-instaweb generates gitweb.psgi wrapper (in $GIT_DIR/gitweb). This
wrapper uses Plack::App::WrapCGI to compile gitweb.cgi (which is a CGI
script) into a PSGI application using CGI::Compile and CGI::Emulate::PSGI.
git-instaweb then runs this wrapper, using by default HTTP::Server::PSGI
standalone Perl server, via Plack::Runner.
The configuration for 'plackup' is currently embedded in generated
gitweb.psgi wrapper, instead of using httpd.conf ($conf).
To run git-instaweb with '--httpd=plackup', you need to have instaled
Plack core, CGI::Emulate::PSGI, CGI::Compile. Those modules have to be
available for Perl scripts (which can be done for example by setting
PERL5LIB environment variable). This is currently not documented.
Signed-off-by: Jakub Narebski <jnareb@gmail.com>
Acked-by: Petr Baudis <pasky@suse.cz>
Acked-by: Eric Wong <normalperson@yhbt.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2010-05-29 03:11:25 +08:00
|
|
|
*plackup*)
|
|
|
|
# server is started by running via generated gitweb.psgi in $fqgitdir/gitweb
|
|
|
|
full_httpd="$fqgitdir/gitweb/gitweb.psgi"
|
|
|
|
httpd_only="${httpd%% *}" # cut on first space
|
|
|
|
return
|
|
|
|
;;
|
2010-08-04 17:51:25 +08:00
|
|
|
*webrick*)
|
2010-08-05 16:35:45 +08:00
|
|
|
# server is started by running via generated webrick.rb in
|
2010-08-04 17:51:25 +08:00
|
|
|
# $fqgitdir/gitweb
|
2010-08-05 16:35:45 +08:00
|
|
|
full_httpd="$fqgitdir/gitweb/webrick.rb"
|
2010-08-04 17:51:25 +08:00
|
|
|
httpd_only="${httpd%% *}" # cut on first space
|
|
|
|
return
|
|
|
|
;;
|
2019-01-28 21:24:59 +08:00
|
|
|
*python*)
|
|
|
|
# server is started by running via generated gitweb.py in
|
|
|
|
# $fqgitdir/gitweb
|
|
|
|
full_httpd="$fqgitdir/gitweb/gitweb.py"
|
|
|
|
httpd_only="${httpd%% *}" # cut on first space
|
|
|
|
return
|
|
|
|
;;
|
2008-06-13 05:54:55 +08:00
|
|
|
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.
|
2010-05-28 14:25:52 +08:00
|
|
|
for i in /usr/local/sbin /usr/sbin "$root" "$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
|
2022-06-28 18:05:34 +08:00
|
|
|
echo "Instance already running. Restarting..."
|
2009-11-23 15:09:12 +08:00
|
|
|
stop_httpd
|
|
|
|
fi
|
|
|
|
|
2008-06-13 05:54:55 +08:00
|
|
|
# here $httpd should have a meaningful value
|
|
|
|
resolve_full_httpd
|
2011-06-24 05:01:03 +08:00
|
|
|
mkdir -p "$fqgitdir/gitweb/$httpd_only"
|
|
|
|
conf="$fqgitdir/gitweb/$httpd_only.conf"
|
|
|
|
|
|
|
|
# generate correct config file if it doesn't exist
|
|
|
|
test -f "$conf" || configure_httpd
|
|
|
|
test -f "$fqgitdir/gitweb/gitweb_config.perl" || gitweb_conf
|
2008-06-13 05:54:55 +08:00
|
|
|
|
|
|
|
# don't quote $full_httpd, there can be arguments to it (-f)
|
2009-08-21 22:24:48 +08:00
|
|
|
case "$httpd" in
|
2019-01-28 21:24:59 +08:00
|
|
|
*mongoose*|*plackup*|*python*)
|
git-instaweb: Add support for running gitweb via 'plackup'
PSGI is an interface between Perl web applications and web servers, and
Plack is a Perl module and toolkit that contains PSGI middleware, helpers
and adapters to web servers; see http://plackperl.org
PSGI and Plack are inspired by Python's WSGI and Ruby's Rack (and
probably JavaScript's Jack/JSGI).
Plack core distribution includes HTTP::Server::PSGI, a reference PSGI
standalone web server implementation. 'plackup' is a command line
launcher to run PSGI applications from command line, connecting web
app to a web server via Plack::Runner module. By default it uses
HTTP::Server::PSGI as a web server.
git-instaweb generates gitweb.psgi wrapper (in $GIT_DIR/gitweb). This
wrapper uses Plack::App::WrapCGI to compile gitweb.cgi (which is a CGI
script) into a PSGI application using CGI::Compile and CGI::Emulate::PSGI.
git-instaweb then runs this wrapper, using by default HTTP::Server::PSGI
standalone Perl server, via Plack::Runner.
The configuration for 'plackup' is currently embedded in generated
gitweb.psgi wrapper, instead of using httpd.conf ($conf).
To run git-instaweb with '--httpd=plackup', you need to have instaled
Plack core, CGI::Emulate::PSGI, CGI::Compile. Those modules have to be
available for Perl scripts (which can be done for example by setting
PERL5LIB environment variable). This is currently not documented.
Signed-off-by: Jakub Narebski <jnareb@gmail.com>
Acked-by: Petr Baudis <pasky@suse.cz>
Acked-by: Eric Wong <normalperson@yhbt.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2010-05-29 03:11:25 +08:00
|
|
|
#These servers don't have a daemon mode so we'll have to fork it
|
2011-06-24 03:56:37 +08:00
|
|
|
$full_httpd "$conf" &
|
2009-08-21 22:24:48 +08:00
|
|
|
#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
|
|
|
|
;;
|
|
|
|
*)
|
2011-06-24 03:56:37 +08:00
|
|
|
$full_httpd "$conf"
|
2009-08-21 22:24:48 +08:00
|
|
|
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")
|
2010-05-29 03:11:23 +08:00
|
|
|
rm -f "$fqgitdir/pid"
|
2006-07-02 06:14:14 +08:00
|
|
|
}
|
|
|
|
|
2010-05-29 03:11:24 +08:00
|
|
|
httpd_is_ready () {
|
|
|
|
"$PERL" -MIO::Socket::INET -e "
|
|
|
|
local \$| = 1; # turn on autoflush
|
|
|
|
exit if (IO::Socket::INET->new('127.0.0.1:$port'));
|
|
|
|
print 'Waiting for \'$httpd\' to start ..';
|
|
|
|
do {
|
|
|
|
print '.';
|
|
|
|
sleep(1);
|
|
|
|
} until (IO::Socket::INET->new('127.0.0.1:$port'));
|
|
|
|
print qq! (done)\n!;
|
|
|
|
"
|
|
|
|
}
|
|
|
|
|
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)
|
2011-06-24 04:59:26 +08:00
|
|
|
action="stop"
|
2006-07-02 06:14:14 +08:00
|
|
|
;;
|
|
|
|
--start|start)
|
2011-06-24 04:59:26 +08:00
|
|
|
action="start"
|
2006-07-02 06:14:14 +08:00
|
|
|
;;
|
|
|
|
--restart|restart)
|
2011-06-24 04:59:26 +08:00
|
|
|
action="restart"
|
2006-07-02 06:14:14 +08:00
|
|
|
;;
|
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"
|
2010-05-28 14:25:52 +08:00
|
|
|
GITWEB_CONFIG="$fqgitdir/gitweb/gitweb_config.perl"
|
|
|
|
export GIT_EXEC_PATH GIT_DIR GITWEB_CONFIG
|
2006-07-02 06:14:14 +08:00
|
|
|
|
2007-10-07 01:29:49 +08:00
|
|
|
webrick_conf () {
|
2010-08-04 17:51:25 +08:00
|
|
|
# webrick seems to have no way of passing arbitrary environment
|
|
|
|
# variables to the underlying CGI executable, so we wrap the
|
|
|
|
# actual gitweb.cgi using a shell script to force it
|
|
|
|
wrapper="$fqgitdir/gitweb/$httpd/wrapper.sh"
|
|
|
|
cat > "$wrapper" <<EOF
|
2015-03-08 13:05:38 +08:00
|
|
|
#!@SHELL_PATH@
|
2010-08-04 17:51:25 +08:00
|
|
|
# we use this shell script wrapper around the real gitweb.cgi since
|
|
|
|
# there appears to be no other way to pass arbitrary environment variables
|
|
|
|
# into the CGI process
|
|
|
|
GIT_EXEC_PATH=$GIT_EXEC_PATH GIT_DIR=$GIT_DIR GITWEB_CONFIG=$GITWEB_CONFIG
|
|
|
|
export GIT_EXEC_PATH GIT_DIR GITWEB_CONFIG
|
|
|
|
exec $root/gitweb.cgi
|
|
|
|
EOF
|
|
|
|
chmod +x "$wrapper"
|
|
|
|
|
|
|
|
# This assumes _ruby_ is in the user's $PATH. that's _one_
|
|
|
|
# portable way to run ruby, which could be installed anywhere, really.
|
2007-10-07 01:29:49 +08:00
|
|
|
# generate a standalone server script in $fqgitdir/gitweb.
|
|
|
|
cat >"$fqgitdir/gitweb/$httpd.rb" <<EOF
|
2010-08-05 16:35:45 +08:00
|
|
|
#!/usr/bin/env ruby
|
2007-10-07 01:29:49 +08:00
|
|
|
require 'webrick'
|
2010-08-05 16:46:04 +08:00
|
|
|
require 'logger'
|
2010-08-05 16:35:45 +08:00
|
|
|
options = {
|
|
|
|
:Port => $port,
|
|
|
|
:DocumentRoot => "$root",
|
2010-08-05 16:46:04 +08:00
|
|
|
:Logger => Logger.new('$fqgitdir/gitweb/error.log'),
|
|
|
|
:AccessLog => [
|
|
|
|
[ Logger.new('$fqgitdir/gitweb/access.log'),
|
|
|
|
WEBrick::AccessLog::COMBINED_LOG_FORMAT ]
|
|
|
|
],
|
2010-08-05 16:35:45 +08:00
|
|
|
:DirectoryIndex => ["gitweb.cgi"],
|
|
|
|
:CGIInterpreter => "$wrapper",
|
|
|
|
:StartCallback => lambda do
|
|
|
|
File.open("$fqgitdir/pid", "w") { |f| f.puts Process.pid }
|
|
|
|
end,
|
|
|
|
:ServerType => WEBrick::Daemon,
|
|
|
|
}
|
|
|
|
options[:BindAddress] = '127.0.0.1' if "$local" == "true"
|
2007-10-07 01:29:49 +08:00
|
|
|
server = WEBrick::HTTPServer.new(options)
|
|
|
|
['INT', 'TERM'].each do |signal|
|
|
|
|
trap(signal) {server.shutdown}
|
|
|
|
end
|
|
|
|
server.start
|
|
|
|
EOF
|
2010-08-05 16:35:45 +08:00
|
|
|
chmod +x "$fqgitdir/gitweb/$httpd.rb"
|
|
|
|
# configuration is embedded in server script file, webrick.rb
|
|
|
|
rm -f "$conf"
|
2007-10-07 01:29:49 +08:00
|
|
|
}
|
|
|
|
|
2006-07-02 06:14:14 +08:00
|
|
|
lighttpd_conf () {
|
|
|
|
cat > "$conf" <<EOF
|
2010-05-28 14:25:52 +08:00
|
|
|
server.document-root = "$root"
|
2006-07-02 06:14:14 +08:00
|
|
|
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"
|
2010-05-28 14:25:51 +08:00
|
|
|
server.errorlog = "$fqgitdir/gitweb/$httpd_only/error.log"
|
2009-03-10 02:31:55 +08:00
|
|
|
|
|
|
|
# to enable, add "mod_access", "mod_accesslog" to server.modules
|
|
|
|
# variable above and uncomment this
|
2010-05-28 14:25:51 +08:00
|
|
|
#accesslog.filename = "$fqgitdir/gitweb/$httpd_only/access.log"
|
2009-03-10 02:31:55 +08:00
|
|
|
|
2010-05-28 14:25:52 +08:00
|
|
|
setenv.add-environment = ( "PATH" => env.PATH, "GITWEB_CONFIG" => env.GITWEB_CONFIG )
|
2009-03-10 02:31:55 +08:00
|
|
|
|
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 () {
|
2018-08-08 16:49:18 +08:00
|
|
|
for candidate in \
|
|
|
|
/etc/httpd \
|
|
|
|
/usr/lib/apache2 \
|
|
|
|
/usr/lib/httpd ;
|
|
|
|
do
|
|
|
|
if test -d "$candidate/modules"
|
|
|
|
then
|
|
|
|
module_path="$candidate/modules"
|
|
|
|
break
|
|
|
|
fi
|
|
|
|
done
|
2006-07-02 06:14:14 +08:00
|
|
|
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"
|
2010-05-28 14:25:52 +08:00
|
|
|
ServerRoot "$root"
|
|
|
|
DocumentRoot "$root"
|
2010-05-28 14:25:51 +08:00
|
|
|
ErrorLog "$fqgitdir/gitweb/$httpd_only/error.log"
|
|
|
|
CustomLog "$fqgitdir/gitweb/$httpd_only/access.log" combined
|
2006-07-02 06:14:14 +08:00
|
|
|
PidFile "$fqgitdir/pid"
|
|
|
|
Listen $bind$port
|
2007-01-02 16:57:11 +08:00
|
|
|
EOF
|
|
|
|
|
2014-05-27 09:18:10 +08:00
|
|
|
for mod in mpm_event mpm_prefork mpm_worker
|
|
|
|
do
|
|
|
|
if test -e $module_path/mod_${mod}.so
|
|
|
|
then
|
|
|
|
echo "LoadModule ${mod}_module " \
|
|
|
|
"$module_path/mod_${mod}.so" >> "$conf"
|
|
|
|
# only one mpm module permitted
|
|
|
|
break
|
|
|
|
fi
|
|
|
|
done
|
2018-08-07 15:25:48 +08:00
|
|
|
for mod in mime dir env log_config authz_core unixd
|
2010-06-30 20:29:08 +08:00
|
|
|
do
|
|
|
|
if test -e $module_path/mod_${mod}.so
|
|
|
|
then
|
2007-01-02 16:57:11 +08:00
|
|
|
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
|
|
|
|
|
2021-10-22 03:57:58 +08:00
|
|
|
if test -f "$module_path/mod_perl.so"
|
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
|
2010-06-30 10:44:59 +08:00
|
|
|
PerlPassEnv GIT_EXEC_PATH
|
2010-05-28 14:25:52 +08:00
|
|
|
PerlPassEnv GITWEB_CONFIG
|
2006-07-02 06:14:14 +08:00
|
|
|
<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/')
|
2021-10-22 03:58:00 +08:00
|
|
|
$list_mods | 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
|
2010-06-30 10:44:59 +08:00
|
|
|
PassEnv GIT_DIR
|
|
|
|
PassEnv GIT_EXEC_PATH
|
|
|
|
PassEnv GITWEB_CONFIG
|
2006-07-02 06:14:14 +08:00
|
|
|
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
|
2023-11-24 11:35:13 +08:00
|
|
|
# https://code.google.com/p/mongoose/wiki/MongooseManual
|
2009-08-21 22:24:48 +08:00
|
|
|
|
2010-05-28 14:25:52 +08:00
|
|
|
root $root
|
2009-08-21 22:24:48 +08:00
|
|
|
ports $port
|
|
|
|
index_files gitweb.cgi
|
|
|
|
#ssl_cert $fqgitdir/gitweb/ssl_cert.pem
|
2010-05-28 14:25:51 +08:00
|
|
|
error_log $fqgitdir/gitweb/$httpd_only/error.log
|
|
|
|
access_log $fqgitdir/gitweb/$httpd_only/access.log
|
2009-08-21 22:24:48 +08:00
|
|
|
|
|
|
|
#cgi setup
|
2010-05-28 14:25:52 +08:00
|
|
|
cgi_env PATH=$PATH,GIT_DIR=$GIT_DIR,GIT_EXEC_PATH=$GIT_EXEC_PATH,GITWEB_CONFIG=$GITWEB_CONFIG
|
2009-08-21 22:24:48 +08:00
|
|
|
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
|
|
|
|
}
|
|
|
|
|
git-instaweb: Add support for running gitweb via 'plackup'
PSGI is an interface between Perl web applications and web servers, and
Plack is a Perl module and toolkit that contains PSGI middleware, helpers
and adapters to web servers; see http://plackperl.org
PSGI and Plack are inspired by Python's WSGI and Ruby's Rack (and
probably JavaScript's Jack/JSGI).
Plack core distribution includes HTTP::Server::PSGI, a reference PSGI
standalone web server implementation. 'plackup' is a command line
launcher to run PSGI applications from command line, connecting web
app to a web server via Plack::Runner module. By default it uses
HTTP::Server::PSGI as a web server.
git-instaweb generates gitweb.psgi wrapper (in $GIT_DIR/gitweb). This
wrapper uses Plack::App::WrapCGI to compile gitweb.cgi (which is a CGI
script) into a PSGI application using CGI::Compile and CGI::Emulate::PSGI.
git-instaweb then runs this wrapper, using by default HTTP::Server::PSGI
standalone Perl server, via Plack::Runner.
The configuration for 'plackup' is currently embedded in generated
gitweb.psgi wrapper, instead of using httpd.conf ($conf).
To run git-instaweb with '--httpd=plackup', you need to have instaled
Plack core, CGI::Emulate::PSGI, CGI::Compile. Those modules have to be
available for Perl scripts (which can be done for example by setting
PERL5LIB environment variable). This is currently not documented.
Signed-off-by: Jakub Narebski <jnareb@gmail.com>
Acked-by: Petr Baudis <pasky@suse.cz>
Acked-by: Eric Wong <normalperson@yhbt.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2010-05-29 03:11:25 +08:00
|
|
|
plackup_conf () {
|
|
|
|
# generate a standalone 'plackup' server script in $fqgitdir/gitweb
|
|
|
|
# with embedded configuration; it does not use "$conf" file
|
|
|
|
cat > "$fqgitdir/gitweb/gitweb.psgi" <<EOF
|
|
|
|
#!$PERL
|
|
|
|
|
|
|
|
# gitweb - simple web interface to track changes in git repositories
|
2023-11-24 11:35:13 +08:00
|
|
|
# PSGI wrapper and server starter (see https://plackperl.org)
|
git-instaweb: Add support for running gitweb via 'plackup'
PSGI is an interface between Perl web applications and web servers, and
Plack is a Perl module and toolkit that contains PSGI middleware, helpers
and adapters to web servers; see http://plackperl.org
PSGI and Plack are inspired by Python's WSGI and Ruby's Rack (and
probably JavaScript's Jack/JSGI).
Plack core distribution includes HTTP::Server::PSGI, a reference PSGI
standalone web server implementation. 'plackup' is a command line
launcher to run PSGI applications from command line, connecting web
app to a web server via Plack::Runner module. By default it uses
HTTP::Server::PSGI as a web server.
git-instaweb generates gitweb.psgi wrapper (in $GIT_DIR/gitweb). This
wrapper uses Plack::App::WrapCGI to compile gitweb.cgi (which is a CGI
script) into a PSGI application using CGI::Compile and CGI::Emulate::PSGI.
git-instaweb then runs this wrapper, using by default HTTP::Server::PSGI
standalone Perl server, via Plack::Runner.
The configuration for 'plackup' is currently embedded in generated
gitweb.psgi wrapper, instead of using httpd.conf ($conf).
To run git-instaweb with '--httpd=plackup', you need to have instaled
Plack core, CGI::Emulate::PSGI, CGI::Compile. Those modules have to be
available for Perl scripts (which can be done for example by setting
PERL5LIB environment variable). This is currently not documented.
Signed-off-by: Jakub Narebski <jnareb@gmail.com>
Acked-by: Petr Baudis <pasky@suse.cz>
Acked-by: Eric Wong <normalperson@yhbt.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2010-05-29 03:11:25 +08:00
|
|
|
|
|
|
|
use strict;
|
|
|
|
|
|
|
|
use IO::Handle;
|
|
|
|
use Plack::MIME;
|
|
|
|
use Plack::Builder;
|
|
|
|
use Plack::App::WrapCGI;
|
|
|
|
use CGI::Emulate::PSGI 0.07; # minimum version required to work with gitweb
|
|
|
|
|
|
|
|
# mimetype mapping (from lighttpd_conf)
|
|
|
|
Plack::MIME->add_type(
|
|
|
|
".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"
|
|
|
|
);
|
|
|
|
|
|
|
|
my \$app = builder {
|
|
|
|
# to be able to override \$SIG{__WARN__} to log build time warnings
|
|
|
|
use CGI::Carp; # it sets \$SIG{__WARN__} itself
|
|
|
|
|
|
|
|
my \$logdir = "$fqgitdir/gitweb/$httpd_only";
|
|
|
|
open my \$access_log_fh, '>>', "\$logdir/access.log"
|
|
|
|
or die "Couldn't open access log '\$logdir/access.log': \$!";
|
|
|
|
open my \$error_log_fh, '>>', "\$logdir/error.log"
|
|
|
|
or die "Couldn't open error log '\$logdir/error.log': \$!";
|
|
|
|
|
|
|
|
\$access_log_fh->autoflush(1);
|
|
|
|
\$error_log_fh->autoflush(1);
|
|
|
|
|
|
|
|
# redirect build time warnings to error.log
|
|
|
|
\$SIG{'__WARN__'} = sub {
|
|
|
|
my \$msg = shift;
|
|
|
|
# timestamp warning like in CGI::Carp::warn
|
|
|
|
my \$stamp = CGI::Carp::stamp();
|
|
|
|
\$msg =~ s/^/\$stamp/gm;
|
|
|
|
print \$error_log_fh \$msg;
|
|
|
|
};
|
|
|
|
|
|
|
|
# write errors to error.log, access to access.log
|
|
|
|
enable 'AccessLog',
|
|
|
|
format => "combined",
|
|
|
|
logger => sub { print \$access_log_fh @_; };
|
|
|
|
enable sub {
|
|
|
|
my \$app = shift;
|
|
|
|
sub {
|
|
|
|
my \$env = shift;
|
|
|
|
\$env->{'psgi.errors'} = \$error_log_fh;
|
|
|
|
\$app->(\$env);
|
|
|
|
}
|
|
|
|
};
|
|
|
|
# gitweb currently doesn't work with $SIG{CHLD} set to 'IGNORE',
|
|
|
|
# because it uses 'close $fd or die...' on piped filehandle $fh
|
|
|
|
# (which causes the parent process to wait for child to finish).
|
|
|
|
enable_if { \$SIG{'CHLD'} eq 'IGNORE' } sub {
|
|
|
|
my \$app = shift;
|
|
|
|
sub {
|
|
|
|
my \$env = shift;
|
|
|
|
local \$SIG{'CHLD'} = 'DEFAULT';
|
|
|
|
local \$SIG{'CLD'} = 'DEFAULT';
|
|
|
|
\$app->(\$env);
|
|
|
|
}
|
|
|
|
};
|
|
|
|
# serve static files, i.e. stylesheet, images, script
|
|
|
|
enable 'Static',
|
|
|
|
path => sub { m!\.(js|css|png)\$! && s!^/gitweb/!! },
|
|
|
|
root => "$root/",
|
|
|
|
encoding => 'utf-8'; # encoding for 'text/plain' files
|
|
|
|
# convert CGI application to PSGI app
|
|
|
|
Plack::App::WrapCGI->new(script => "$root/gitweb.cgi")->to_app;
|
|
|
|
};
|
|
|
|
|
|
|
|
# make it runnable as standalone app,
|
|
|
|
# like it would be run via 'plackup' utility
|
2011-02-27 06:32:33 +08:00
|
|
|
if (caller) {
|
|
|
|
return \$app;
|
|
|
|
} else {
|
git-instaweb: Add support for running gitweb via 'plackup'
PSGI is an interface between Perl web applications and web servers, and
Plack is a Perl module and toolkit that contains PSGI middleware, helpers
and adapters to web servers; see http://plackperl.org
PSGI and Plack are inspired by Python's WSGI and Ruby's Rack (and
probably JavaScript's Jack/JSGI).
Plack core distribution includes HTTP::Server::PSGI, a reference PSGI
standalone web server implementation. 'plackup' is a command line
launcher to run PSGI applications from command line, connecting web
app to a web server via Plack::Runner module. By default it uses
HTTP::Server::PSGI as a web server.
git-instaweb generates gitweb.psgi wrapper (in $GIT_DIR/gitweb). This
wrapper uses Plack::App::WrapCGI to compile gitweb.cgi (which is a CGI
script) into a PSGI application using CGI::Compile and CGI::Emulate::PSGI.
git-instaweb then runs this wrapper, using by default HTTP::Server::PSGI
standalone Perl server, via Plack::Runner.
The configuration for 'plackup' is currently embedded in generated
gitweb.psgi wrapper, instead of using httpd.conf ($conf).
To run git-instaweb with '--httpd=plackup', you need to have instaled
Plack core, CGI::Emulate::PSGI, CGI::Compile. Those modules have to be
available for Perl scripts (which can be done for example by setting
PERL5LIB environment variable). This is currently not documented.
Signed-off-by: Jakub Narebski <jnareb@gmail.com>
Acked-by: Petr Baudis <pasky@suse.cz>
Acked-by: Eric Wong <normalperson@yhbt.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2010-05-29 03:11:25 +08:00
|
|
|
require Plack::Runner;
|
|
|
|
|
|
|
|
my \$runner = Plack::Runner->new();
|
|
|
|
\$runner->parse_options(qw(--env deployment --port $port),
|
2011-02-27 06:32:33 +08:00
|
|
|
"$local" ? qw(--host 127.0.0.1) : ());
|
git-instaweb: Add support for running gitweb via 'plackup'
PSGI is an interface between Perl web applications and web servers, and
Plack is a Perl module and toolkit that contains PSGI middleware, helpers
and adapters to web servers; see http://plackperl.org
PSGI and Plack are inspired by Python's WSGI and Ruby's Rack (and
probably JavaScript's Jack/JSGI).
Plack core distribution includes HTTP::Server::PSGI, a reference PSGI
standalone web server implementation. 'plackup' is a command line
launcher to run PSGI applications from command line, connecting web
app to a web server via Plack::Runner module. By default it uses
HTTP::Server::PSGI as a web server.
git-instaweb generates gitweb.psgi wrapper (in $GIT_DIR/gitweb). This
wrapper uses Plack::App::WrapCGI to compile gitweb.cgi (which is a CGI
script) into a PSGI application using CGI::Compile and CGI::Emulate::PSGI.
git-instaweb then runs this wrapper, using by default HTTP::Server::PSGI
standalone Perl server, via Plack::Runner.
The configuration for 'plackup' is currently embedded in generated
gitweb.psgi wrapper, instead of using httpd.conf ($conf).
To run git-instaweb with '--httpd=plackup', you need to have instaled
Plack core, CGI::Emulate::PSGI, CGI::Compile. Those modules have to be
available for Perl scripts (which can be done for example by setting
PERL5LIB environment variable). This is currently not documented.
Signed-off-by: Jakub Narebski <jnareb@gmail.com>
Acked-by: Petr Baudis <pasky@suse.cz>
Acked-by: Eric Wong <normalperson@yhbt.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2010-05-29 03:11:25 +08:00
|
|
|
\$runner->run(\$app);
|
|
|
|
}
|
|
|
|
__END__
|
|
|
|
EOF
|
|
|
|
|
|
|
|
chmod a+x "$fqgitdir/gitweb/gitweb.psgi"
|
|
|
|
# configuration is embedded in server script file, gitweb.psgi
|
|
|
|
rm -f "$conf"
|
|
|
|
}
|
|
|
|
|
2019-01-28 21:24:59 +08:00
|
|
|
python_conf() {
|
|
|
|
# Python's builtin http.server and its CGI support is very limited.
|
|
|
|
# CGI handler is capable of running CGI script only from inside a directory.
|
|
|
|
# Trying to set cgi_directories=["/"] will add double slash to SCRIPT_NAME
|
|
|
|
# and that in turn breaks gitweb's relative link generation.
|
|
|
|
|
|
|
|
# create a simple web root where $fqgitdir/gitweb/$httpd_only is our root
|
|
|
|
mkdir -p "$fqgitdir/gitweb/$httpd_only/cgi-bin"
|
|
|
|
# Python http.server follows the symlinks
|
|
|
|
ln -sf "$root/gitweb.cgi" "$fqgitdir/gitweb/$httpd_only/cgi-bin/gitweb.cgi"
|
|
|
|
ln -sf "$root/static" "$fqgitdir/gitweb/$httpd_only/"
|
|
|
|
|
|
|
|
# generate a standalone 'python http.server' script in $fqgitdir/gitweb
|
2024-09-20 02:34:24 +08:00
|
|
|
# This assumes that python is in user's $PATH
|
2019-01-28 21:24:59 +08:00
|
|
|
# This script is Python 2 and 3 compatible
|
|
|
|
cat > "$fqgitdir/gitweb/gitweb.py" <<EOF
|
|
|
|
#!/usr/bin/env python
|
|
|
|
import os
|
|
|
|
import sys
|
|
|
|
|
|
|
|
# Open log file in line buffering mode
|
|
|
|
accesslogfile = open("$fqgitdir/gitweb/access.log", 'a', buffering=1)
|
|
|
|
errorlogfile = open("$fqgitdir/gitweb/error.log", 'a', buffering=1)
|
|
|
|
|
|
|
|
# and replace our stdout and stderr with log files
|
|
|
|
# also do a lowlevel duplicate of the logfile file descriptors so that
|
|
|
|
# our CGI child process writes any stderr warning also to the log file
|
|
|
|
_orig_stdout_fd = sys.stdout.fileno()
|
|
|
|
sys.stdout.close()
|
|
|
|
os.dup2(accesslogfile.fileno(), _orig_stdout_fd)
|
|
|
|
sys.stdout = accesslogfile
|
|
|
|
|
|
|
|
_orig_stderr_fd = sys.stderr.fileno()
|
|
|
|
sys.stderr.close()
|
|
|
|
os.dup2(errorlogfile.fileno(), _orig_stderr_fd)
|
|
|
|
sys.stderr = errorlogfile
|
|
|
|
|
|
|
|
from functools import partial
|
|
|
|
|
|
|
|
if sys.version_info < (3, 0): # Python 2
|
|
|
|
from CGIHTTPServer import CGIHTTPRequestHandler
|
|
|
|
from BaseHTTPServer import HTTPServer as ServerClass
|
|
|
|
else: # Python 3
|
|
|
|
from http.server import CGIHTTPRequestHandler
|
|
|
|
from http.server import HTTPServer as ServerClass
|
|
|
|
|
|
|
|
|
|
|
|
# Those environment variables will be passed to the cgi script
|
|
|
|
os.environ.update({
|
|
|
|
"GIT_EXEC_PATH": "$GIT_EXEC_PATH",
|
|
|
|
"GIT_DIR": "$GIT_DIR",
|
|
|
|
"GITWEB_CONFIG": "$GITWEB_CONFIG"
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
|
|
class GitWebRequestHandler(CGIHTTPRequestHandler):
|
|
|
|
|
|
|
|
def log_message(self, format, *args):
|
|
|
|
# Write access logs to stdout
|
|
|
|
sys.stdout.write("%s - - [%s] %s\n" %
|
|
|
|
(self.address_string(),
|
|
|
|
self.log_date_time_string(),
|
|
|
|
format%args))
|
|
|
|
|
|
|
|
def do_HEAD(self):
|
|
|
|
self.redirect_path()
|
|
|
|
CGIHTTPRequestHandler.do_HEAD(self)
|
|
|
|
|
|
|
|
def do_GET(self):
|
|
|
|
if self.path == "/":
|
|
|
|
self.send_response(303, "See Other")
|
|
|
|
self.send_header("Location", "/cgi-bin/gitweb.cgi")
|
|
|
|
self.end_headers()
|
|
|
|
return
|
|
|
|
self.redirect_path()
|
|
|
|
CGIHTTPRequestHandler.do_GET(self)
|
|
|
|
|
|
|
|
def do_POST(self):
|
|
|
|
self.redirect_path()
|
|
|
|
CGIHTTPRequestHandler.do_POST(self)
|
|
|
|
|
|
|
|
# rewrite path of every request that is not gitweb.cgi to out of cgi-bin
|
|
|
|
def redirect_path(self):
|
|
|
|
if not self.path.startswith("/cgi-bin/gitweb.cgi"):
|
|
|
|
self.path = self.path.replace("/cgi-bin/", "/")
|
|
|
|
|
|
|
|
# gitweb.cgi is the only thing that is ever going to be run here.
|
|
|
|
# Ignore everything else
|
|
|
|
def is_cgi(self):
|
|
|
|
result = False
|
|
|
|
if self.path.startswith('/cgi-bin/gitweb.cgi'):
|
|
|
|
result = CGIHTTPRequestHandler.is_cgi(self)
|
|
|
|
return result
|
|
|
|
|
|
|
|
|
|
|
|
bind = "127.0.0.1"
|
|
|
|
if "$local" == "true":
|
|
|
|
bind = "0.0.0.0"
|
|
|
|
|
|
|
|
# Set our http root directory
|
|
|
|
# This is a work around for a missing directory argument in older Python versions
|
|
|
|
# as this was added to SimpleHTTPRequestHandler in Python 3.7
|
|
|
|
os.chdir("$fqgitdir/gitweb/$httpd_only/")
|
|
|
|
|
|
|
|
GitWebRequestHandler.protocol_version = "HTTP/1.0"
|
|
|
|
httpd = ServerClass((bind, $port), GitWebRequestHandler)
|
|
|
|
|
|
|
|
sa = httpd.socket.getsockname()
|
|
|
|
print("Serving HTTP on", sa[0], "port", sa[1], "...")
|
|
|
|
httpd.serve_forever()
|
|
|
|
EOF
|
|
|
|
|
|
|
|
chmod a+x "$fqgitdir/gitweb/gitweb.py"
|
|
|
|
}
|
|
|
|
|
2010-05-28 14:25:52 +08:00
|
|
|
gitweb_conf() {
|
|
|
|
cat > "$fqgitdir/gitweb/gitweb_config.perl" <<EOF
|
2013-10-29 09:19:59 +08:00
|
|
|
#!@@PERL@@
|
2010-05-28 14:25:52 +08:00
|
|
|
our \$projectroot = "$(dirname "$fqgitdir")";
|
|
|
|
our \$git_temp = "$fqgitdir/gitweb/tmp";
|
|
|
|
our \$projects_list = \$projectroot;
|
2010-11-11 20:26:18 +08:00
|
|
|
|
|
|
|
\$feature{'remote_heads'}{'default'} = [1];
|
2010-05-28 14:25:52 +08:00
|
|
|
EOF
|
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
|
|
|
}
|
|
|
|
|
2011-06-24 03:55:00 +08:00
|
|
|
configure_httpd() {
|
|
|
|
case "$httpd" in
|
|
|
|
*lighttpd*)
|
|
|
|
lighttpd_conf
|
|
|
|
;;
|
|
|
|
*apache2*|*httpd*)
|
|
|
|
apache2_conf
|
|
|
|
;;
|
|
|
|
webrick)
|
|
|
|
webrick_conf
|
|
|
|
;;
|
|
|
|
*mongoose*)
|
|
|
|
mongoose_conf
|
|
|
|
;;
|
|
|
|
*plackup*)
|
|
|
|
plackup_conf
|
|
|
|
;;
|
2019-01-28 21:24:59 +08:00
|
|
|
*python*)
|
|
|
|
python_conf
|
|
|
|
;;
|
2011-06-24 03:55:00 +08:00
|
|
|
*)
|
|
|
|
echo "Unknown httpd specified: $httpd"
|
|
|
|
exit 1
|
|
|
|
;;
|
|
|
|
esac
|
|
|
|
}
|
|
|
|
|
2011-06-24 04:59:26 +08:00
|
|
|
case "$action" in
|
|
|
|
stop)
|
|
|
|
stop_httpd
|
|
|
|
exit 0
|
|
|
|
;;
|
|
|
|
start)
|
|
|
|
start_httpd
|
|
|
|
exit 0
|
|
|
|
;;
|
|
|
|
restart)
|
|
|
|
stop_httpd
|
|
|
|
start_httpd
|
|
|
|
exit 0
|
|
|
|
;;
|
|
|
|
esac
|
|
|
|
|
2010-05-28 14:25:52 +08:00
|
|
|
gitweb_conf
|
2006-07-02 06:14:14 +08:00
|
|
|
|
2010-05-28 14:25:51 +08:00
|
|
|
resolve_full_httpd
|
|
|
|
mkdir -p "$fqgitdir/gitweb/$httpd_only"
|
2011-06-24 05:01:03 +08:00
|
|
|
conf="$fqgitdir/gitweb/$httpd_only.conf"
|
2010-05-28 14:25:51 +08:00
|
|
|
|
2011-06-24 03:55:00 +08:00
|
|
|
configure_httpd
|
2006-07-02 06:14:14 +08:00
|
|
|
|
|
|
|
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
|
2010-05-29 03:11:24 +08:00
|
|
|
httpd_is_ready && git web--browse -b "$browser" $url || echo $url
|
2008-02-02 14:32:56 +08:00
|
|
|
else
|
2010-05-29 03:11:24 +08:00
|
|
|
httpd_is_ready && git web--browse -c "instaweb.browser" $url || echo $url
|
2008-02-02 14:32:56 +08:00
|
|
|
fi
|