* Fix getBuildLog for bzip2'd files.

This commit is contained in:
Rob Vermaas 2012-06-26 08:04:35 +02:00
parent 2aa52131ac
commit 0701cd0da8

View file

@ -16,7 +16,7 @@ use File::Temp;
our @ISA = qw(Exporter);
our @EXPORT = qw(
fetchInput evalJobs checkBuild inputsToArgs captureStdoutStderr
fetchInput evalJobs checkBuild inputsToArgs captureStdoutStderr
getReleaseName getBuildLog addBuildProducts restartBuild scmPath
getPrevJobsetEval
);
@ -30,7 +30,10 @@ sub scmPath {
sub getBuildLog {
my ($drvPath) = @_;
my $logPath = ($ENV{NIX_LOG_DIR} || "/nix/var/log/nix"). "/drvs/" . basename $drvPath;
return -e $logPath ? $logPath : undef;
return $logPath if -e $logPath;
$logPath = "$logPath.bz2";
return $logPath if -e $logPath;
return undef;
}
@ -44,7 +47,7 @@ sub getStorePathHash {
$hash = `nix-hash --to-base16 --type sha256 $hash`
or die "cannot convert hash";
chomp $hash;
return $hash;
return $hash;
}
@ -226,7 +229,7 @@ sub fetchInputSVN {
});
}
return
return
{ uri => $uri
, storePath => $storePath
, sha256hash => $sha256
@ -261,8 +264,8 @@ sub fetchInputBuild {
my $relName = ($prevBuild->releasename or $prevBuild->nixname);
my $version = $2 if $relName =~ /^($pkgNameRE)-($versionRE)$/;
return
return
{ storePath => $prevBuild->outpath
, id => $prevBuild->id
, version => $version
@ -284,21 +287,21 @@ sub fetchInputSystemBuild {
foreach my $build (@latestBuilds) {
push(@validBuilds, $build) if isValidPath($build->outpath);
}
if (scalar(@validBuilds) == 0) {
print STDERR "input `", $name, "': no previous build available\n";
return undef;
}
my @inputs = ();
foreach my $prevBuild (@validBuilds) {
my $pkgNameRE = "(?:(?:[A-Za-z0-9]|(?:-[^0-9]))+)";
my $versionRE = "(?:[A-Za-z0-9\.\-]+)";
my $relName = ($prevBuild->releasename or $prevBuild->nixname);
my $version = $2 if $relName =~ /^($pkgNameRE)-($versionRE)$/;
my $input =
{ storePath => $prevBuild->outpath
, id => $prevBuild->id
@ -307,8 +310,8 @@ sub fetchInputSystemBuild {
};
push(@inputs, $input);
}
return @inputs;
return @inputs;
}
@ -410,7 +413,7 @@ sub fetchInputGit {
die "Cannot check out Git repository branch '$branch' at `$uri':\n$stderr" unless $res;
($sha256, $storePath) = split ' ', $stdout;
txn_do($db, sub {
$db->resultset('CachedGitInputs')->update_or_create(
{ uri => $uri
@ -485,13 +488,13 @@ sub fetchInputBazaar {
$storePath = $cachedInput->storepath;
$sha256 = $cachedInput->sha256hash;
} else {
# Then download this revision into the store.
print STDERR "checking out Bazaar input ", $name, " from $uri revision $revision\n";
$ENV{"NIX_HASH_ALGO"} = "sha256";
$ENV{"PRINT_PATH"} = "1";
$ENV{"NIX_PREFETCH_BZR_LEAVE_DOT_BZR"} = "$checkout";
(my $res, $stdout, $stderr) = captureStdoutStderr(600,
("nix-prefetch-bzr", $clonePath, $revision));
die "Cannot check out Bazaar branch `$uri':\n$stderr" unless $res;
@ -508,7 +511,7 @@ sub fetchInputBazaar {
});
}
return
return
{ uri => $uri
, storePath => $storePath
, sha256hash => $sha256
@ -516,10 +519,10 @@ sub fetchInputBazaar {
};
}
sub fetchInputHg {
my ($db, $project, $jobset, $name, $value) = @_;
(my $uri, my $id) = split ' ', $value;
$id = defined $id ? $id : "default";
@ -546,7 +549,7 @@ sub fetchInputHg {
die "Error getting branch and revision of $id from `$uri':\n$stderr" unless $res1;
my ($revision, $revCount, $branch) = split ' ', $stdout;
my $storePath;
my $sha256;
(my $cachedInput) = $db->resultset('CachedHgInputs')->search(
@ -559,7 +562,7 @@ sub fetchInputHg {
print STDERR "checking out Mercurial input from $uri $branch revision $revision\n";
$ENV{"NIX_HASH_ALGO"} = "sha256";
$ENV{"PRINT_PATH"} = "1";
(my $res, $stdout, $stderr) = captureStdoutStderr(600,
("nix-prefetch-hg", $clonePath, $revision));
die "Cannot check out Mercurial repository `$uri':\n$stderr" unless $res;
@ -577,7 +580,7 @@ sub fetchInputHg {
});
}
return
return
{ uri => $uri
, branch => $branch
, storePath => $storePath
@ -618,20 +621,20 @@ sub fetchInput {
}
elsif ($type eq "bzr-checkout") {
push @inputs, fetchInputBazaar($db, $project, $jobset, $name, $value, 1);
}
}
elsif ($type eq "string") {
die unless defined $value;
push @inputs, { value => $value };
}
}
elsif ($type eq "boolean") {
die unless defined $value && ($value eq "true" || $value eq "false");
push @inputs, { value => $value };
}
}
else {
die "Input `" . $name . "' has unknown type `$type'.";
}
foreach my $input (@inputs) {
foreach my $input (@inputs) {
$input->{type} = $type if defined $input;
}
@ -645,7 +648,7 @@ sub inputsToArgs {
foreach my $input (keys %{$inputInfo}) {
push @res, "-I", "$input=$inputInfo->{$input}->[0]->{storePath}"
if scalar @{$inputInfo->{$input}} == 1
if scalar @{$inputInfo->{$input}} == 1
&& defined $inputInfo->{$input}->[0]->{storePath};
foreach my $alt (@{$inputInfo->{$input}}) {
given ($alt->{type}) {
@ -713,7 +716,7 @@ sub evalJobs {
die "Multiple alternatives for the input containing the Nix expression are not supported.\n"
if scalar @{$inputInfo->{$nixExprInputName}} != 1;
my $nixExprFullPath = $nixExprInput->{storePath} . "/" . $nixExprPath;
(my $res, my $jobsXml, my $stderr) = captureStdoutStderr(10800,
("hydra-eval-jobs", $nixExprFullPath, "--gc-roots-dir", getGCRootsDir, "-j", 1, inputsToArgs($inputInfo)));
die "Cannot evaluate the Nix expression containing the jobs:\n$stderr" unless $res;
@ -741,7 +744,7 @@ sub evalJobs {
}
}
$jobs->{job} = \@filteredJobs;
return ($jobs, $nixExprInput);
}
@ -769,18 +772,18 @@ sub addBuildProducts {
if (-f $path) {
my $st = stat($path) or die "cannot stat $path: $!";
$fileSize = $st->size;
$sha1 = `nix-hash --flat --type sha1 $path`
or die "cannot hash $path: $?";;
chomp $sha1;
$sha256 = `nix-hash --flat --type sha256 $path`
or die "cannot hash $path: $?";;
chomp $sha256;
}
my $name = $path eq $outPath ? "" : basename $path;
$db->resultset('BuildProducts')->create(
{ build => $build->id
, productnr => $productnr++
@ -816,7 +819,7 @@ sub addBuildProducts {
sub getPrevJobsetEval {
my ($db, $jobset, $hasNewBuilds) = @_;
my ($prevEval) = $jobset->jobsetevals(
($hasNewBuilds ? { hasnewbuilds => 1 } : { }),
($hasNewBuilds ? { hasnewbuilds => 1 } : { }),
{ order_by => "id DESC", rows => 1 });
return $prevEval;
}
@ -863,7 +866,7 @@ sub checkBuild {
# semantically unnecessary (because they're implied by
# the eval), but they give a factor 1000 speedup on
# the Nixpkgs jobset with PostgreSQL.
{ project => $project->name, jobset => $jobset->name, job => $job->name, outPath => $outPath },
{ project => $project->name, jobset => $jobset->name, job => $job->name, outPath => $outPath },
{ rows => 1, columns => ['id'] });
if (defined $prevBuild) {
print STDERR " already scheduled/built as build ", $prevBuild->id, "\n";
@ -879,18 +882,18 @@ sub checkBuild {
print STDERR " already scheduled as build ", $prev, "\n";
return;
}
my $time = time();
# Nope, so add it.
my %extraFlags;
if (isValidPath($outPath)) {
%extraFlags =
( finished => 1
( finished => 1
, iscachedbuild => 1
, buildstatus => -f "$outPath/nix-support/failed" ? 6 : 0
, starttime => $time
, stoptime => $time
, starttime => $time
, stoptime => $time
, logfile => getBuildLog($drvPath)
, errormsg => ""
, releasename => getReleaseName($outPath)
@ -898,9 +901,9 @@ sub checkBuild {
} else {
%extraFlags = ( finished => 0 );
}
$build = $job->builds->create(
{ timestamp => $time
{ timestamp => $time
, description => $buildInfo->{description}
, longdescription => $buildInfo->{longDescription}
, license => $buildInfo->{license}
@ -922,7 +925,7 @@ sub checkBuild {
$buildIds->{$build->id} = 1;
$$jobOutPathMap{$job->name . "\t" . $outPath} = $build->id;
if ($build->iscachedbuild) {
print STDERR " marked as cached build ", $build->id, "\n";
addBuildProducts($db, $build);
@ -938,7 +941,7 @@ sub checkBuild {
# the Nix search path (through the -I flag). We currently
# have no way to see which ones were actually used.
$inputs{$name} = $inputInfo->{$name}->[0]
if scalar @{$inputInfo->{$name}} == 1
if scalar @{$inputInfo->{$name}} == 1
&& defined $inputInfo->{$name}->[0]->{storePath};
}
foreach my $arg (@{$buildInfo->{arg}}) {