#!/usr/bonsaitools/bin/perl -- # -*- Mode: perl; indent-tabs-mode: nil -*- # # The contents of this file are subject to the Netscape Public # License Version 1.1 (the "License"); you may not use this file # except in compliance with the License. You may obtain a copy of # the License at http://www.mozilla.org/NPL/ # # Software distributed under the License is distributed on an "AS # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or # implied. See the License for the specific language governing # rights and limitations under the License. # # The Original Code is the Tinderbox build tool. # # The Initial Developer of the Original Code is Netscape Communications # Corporation. Portions created by Netscape are # Copyright (C) 1998 Netscape Communications Corporation. All # Rights Reserved. # # Contributor(s): use lib '../bonsai'; require 'tbglobals.pl'; require 'lloydcgi.pl'; require 'header.pl'; ############################################################# # Global variables $LINES_AFTER_ERROR = 5; $LINES_BEFORE_ERROR = 30; # These variables are set by the error parser functions: # has_error(), has_warning(), and has_errorline(). $error_file = ''; $error_file_ref = ''; $error_line = 0; $error_guess = 0; $next_err = 0; @log_errors = (); $log_line = 0; ############################################################# # CGI inputs if (defined($args = $form{log}) or defined($args = $form{exerpt})) { ($full_logfile, $linenum) = split /:/, $args; ($tree, $logfile) = split /\//, $full_logfile; my $br = tb_find_build_record($tree, $logfile); $errorparser = $br->{errorparser}; $buildname = $br->{buildname}; $buildtime = $br->{buildtime}; $numlines = 50; $numlines = $form{numlines} if exists $form{numlines}; } else { $tree = $form{tree}; $errorparser = $form{errorparser}; $logfile = $form{logfile}; $buildname = $form{buildname}; $buildtime = $form{buildtime}; } $fulltext = $form{fulltext}; $enc_buildname = &url_encode($buildname); die "the \"tree\" parameter must be provided\n" unless $tree; require "$tree/treedata.pl"; $time_str = print_time( $buildtime ); $|=1; if ($linenum) { &print_fragment; exit; } &print_header; &print_notes; # Dynamically load the error parser # die "the \"errorparser\" parameter must be provided\n" unless $errorparser; require "ep_${errorparser}.pl"; if ($fulltext) { &print_summary; &print_log; } else { $brief_filename = $logfile; $brief_filename =~ s/.gz$/.brief.html/; if (-T "$tree/$brief_filename" and -M _ > -M $tree/$logfile) { open (BRIEFFILE, "<$tree/$brief_filename"); print while () } else { open (BRIEFFILE, ">$tree/$brief_filename"); &print_summary; &print_log; } } # end of main ############################################################ sub print_fragment { print "Content-type: text/html\n\n"; print "\n"; my $heading = "Build Log (Fragment)"; my $subheading = "$buildname on $time_str"; my $title = "$heading - $subheading"; EmitHtmlTitleAndHeader($title, $heading, $subheading); print "Show Full Build Log"; open(BUILD_IN, "$gzip -d -c $tree/$logfile|"); my $first_line = $linenum - ($numlines/2); my $last_line = $linenum + ($numlines/2); print "
.
.
.
"; while() { next if $. < $first_line; last if $. > $last_line; print "" if $. == $linenum; print; print "" if $. == $linenum; } print ".
.
.
"; } sub print_header { print "Content-type: text/html\n\n"; if( $fulltext ){ $s = 'Show Brief Log'; $s1 = ''; $s2 = 'Full'; } else { $s = 'Show Full Log'; $s1 = 1; $s2 = 'Brief'; } print "\n"; my $heading = "Build Log ($s2)"; my $subheading = "$buildname on $time_str"; my $title = "$heading - $subheading"; EmitHtmlTitleAndHeader($title, $heading, $subheading); print "
$s
Return to the Build Page
Add a Comment to the Log "; } sub print_notes { # # Print notes # $found_note = 0; open(NOTES,"<$tree/notes.txt") or print "

warning: Couldn't open $tree/notes.txt

\n"; print "$buildtime, $buildname
\n"; while(){ chop; ($nbuildtime,$nbuildname,$nwho,$nnow,$nenc_note) = split(/\|/); #print "$_
\n"; if( $nbuildtime == $buildtime && $nbuildname eq $buildname ){ if( !$found_note ){ print "

Build Comments

\n"; $found_note = 1; } $now_str = &print_time($nnow); $note = &url_decode($nenc_note); print "
\n[$nwho - $now_str]\n$note\n
"; } } close(NOTES); } sub print_summary { # # Print the summary first # logprint('

Build Error Summary

');

  $log_line = 0;
  open( BUILD_IN, "$gzip -d -c $tree/$logfile|" );
  while( $line =  ){
    &output_summary_line( $line );
  }
  close( BUILD_IN );
  push @log_errors, 9999999;        

  logprint('
'); } sub print_log_section { my ($tree, $logfile, $line_of_interest, $num_lines) = shift; local $_; my $first_line = $line_of_interest - $num_lines / 2; my $last_line = $first_line + $num_lines; print "" ."Previous $num_lines"; print ".
.
.
"; print "
";
  my $ii = 0;
  open BUILD_IN, "$gzip -d -c $tree/$logfile|";
  while () {
    $ii++;
    next if $ii < $first_line;
    last if $ii > $last_line;
    if ($ii == $line_of_intested) {
      print "$_";
    } else {
      print;
    }
  }
  close BUILD_IN;
  print "
"; print ".
.
.
"; print "" ."Next $num_lines"; } sub print_log { # # reset the error counter # $next_err = 0; logprint('

Build Error Log

');

  $log_line = 0;
  open( BUILD_IN, "$gzip -d -c $tree/$logfile|" );
  while( $line =  ){
    &output_log_line( $line );
  }
  close( BUILD_IN );

  logprint('

' ."No More Errors" .'


'); } sub output_summary_line { my( $line ) = $_[0]; my( $has_error ); $has_error = &has_error( $line ); $line =~ s/&/&/g; $line =~ s/$line"); $next_err++; } $last_was_error = 1; } else { $last_was_error = 0; } $log_line++; } sub output_log_line { my $line = $_[0]; my $has_error = &has_error($line); my $has_warning = &has_warning($line); $line =~ s/&/&/g; $line =~ s/]*>(?:<\/a>)?$/i or $line =~ /^<\/a>$/i; my $logline = ''; my %out = (); if (($has_error or $has_warning) and &has_errorline($line, \%out)) { $q = quotemeta( $out{error_file} ); $goto_line = $out{error_line} > 10 ? $out{error_line} - 10 : 1; $cvsblame = $out{error_guess} ? "cvsguess.cgi" : "cvsblame.cgi"; $line =~ s@$q@$out{error_file}@ } if ($has_error) { unless ($last_was_error) { $logline .= ""; $next_err++; $logline .= "NEXT "; } $logline .= "$line"; $last_was_error = 1; } elsif ($has_warning) { $logline = "$line"; } else { $logline = $line; $last_was_error = 0; } &push_log_line($logline); } sub push_log_line { my( $line ) = $_[0]; if( $fulltext ){ logprint($line); return; } if( $log_line > $log_errors[$cur_error] ){ $cur_error++; } if( $log_line >= $log_errors[$cur_error] - $LINES_BEFORE_ERROR ){ if( $log_skip != 0 ){ logprint("\n Skipping $log_skip Lines...\n\n"); $log_skip = 0; } logprint($line); } else { $log_skip++; } $log_line++; } sub logprint { my $line = $_[0]; print $line; print BRIEFFILE $line if not $fulltext; }