=================================================================== RCS file: /cvs/cvsweb/cvsweb.cgi,v retrieving revision 3.12 retrieving revision 3.31 diff -u -p -r3.12 -r3.31 --- cvsweb/cvsweb.cgi 2000/08/15 06:54:01 3.12 +++ cvsweb/cvsweb.cgi 2000/10/02 19:07:08 3.31 @@ -9,6 +9,7 @@ # Ken Coar # Dick Balaska # Akinori MUSHA +# Jens-Uwe Mager # # Based on: # * Bill Fenners cvsweb.cgi revision 1.28 available from: @@ -41,8 +42,8 @@ # OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF # SUCH DAMAGE. # -# $zId: cvsweb.cgi,v 1.93 2000/07/27 17:42:28 hzeller Exp $ -# $Id: cvsweb.cgi,v 3.12 2000/08/15 06:54:01 knu Exp $ +# $zId: cvsweb.cgi,v 1.103 2000/09/20 17:02:29 jumager Exp $ +# $Id: cvsweb.cgi,v 3.31 2000/10/02 19:07:08 knu Exp $ # ### @@ -53,8 +54,8 @@ use vars qw ( %CVSROOT %CVSROOTdescr %MIRRORS %DEFAULTVALUE %ICONS %MTYPES %alltags @tabcolors %fileinfo %tags @branchnames %nameprinted %symrev %revsym @allrevisions %date %author @revdisplayorder - @revisions %state %difflines %log %branchpoint @revorder $prcgi - @prcategories $prcategories + @revisions %state %difflines %log %branchpoint @revorder + $prcgi @prcategories $prcategories $mancgi $checkoutMagic $doCheckout $scriptname $scriptwhere $where $pathinfo $Browser $nofilelinks $maycompress @stickyvars %funcline_regexp $is_mod_perl @@ -63,8 +64,9 @@ use vars qw ( $bylog $byfile $hr_default $logsort $cvstree $cvsroot $mimetype $defaultTextPlain $defaultViewable $allow_compress $GZIPBIN $backicon $diricon $fileicon $fullname $newname - $cvstreedefault $body_tag $logo $defaulttitle $address - $backcolor $long_intro $short_instruction $shortLogLen + $cvstreedefault $body_tag $body_tag_for_src + $logo $defaulttitle $address + $long_intro $short_instruction $shortLogLen $show_author $dirtable $tablepadding $columnHeaderColorDefault $columnHeaderColorSorted $hr_breakable $showfunc $hr_ignwhite $hr_ignkeysubst $diffcolorHeading $diffcolorEmpty $diffcolorRemove @@ -76,19 +78,21 @@ use vars qw ( $navigationHeaderColor $tableBorderColor $markupLogColor $tabstop $state $annTable $sel $curbranch @HideModules $module $use_descriptions %descriptions @mytz $dwhere $moddate - $use_moddate + $use_moddate $has_zlib $gzip_open ); sub printDiffSelect($); sub findLastModifiedSubdirs(@); sub htmlify($;$); -sub spacedHtmlText($); +sub spacedHtmlText($;$); sub link($$); sub revcmp($$); sub fatal($$); sub redirect($); sub safeglob($); sub getMimeTypeFromSuffix($); +sub head($;$); +sub scan_directives(@); sub doAnnotate($$); sub doCheckout($$); sub cvswebMarkup($$$); @@ -121,11 +125,13 @@ sub forbidden_module($); use Cwd; # == EDIT this == -# User configuration is stored in -$config = undef; - -for ($ENV{CVSWEB_CONFIG}, '/usr/local/etc/cvsweb.conf', getcwd . '/cvsweb.conf') { - $config = $_ if defined($_) && -r $_; +# Locations to search for user configuration, in order: +for ( + $ENV{CVSWEB_CONFIG}, + '/usr/local/etc/cvsweb.conf', + getcwd() . '/cvsweb.conf' + ) { + $config = $_ if defined($_) && -r $_; } # == Configuration defaults == @@ -139,8 +145,9 @@ $allow_version_select = 1; # These are defined to allow checking with perl -cw %CVSROOT = %MIRRORS = %DEFAULTVALUE = %ICONS = %MTYPES = %tags = %alltags = @tabcolors = (); -$cvstreedefault = $body_tag = $logo = $defaulttitle = $address = -$backcolor = $long_intro = $short_instruction = $shortLogLen = +$cvstreedefault = $body_tag = $body_tag_for_src = +$logo = $defaulttitle = $address = +$long_intro = $short_instruction = $shortLogLen = $show_author = $dirtable = $tablepadding = $columnHeaderColorDefault = $columnHeaderColorSorted = $hr_breakable = $showfunc = $hr_ignwhite = $hr_ignkeysubst = $diffcolorHeading = $diffcolorEmpty = $diffcolorRemove = @@ -150,13 +157,20 @@ $allow_markup = $use_java_script = $open_extern_window $extern_window_width = $extern_window_height = $edit_option_form = $checkout_magic = $show_subdir_lastmod = $show_log_in_markup = $v = $navigationHeaderColor = $tableBorderColor = $markupLogColor = -$tabstop = $use_moddate = $moddate = undef; +$tabstop = $use_moddate = $moddate = $gzip_open = undef; ##### End of configuration variables ##### use Time::Local; use IPC::Open2; +# Check if the zlib C library interface is installed, and if yes +# we can avoid using the extra gzip process. +eval { + require Compress::Zlib; +}; +$has_zlib = !$@; + $verbose = $v; $checkoutMagic = "~checkout~"; $pathinfo = defined($ENV{PATH_INFO}) ? $ENV{PATH_INFO} : ''; @@ -194,13 +208,13 @@ $nofilelinks = $is_textbased; # braindamaged MS-Internet Exploders claim that they # accept gzip .. but don't in fact and # display garbage then :-/ -# Turn off gzip if running under mod_perl. piping does -# not work as expected inside the server. One can probably -# achieve the same result using Apache::GZIPFilter. -$maycompress = (($ENV{HTTP_ACCEPT_ENCODING} =~ m`gzip` +# Turn off gzip if running under mod_perl and no zlib is available, +# piping does not work as expected inside the server. +$maycompress = (((defined($ENV{HTTP_ACCEPT_ENCODING}) + && $ENV{HTTP_ACCEPT_ENCODING} =~ m`gzip`) || $is_mozilla3) && !$is_msie - && !$is_mod_perl); + && !($is_mod_perl && !$has_zlib)); # put here the variables we need in order # to hold our state - they will be added (with @@ -209,9 +223,11 @@ $maycompress = (($ENV{HTTP_ACCEPT_ENCODING} =~ m`gzip` @stickyvars = qw(cvsroot hideattic sortby logsort f only_with_tag); if (-f $config) { - do $config; -} -else { + do $config + || &fatal("500 Internal Error", + sprintf('Error in loading configuration file: %s

