7a9f1afb15
during rebuilds.
141 lines
3.5 KiB
Perl
Executable File
141 lines
3.5 KiB
Perl
Executable File
#!/usr/bin/perl
|
|
|
|
# $OpenBSD: portslogger,v 1.14 2007/08/25 07:56:04 espie Exp $
|
|
# Copyright (c) 2001 Marc Espie. All rights reserved.
|
|
# Redistribution and use in source and binary forms, with or without
|
|
# modification, are permitted provided that the following conditions
|
|
# are met:
|
|
# 1. Redistributions of code must retain the above copyright
|
|
# notice, this list of conditions and the following disclaimer.
|
|
# 2. Neither the name of OpenBSD nor the names of its contributors
|
|
# may be used to endorse or promote products derived from this software
|
|
# without specific prior written permission.
|
|
#
|
|
# THIS SOFTWARE IS PROVIDED BY ITS AUTHOR AND THE OpenBSD project ``AS IS'' AND
|
|
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
# ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
|
# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
|
# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
|
# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
|
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
|
# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
|
# SUCH DAMAGE.
|
|
|
|
# This critter recognizes context switch changes in the ports tree
|
|
# and logs its output accordingly, as a kind of `super-tee'
|
|
|
|
{
|
|
package Logger;
|
|
@ISA=qw(IO::File);
|
|
|
|
use File::Path;
|
|
use IO::File;
|
|
use File::Temp qw/tempfile/;
|
|
|
|
our $directory;
|
|
our %temps;
|
|
|
|
|
|
sub setdir
|
|
{
|
|
$directory = shift;
|
|
mkpath $directory;
|
|
die "No logging directory" unless -d $directory;
|
|
}
|
|
|
|
sub new
|
|
{
|
|
my $class = shift;
|
|
my $name = shift;
|
|
$name = "$directory/$name.log";
|
|
my $self = IO::File::new($class, $name, '>>');
|
|
if (!$self) {
|
|
if (defined $temps{$name}) {
|
|
$self = IO::File::new($class, $temps{$name}, '>>');
|
|
} else {
|
|
($self, $temps{$name}) = tempfile(SUFFIX => '.log') or
|
|
die "Can't create any logfile";
|
|
print STDERR "*** Couldn't open $name, \n";
|
|
print STDERR "*** using ".$temps{$name}." instead\n";
|
|
bless $self, $class;
|
|
}
|
|
}
|
|
$self->print("+++ ", `date`);
|
|
$self->autoflush(1);
|
|
return $self;
|
|
}
|
|
|
|
sub close
|
|
{
|
|
my $self = shift;
|
|
print $self "--- ", `date`;
|
|
$self->SUPER::close();
|
|
}
|
|
|
|
sub DESTROY
|
|
{
|
|
my $self = shift;
|
|
$self->close();
|
|
}
|
|
}
|
|
|
|
if (@ARGV < 1) {
|
|
print STDERR "Usage: $0 directory\n";
|
|
exit 1;
|
|
}
|
|
|
|
Logger::setdir(shift);
|
|
|
|
my $logfile = undef;
|
|
my $ncontext = undef;
|
|
|
|
my $context;
|
|
|
|
while (<>) {
|
|
if (m/^\=\=\=\>\s+
|
|
(?:
|
|
(?: Extracting|
|
|
Applying\ distribution\ patches|
|
|
Patching|
|
|
Configuring|
|
|
Building|
|
|
Faking\ installation|
|
|
Building\ package|
|
|
Deinstalling|
|
|
Cleaning|
|
|
Dist\ cleaning|
|
|
Checking\ files|
|
|
Regression\ check|
|
|
Updating\ plist|
|
|
Updating|
|
|
Registering\ installation)\s+for\s+(.*)|
|
|
Returning\ to\ build\ of\s+(.*)|
|
|
Installing\s+(.*?)\s+from)
|
|
/ox) {
|
|
$ncontext = "$1$2$3"; # XXX only one alternative matches
|
|
chomp $ncontext;
|
|
# register to `master' context.
|
|
$ncontext=$1 if $ncontext =~ m/^.*\[(.*?)\]$/;
|
|
if ($ncontext ne $context) {
|
|
$context = $ncontext;
|
|
$logfile = new Logger $context;
|
|
}
|
|
} elsif (m/^\=\=\=\> Exiting\s+(.*)\s+with an error$/) {
|
|
$ncontext = $1;
|
|
if ($ncontext eq $context) {
|
|
undef $context;
|
|
}
|
|
}
|
|
unless (defined $context) {
|
|
$context = default;
|
|
$logfile = new Logger 'default';
|
|
}
|
|
# zap fetch progress bar
|
|
next if m/^\cM\s*\d+\%/;
|
|
$logfile->print($_);
|
|
print;
|
|
}
|
|
|