Test the fake derivations channel, asserting nested packages are properly represented.
[?]
Mar 17, 2021, 3:20 PM
MQLCUSZLZWVUI6OE4TVYRJWEGBF3GF4MWWSZGF4WLC35TIOKE3IACDependencies
- [2]
VMBIK4GUNixExprs.pm: encode default.nix as utf-8 to fix missing chars/data. (#455) - [3]
S2KNQCPBNixExprs: extract the `escape` function and test it - [4]
UZENK33P* Generate a .tar.bz2 file for the channel Nix expression, since - [5]
I42G2Z7P* Escape string literals.[ - [6]
L5Z6CN7MIn Hydra channels, show only packages matching the user's system type - [7]
PDZXZZPZShut up some Perl 5.20 warnings - [8]
FG4JZPWSHandle builds with multiple outputs correctly in Hydra channels - [9]
LVJKRTIK* Generate a Nix expression for the channel. - [*]
2JJP7673tests: move to t, allow `yath test` from root
Change contents
- edit in src/lib/Hydra/View/NixExprs.pm at line 7
use Hydra::Helper::AttributeSet; - replacement in src/lib/Hydra/View/NixExprs.pm at line 11
use Data::Dumper; - replacement in src/lib/Hydra/View/NixExprs.pm at line 60
my $attrsets = Hydra::Helper::AttributeSet->new(); - edit in src/lib/Hydra/View/NixExprs.pm at line 64
$res .= " # Hydra build ${\$build->id}\n"; - replacement in src/lib/Hydra/View/NixExprs.pm at line 65
$attr =~ s/\./-/g;$res .= " ${\escapeString $attr} = (mkFakeDerivation {\n";$attrsets->registerValue($attr);$res .= " # Hydra build ${\$build->id}\n";$res .= " ${\escapeAttributePath $attr} = (mkFakeDerivation {\n"; - edit in src/lib/Hydra/View/NixExprs.pm at line 85
}for my $attrset ($attrsets->enumerate()) {$res .= " ${\escapeAttributePath $attrset}.recurseForDerivations = true;\n\n"; - file addition: Controller[11.697]
- file addition: Jobset[0.451]
- file addition: channel.t[0.475]
use feature 'unicode_strings';use strict;use Setup;use IO::Uncompress::Bunzip2 qw(bunzip2);use Archive::Tar;use JSON qw(decode_json);use Data::Dumper;my %ctx = test_init();require Hydra::Schema;require Hydra::Model::DB;require Hydra::Helper::Nix;use Test2::V0;require Catalyst::Test;Catalyst::Test->import('Hydra');my $db = Hydra::Model::DB->new;hydra_setup($db);my $project = $db->resultset('Projects')->create({name => "tests", displayname => "", owner => "root"});# Most basic test case, no parametersmy $jobset = createBaseJobset("nested-attributes", "nested-attributes.nix", $ctx{jobsdir});ok(evalSucceeds($jobset));is(nrQueuedBuildsForJobset($jobset), 4);for my $build (queuedBuildsForJobset($jobset)) {ok(runBuild($build), "Build '".$build->job."' should exit with code 0");my $newbuild = $db->resultset('Builds')->find($build->id);is($newbuild->finished, 1, "Build '".$build->job."' should be finished.");is($newbuild->buildstatus, 0, "Build '".$build->job."' should have buildstatus 0.");}my $compressed = get('/jobset/tests/nested-attributes/channel/latest/nixexprs.tar.bz2');my $tarcontent;bunzip2(\$compressed => \$tarcontent);open(my $tarfh, "<", \$tarcontent);my $tar = Archive::Tar->new($tarfh);my $defaultnix = $ctx{"tmpdir"} . "/channel-default.nix";$tar->extract_file("channel/default.nix", $defaultnix);print STDERR $tar->get_content("channel/default.nix");(my $status, my $stdout, my $stderr) = Hydra::Helper::Nix::captureStdoutStderr(5, "nix-env", "--json", "--query", "--available", "--attr-path", "--file", $defaultnix);is($stderr, "", "Stderr should be empty");is($status, 0, "Querying the packages should succeed");my $packages = decode_json($stdout);my $keys = [sort keys %$packages];is($keys, ["packageset-nested","packageset.deeper.deeper.nested","packageset.nested","packageset.nested2",]);is($packages->{"packageset-nested"}->{"name"}, "actually-top-level");is($packages->{"packageset.nested"}->{"name"}, "actually-nested");done_testing; - file addition: nested-attributes.nix[11.1263]
with import ./config.nix;rec {# Given a jobset containing a package set named X with an interior member Y,# expose the interior member Y with the name X-Y. This is to exercise a bug# in the NixExprs view's generated Nix expression which flattens the# package set namespace from `X.Y` to `X-Y`. If the bug is present, the# resulting expression incorrectly renders two `X-Y` packages.packageset = {recurseForDerivations = true;deeper = {recurseForDerivations = true;deeper = {recurseForDerivations = true;nested = mkDerivation {name = "much-too-deep";builder = ./empty-dir-builder.sh;};};};nested = mkDerivation {name = "actually-nested";builder = ./empty-dir-builder.sh;};nested2 = mkDerivation {name = "actually-nested2";builder = ./empty-dir-builder.sh;};};packageset-nested = mkDerivation {name = "actually-top-level";builder = ./empty-dir-builder.sh;};}