diff options
Diffstat (limited to 'lib/SlackBuilder.pm')
-rw-r--r-- | lib/SlackBuilder.pm | 59 |
1 files changed, 48 insertions, 11 deletions
diff --git a/lib/SlackBuilder.pm b/lib/SlackBuilder.pm index bf792bf..6c0504d 100644 --- a/lib/SlackBuilder.pm +++ b/lib/SlackBuilder.pm @@ -6,6 +6,7 @@ use SlackBuild::Config; use SlackBuild::URI; use SlackBuild::Archive; use SlackBuild::Registry; +use SlackBuild::Registry::Record; use SlackBuild::Request; use SlackBuild::Rc; use SlackBuild::Counter; @@ -336,11 +337,6 @@ sub _runcap_diag { } $self->errno(E_EXEC); } - -sub _logfilename { - my $self = shift; - return File::Spec->catfile($self->logdir, $self->package_name . '.log'); -} sub _prepare { my $self = shift; @@ -487,6 +483,40 @@ sub parser_err { $self->${\$parser_err[$self->state]}($line); } +sub commit_log { + my ($self, $logfd) = @_; + my $init; + my @v = map { + my $r = SlackBuild::Registry::Record->split($_); + if ($r && (!$init || $r->package eq $self->package_name)) { + $init = 1; + $r + } + } $self->output_files; + my $r; + if (@v) { + $r = pop(@v); + } else { + $r = SlackBuild::Registry::Record->new( + $self->package_name, + version => $self->package_version || 'UNKNOWN', + build => $self->package_build, + arch => $self->arch); + } + my $logname = File::Spec->catfile($self->logdir, $r . '.log'); + unless (rename $logfd->filename, $logname) { + $self->logger->error("can't rename " + . $logfd->filename + . " to " + . $logname + . ": $!"); + $logname = $logfd->filename; + } + chmod 0666 & ~ umask(), $logname + or $self->logger->error("can't change file mode of $logname: $!"); + $self->logger->info("Log file: $logname"); +} + sub _build { my $self = shift; @@ -512,13 +542,16 @@ sub _build { $self->os_release('VERSION'), $self->arch)); - open(my $logfd, '>', $self->_logfilename) - or do { - $self->logger->fatal("can't create log file " . - $self->_logfilename . - ": $!"); - return $self->errno(E_FAIL); + my $logfd = try { + File::Temp->new(UNLINK => 0, + TEMPLATE => $self->package_name . ".XXXXXX", + DIR => $self->logdir, + SUFFIX => '.log'); + } catch { + $self->logger->fatal("can't create log file: ". (split /\n/)[0]); + undef; }; + return $self->errno(E_FAIL) unless $logfd; $self->state(ST_INIT); my $obj = new POSIX::Run::Capture( @@ -541,9 +574,13 @@ sub _build { if ($obj->run) { $self->_runcap_diag($obj); } else { + $self->commit_log($logfd); $self->logger->fatal("can't run docker: ".strerror($obj->errno)); return $self->errno(E_EXEC); } + + $self->commit_log($logfd); + return $self->errno(E_OK); } |