package Hydra::View::NixExprs; use strict; use base qw/Catalyst::View/; use Hydra::Helper::Nix; use Archive::Tar; use IO::Compress::Bzip2 qw(bzip2); sub escape { my ($s) = @_; $s =~ s|\\|\\\\|g; $s =~ s|\"|\\\"|g; $s =~ s|\$|\\\$|g; return "\"" . $s . "\""; } sub process { my ($self, $c) = @_; my %perSystem; foreach my $pkg (@{$c->stash->{nixPkgs}}) { my $build = $pkg->{build}; $perSystem{$build->system}->{$build->get_column('job')} = $pkg; } my $res = <{$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"; $res .= " type = \"derivation\";\n"; $res .= " name = ${\escape ($build->get_column('releasename') or $build->nixname)};\n"; $res .= " system = ${\escape $build->system};\n"; $res .= " meta = {\n"; $res .= " description = ${\escape $build->description};\n" if $build->description; $res .= " license = ${\escape $build->license};\n" if $build->license; $res .= " maintainers = ${\escape $build->maintainers};\n" if $build->maintainers; $res .= " };\n"; $res .= " } {\n"; my @outputNames = sort (keys $pkg->{outputs}); $res .= " ${\escape $_} = ${\escape $pkg->{outputs}->{$_}};\n" foreach @outputNames; my $out = defined $pkg->{outputs}->{"out"} ? "out" : $outputNames[0]; $res .= " }).$out;\n\n"; } $res .= "}\n\n"; $first = 0; } $res .= "else " if !$first; $res .= "{}\n"; my $tar = Archive::Tar->new; $tar->add_data("channel/channel-name", ($c->stash->{channelName} or "unnamed-channel"), {mtime => 1}); $tar->add_data("channel/default.nix", $res, {mtime => 1}); my $tardata = $tar->write; my $bzip2data; bzip2(\$tardata => \$bzip2data); $c->response->content_type('application/x-bzip2'); $c->response->body($bzip2data); return 1; } 1;