diff --git a/deps.nix b/deps.nix index f9caefb7..567e3e9c 100644 --- a/deps.nix +++ b/deps.nix @@ -19,5 +19,7 @@ with pkgs; perlPackages.EmailSimpleCreator perlPackages.TextTable perlPackages.NetTwitterLite + perlPackages.PadWalker + perlPackages.DataDump ] diff --git a/src/lib/Hydra/Controller/Jobset.pm b/src/lib/Hydra/Controller/Jobset.pm index 467cc30a..2be8b01f 100644 --- a/src/lib/Hydra/Controller/Jobset.pm +++ b/src/lib/Hydra/Controller/Jobset.pm @@ -120,7 +120,7 @@ sub checkInput { error($c, "Invalid input type: $inputType") unless $inputType eq "svn" || $inputType eq "cvs" || $inputType eq "tarball" || $inputType eq "string" || $inputType eq "path" || $inputType eq "boolean" || - $inputType eq "git" || $inputType eq "build"; + $inputType eq "git" || $inputType eq "build" || $inputType eq "sysbuild" ; return ($inputName, $inputType); } diff --git a/src/lib/Hydra/Helper/AddBuilds.pm b/src/lib/Hydra/Helper/AddBuilds.pm index 0176fbde..5b2d1039 100644 --- a/src/lib/Hydra/Helper/AddBuilds.pm +++ b/src/lib/Hydra/Helper/AddBuilds.pm @@ -215,6 +215,48 @@ sub fetchInputBuild { }; } +sub fetchInputSystemBuild { + my ($db, $project, $jobset, $name, $type, $value) = @_; + + my ($projectName, $jobsetName, $jobName, $attrs) = parseJobName($value); + $projectName ||= $project->name; + $jobsetName ||= $jobset->name; + + my @latestBuilds = $db->resultset('LatestSucceededForJob') + ->search({}, {bind => [$projectName, $jobsetName, $jobName]}); + + my @validBuilds = (); + foreach my $build (@latestBuilds) { + if(isValidPath($build->outpath)) { + push(@validBuilds,$build); + } + } + + 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->resultInfo->releasename or $prevBuild->nixname); + my $version = $2 if $relName =~ /^($pkgNameRE)-($versionRE)$/; + + my $input = + { type => "sysbuild" + , storePath => $prevBuild->outpath + , id => $prevBuild->id + , version => $version + , system => $prevBuild->system + }; + push(@inputs, $input); + } + return @inputs; +} + sub fetchInputGit { my ($db, $project, $jobset, $name, $type, $value) = @_; @@ -318,6 +360,9 @@ sub fetchInput { elsif ($type eq "build") { return fetchInputBuild($db, $project, $jobset, $name, $type, $value); } + elsif ($type eq "sysbuild") { + return fetchInputSystemBuild($db, $project, $jobset, $name, $type, $value); + } elsif ($type eq "git") { return fetchInputGit($db, $project, $jobset, $name, $type, $value); } @@ -351,7 +396,7 @@ sub inputsToArgs { when ("boolean") { push @res, "--arg", $input, $alt->{value}; } - when (["svn", "path", "build", "git", "cvs"]) { + when (["svn", "path", "build", "git", "cvs", "sysbuild"]) { push @res, "--arg", $input, ( "{ outPath = builtins.storePath " . $alt->{storePath} . "" . (defined $alt->{revision} ? "; rev = \"" . $alt->{revision} . "\"" : "") . @@ -397,6 +442,21 @@ sub evalJobs { SuppressEmpty => '') or die "cannot parse XML output"; + my @filteredJobs = (); + foreach my $job (@{$jobs->{job}}) { + my $validJob = 1; + foreach my $arg (@{$job->{arg}}) { + my $input = $inputInfo->{$arg->{name}}->[$arg->{altnr}] ; + if($input->{type} eq "sysbuild" && ! ($input->{system} eq $job->{system}) ) { + $validJob = 0 ; + } + } + if($validJob) { + push(@filteredJobs, $job); + } + } + $jobs->{job} = \@filteredJobs; + return ($jobs, $nixExprInput); } diff --git a/src/root/build.tt b/src/root/build.tt index 9f9366d7..e9de3dd1 100644 --- a/src/root/build.tt +++ b/src/root/build.tt @@ -255,7 +255,7 @@