diff --git a/release.nix b/release.nix
index 2f69c7d8..b1c4c64c 100644
--- a/release.nix
+++ b/release.nix
@@ -82,8 +82,10 @@ let
''; # */
hydraPath = stdenv.lib.concatStringsSep ":" (map (p: "${p}/bin") [
- libxslt sqlite subversion nix coreutils
- gzip bzip2 gnused graphviz
+ libxslt sqlite subversion nix coreutils findutils
+ gzip bzip2 lzma gnutar unzip
+ gnused graphviz
+ rpm dpkg
]);
installPhase = ''
diff --git a/src/lib/Hydra/Controller/Build.pm b/src/lib/Hydra/Controller/Build.pm
index e6cddeb4..bcef22a8 100644
--- a/src/lib/Hydra/Controller/Build.pm
+++ b/src/lib/Hydra/Controller/Build.pm
@@ -90,7 +90,7 @@ sub showLog {
}
-sub download : Chained('build') PathPart('download') {
+sub download : Chained('build') PathPart {
my ($self, $c, $productnr, @path) = @_;
my $product = $c->stash->{build}->buildproducts->find({productnr => $productnr});
@@ -125,6 +125,60 @@ sub download : Chained('build') PathPart('download') {
}
+sub contents : Chained('build') PathPart {
+ my ($self, $c, $productnr, @path) = @_;
+
+ my $product = $c->stash->{build}->buildproducts->find({productnr => $productnr});
+ notFound($c, "Build doesn't have a product $productnr.") if !defined $product;
+
+ my $path = $product->path;
+
+ notFound($c, "Product $path has disappeared.") unless -e $path;
+
+ my $res;
+
+ if ($product->type eq "nix-build") {
+ $res = `cd $path && find . -print0 | xargs -0 ls -ld --`;
+ error($c, "`ls -lR' error: $?") if $? != 0;
+ }
+
+ elsif ($path =~ /\.rpm$/) {
+ $res = `rpm --query --info --package "$path"`;
+ error($c, "RPM error: $?") if $? != 0;
+ $res .= "===\n";
+ $res .= `rpm --query --list --verbose --package "$path"`;
+ error($c, "RPM error: $?") if $? != 0;
+ }
+
+ elsif ($path =~ /\.deb$/) {
+ $res = `dpkg-deb --info "$path"`;
+ error($c, "`dpkg-deb' error: $?") if $? != 0;
+ $res .= "===\n";
+ $res .= `dpkg-deb --contents "$path"`;
+ error($c, "`dpkg-deb' error: $?") if $? != 0;
+ }
+
+ elsif ($path =~ /\.tar(\.gz|\.bz2|\.lzma)?$/ ) {
+ $res = `tar tvfa "$path"`;
+ error($c, "`tar' error: $?") if $? != 0;
+ }
+
+ elsif ($path =~ /\.zip$/ ) {
+ $res = `unzip -v "$path"`;
+ error($c, "`unzip' error: $?") if $? != 0;
+ }
+
+ else {
+ error($c, "Unsupported file type.");
+ }
+
+ die unless $res;
+
+ $c->stash->{'plain'} = { data => $res };
+ $c->forward('Hydra::View::Plain');
+}
+
+
sub runtimedeps : Chained('build') PathPart('runtime-deps') {
my ($self, $c) = @_;
diff --git a/src/root/product-list.tt b/src/root/product-list.tt
index 5076a8b5..6b90c54a 100644
--- a/src/root/product-list.tt
+++ b/src/root/product-list.tt
@@ -10,6 +10,8 @@
_ (product.name ? "/" _ product.name : "")
_ (product.defaultpath ? "/" _ product.defaultpath : "") %]
+ [% contents = c.uri_for('/build' build.id 'contents' product.productnr) %]
+
[% SWITCH product.type %]
[% CASE "nix-build" %]
@@ -20,7 +22,7 @@
One-click install of Nix package [% build.nixname %]
- [help]
+ [help, contents]