%s
', + $config, &htmlify($@))); +} else { &fatal("500 Internal Error", 'Configuration not found. Set the variable $config ' . 'in cvsweb.cgi, or the environment variable ' @@ -263,25 +279,24 @@ foreach (keys %DEFAULTVALUE) } $barequery = ""; +my @barequery; foreach (@stickyvars) { # construct a query string with the sticky non default parameters set if (defined($input{$_}) && $input{$_} ne '' && !(defined($DEFAULTVALUE{$_}) && $input{$_} eq $DEFAULTVALUE{$_})) { - if ($barequery) { - $barequery = $barequery . "&"; - } - my $thisval = urlencode($_) . "=" . urlencode($input{$_}); - $barequery .= $thisval; + push @barequery, join('=', urlencode($_), urlencode($input{$_}); } } # is there any query ? -if ($barequery) { +if (@barequery) { + $barequery = join('&', @barequery); $query = "?$barequery"; - $barequery = "&" . $barequery; + $barequery = "&$barequery"; } else { $query = ""; } +undef @barequery; # get actual parameters $sortby = $input{"sortby"}; @@ -329,7 +344,8 @@ if ($input{'cvsroot'} && $CVSROOT{$input{'cvsroot'}}) $cvsroot = $CVSROOT{$cvstree}; # create icons out of description -foreach my $k (keys %ICONS) { +my $k +foreach $k (keys %ICONS) { no strict 'refs'; my ($itxt,$ipath,$iwidth,$iheight) = @{$ICONS{$k}}; if ($ipath) { @@ -339,11 +355,21 @@ foreach my $k (keys %ICONS) { ${"${k}icon"} = $itxt; } } +undef $k; +my $config_cvstree = "$config-$cvstree"; + # Do some special configuration for cvstrees -do "$config-$cvstree" if (-f "$config-$cvstree"); +if (-f $config_cvstree) { + do $config_cvstree + || &fatal("500 Internal Error", + sprintf('Error in loading configuration file: %s

%s
', + $config_cvstree, &htmlify($@))); +} +undef $config_cvstree; $prcategories = '(?:' . join('|', @prcategories) . ')'; +$prcgi .= '%s' if defined($prcgi) && $prcgi !~ /%s/; $fullname = $cvsroot . '/' . $where; $mimetype = &getMimeTypeFromSuffix ($fullname); @@ -355,7 +381,7 @@ $defaultViewable = $allow_markup && viewable($mimetype # ge get an Internal Server Error if we try to pipe the # output through the nonexistent gzip .. # any more elegant ways to prevent this are welcome! -if ($allow_compress && $maycompress) { +if ($allow_compress && $maycompress && !$has_zlib) { foreach (split(/:/, $ENV{PATH})) { if (-x "$_/gzip") { $GZIPBIN = "$_/gzip"; @@ -706,7 +732,8 @@ elsif (-d $fullname) { foreach my $var (@stickyvars) { print "\n" if (defined($input{$var}) - && $input{$var} ne $DEFAULTVALUE{$var} + && (!defined($DEFAULTVALUE{$var}) + || $input{$var} ne $DEFAULTVALUE{$var}) && $input{$var} ne "" && $var ne "only_with_tag"); } @@ -717,7 +744,7 @@ elsif (-d $fullname) { print "