|  | #!/usr/bin/perl | 
|  |  | 
|  | # Copy log files from a GCC build for HTTP access. | 
|  | # Copyright (C) 2008, 2009 Free Software Foundation, Inc. | 
|  | # | 
|  | # This program is free software: you can redistribute it and/or modify | 
|  | # it under the terms of the GNU General Public License as published by | 
|  | # the Free Software Foundation, either version 3 of the License, or | 
|  | # (at your option) any later version. | 
|  | # | 
|  | # This program is distributed in the hope that it will be useful, | 
|  | # but WITHOUT ANY WARRANTY; without even the implied warranty of | 
|  | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | 
|  | # GNU General Public License for more details. | 
|  | # | 
|  | # You should have received a copy of the GNU General Public License | 
|  | # along with this program.  If not, see <http://www.gnu.org/licenses/>. | 
|  |  | 
|  | # INPUT: | 
|  | # mkindex.pl <srcdir> <destdir> <branchname> | 
|  |  | 
|  | # This script copies log files from a GCC build directory, compresses | 
|  | # and indexes them for web browser access.  It's aimed at having an | 
|  | # easy-to-access collection of files for analyzing regressions without | 
|  | # needing to run the build yourself.  Binary files (.o, executables) | 
|  | # are intentionally not included since usually if they are needed it's | 
|  | # better to just run a build, and because they take up a lot of space. | 
|  |  | 
|  | # 'srcdir' is the root directory of a GCC build (was $objdir in the build). | 
|  | # 'destdir' will be erased and replaced with the log files, and should be an | 
|  | #   absolute path. | 
|  | # 'branchname' is used only to produce the title of the index page, | 
|  | #   which will be named 'index.html'. | 
|  |  | 
|  | use warnings; | 
|  | use strict; | 
|  | use File::Path qw(mkpath rmtree); | 
|  | use File::Find qw(find); | 
|  |  | 
|  | if ($#ARGV != 2) { | 
|  | print "usage: $0 <srcdir> <destdir> <branchname>\n"; | 
|  | exit 1; | 
|  | } | 
|  |  | 
|  | my ($srcdir, $destdir, $branchname) = @ARGV; | 
|  | die "destdir is not absolute" unless ($destdir =~ m,^/,); | 
|  |  | 
|  | # Erase the destination. | 
|  | rmtree $destdir; | 
|  | mkdir $destdir or die "${destdir}: $!"; | 
|  |  | 
|  | # Copy and compress the files into the destination, and keep a list in @files. | 
|  | my @files = (); | 
|  | sub my_wanted { | 
|  | # Copy all files ending with .log or .sum. | 
|  | if (/\.(log|sum)$/ && -f) { | 
|  |  | 
|  | die unless (substr ($File::Find::dir,0,(length $srcdir)) eq $srcdir); | 
|  | my $dir = substr $File::Find::dir,(length $srcdir); | 
|  | $dir = substr $dir,1 unless ($dir eq ''); | 
|  | my $name = $_; | 
|  | $name = $dir . '/' . $_ if ($dir ne ''); | 
|  |  | 
|  | mkpath $destdir . '/' . $dir; | 
|  | # Compress the files.  Use .gzip instead of .gz for the | 
|  | # extension to avoid (broken) browser workarounds for broken | 
|  | # web servers. | 
|  | system ("gzip -c -q -9 $_ > $destdir/${name}.gzip") == 0 or exit 2; | 
|  |  | 
|  | # Write the (compressed) size consistently in Kbytes. | 
|  | my $size = -s $destdir .'/' . $name . '.gzip'; | 
|  | my $printable_size = (sprintf "%.0fK",$size / 1024); | 
|  |  | 
|  | push @files,[$name.'.gzip',$name,$printable_size]; | 
|  | } | 
|  | } | 
|  | find ({wanted => \&my_wanted}, $srcdir); | 
|  |  | 
|  | # Sort the list of files for the index. | 
|  | @files = sort {$a->[1] cmp $b->[1]} @files; | 
|  |  | 
|  | # Create the index. | 
|  | open INDEX,'>',$destdir . '/index.html' or die "${destdir}/index.html: $!"; | 
|  | # Use strict XHTML 1.0, and set charset to UTF-8. | 
|  | print INDEX <<EOF or die "writing index: $!"; | 
|  | <!DOCTYPE html | 
|  | PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" | 
|  | "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> | 
|  | <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> | 
|  | <head> | 
|  | <title>Log files for $branchname</title> | 
|  | <meta http-equiv="Content-Type" content="text/html;charset=utf-8" /> | 
|  | </head> | 
|  | <body> | 
|  | <h1>Log files for $branchname</h1> | 
|  | <table><tr><th>Name</th><th align='right'>Size</th></tr> | 
|  | EOF | 
|  | # The index will have two columns, filename (without .gzip) and | 
|  | # compressed size. | 
|  | foreach my $f (@files) { | 
|  | printf INDEX "<tr><td><a href=\"%s\">%s</a></td><td align=\'right\'>%s</td></tr>\n", | 
|  | $f->[0], $f->[1], $f->[2] or die "writing index: $!"; | 
|  | } | 
|  |  | 
|  | print INDEX "</table></body></html>\n" or die "writing index: $!"; | 
|  | close INDEX or die "writing index: $!"; | 
|  | exit 0; |