Merge pull request #893 from grahamc/fake-channel-nested

Test the fake derivations channel, asserting nested packages are properly represented.
This commit is contained in:
Graham Christensen
2021-03-24 17:56:55 -04:00
committed by GitHub
7 changed files with 291 additions and 20 deletions

View File

@ -0,0 +1,56 @@
package Hydra::Helper::AttributeSet;
use strict;
use warnings;
sub new {
my ($self) = @_;
return bless { "paths" => [] }, $self;
}
sub registerValue {
my ($self, $attributePath) = @_;
my @pathParts = splitPath($attributePath);
pop(@pathParts);
if (scalar(@pathParts) == 0) {
return;
}
my $lineage = "";
for my $pathPart (@pathParts) {
$lineage = $self->registerChild($lineage, $pathPart);
}
}
sub registerChild {
my ($self, $parent, $attributePath) = @_;
if ($parent ne "") {
$parent .= "."
}
my $name = $parent . $attributePath;
if (!grep { $_ eq $name} @{$self->{"paths"}}) {
push(@{$self->{"paths"}}, $name);
}
return $name;
}
sub splitPath {
my ($s) = @_;
if ($s eq "") {
return ('')
}
return split(/\./, $s, -1);
}
sub enumerate {
my ($self) = @_;
my @paths = sort { length($a) <=> length($b) } @{$self->{"paths"}};
return wantarray ? @paths : \@paths;
}
1;

View File

@ -0,0 +1,21 @@
package Hydra::Helper::Escape;
use strict;
use base qw(Exporter);
use Hydra::Helper::AttributeSet;
our @EXPORT = qw(escapeString escapeAttributePath);
sub escapeString {
my ($s) = @_;
$s =~ s|\\|\\\\|g;
$s =~ s|\"|\\\"|g;
$s =~ s|\$|\\\$|g;
return "\"" . $s . "\"";
}
sub escapeAttributePath {
my ($s) = @_;
return join ".", map { escapeString($_) } Hydra::Helper::AttributeSet::splitPath($s);
}

View File

@ -3,18 +3,12 @@ package Hydra::View::NixExprs;
use strict;
use base qw/Catalyst::View/;
use Hydra::Helper::Nix;
use Hydra::Helper::Escape;
use Hydra::Helper::AttributeSet;
use Archive::Tar;
use IO::Compress::Bzip2 qw(bzip2);
use Encode;
sub escape {
my ($s) = @_;
$s =~ s|\\|\\\\|g;
$s =~ s|\"|\\\"|g;
$s =~ s|\$|\\\$|g;
return "\"" . $s . "\"";
}
use Data::Dumper;
sub process {
@ -62,33 +56,38 @@ EOF
my $first = 1;
foreach my $system (keys %perSystem) {
$res .= "else " if !$first;
$res .= "if system == ${\escape $system} then {\n\n";
$res .= "if system == ${\escapeString $system} then {\n\n";
my $attrsets = Hydra::Helper::AttributeSet->new();
foreach my $job (keys %{$perSystem{$system}}) {
my $pkg = $perSystem{$system}->{$job};
my $build = $pkg->{build};
$res .= " # Hydra build ${\$build->id}\n";
my $attr = $build->get_column('job');
$attr =~ s/\./-/g;
$res .= " ${\escape $attr} = (mkFakeDerivation {\n";
$attrsets->registerValue($attr);
$res .= " # Hydra build ${\$build->id}\n";
$res .= " ${\escapeAttributePath $attr} = (mkFakeDerivation {\n";
$res .= " type = \"derivation\";\n";
$res .= " name = ${\escape ($build->get_column('releasename') or $build->nixname)};\n";
$res .= " system = ${\escape $build->system};\n";
$res .= " name = ${\escapeString ($build->get_column('releasename') or $build->nixname)};\n";
$res .= " system = ${\escapeString $build->system};\n";
$res .= " meta = {\n";
$res .= " description = ${\escape $build->description};\n"
$res .= " description = ${\escapeString $build->description};\n"
if $build->description;
$res .= " license = ${\escape $build->license};\n"
$res .= " license = ${\escapeString $build->license};\n"
if $build->license;
$res .= " maintainers = ${\escape $build->maintainers};\n"
$res .= " maintainers = ${\escapeString $build->maintainers};\n"
if $build->maintainers;
$res .= " };\n";
$res .= " } {\n";
my @outputNames = sort (keys %{$pkg->{outputs}});
$res .= " ${\escape $_} = ${\escape $pkg->{outputs}->{$_}};\n" foreach @outputNames;
$res .= " ${\escapeString $_} = ${\escapeString $pkg->{outputs}->{$_}};\n" foreach @outputNames;
my $out = defined $pkg->{outputs}->{"out"} ? "out" : $outputNames[0];
$res .= " }).$out;\n\n";
}
for my $attrset ($attrsets->enumerate()) {
$res .= " ${\escapeAttributePath $attrset}.recurseForDerivations = true;\n\n";
}
$res .= "}\n\n";
$first = 0;
}