From 20582e9ae3c6eb14212a285489c1a573117d046c Mon Sep 17 00:00:00 2001 From: Eelco Dolstra Date: Wed, 19 Sep 2012 17:33:42 -0400 Subject: [PATCH] Support xz compression in the download-using-manifests substituter --- perl/lib/Nix/Manifest.pm | 18 ++++++++++++------ scripts/download-using-manifests.pl.in | 10 ++++++++-- scripts/nix-push.in | 1 + 3 files changed, 21 insertions(+), 8 deletions(-) diff --git a/perl/lib/Nix/Manifest.pm b/perl/lib/Nix/Manifest.pm index 7a7263c5a..50f7777e4 100644 --- a/perl/lib/Nix/Manifest.pm +++ b/perl/lib/Nix/Manifest.pm @@ -68,7 +68,7 @@ sub readManifest_ { my $manifestVersion = 2; my ($storePath, $url, $hash, $size, $basePath, $baseHash, $patchType); - my ($narHash, $narSize, $references, $deriver, $copyFrom, $system); + my ($narHash, $narSize, $references, $deriver, $copyFrom, $system, $compressionType); while () { chomp; @@ -93,6 +93,7 @@ sub readManifest_ { undef $system; $references = ""; $deriver = ""; + $compressionType = "bzip2"; } } else { @@ -107,6 +108,7 @@ sub readManifest_ { , references => $references , deriver => $deriver , system => $system + , compressionType => $compressionType }); } @@ -125,6 +127,7 @@ sub readManifest_ { elsif (/^\s*CopyFrom:\s*(\/\S+)\s*$/) { $copyFrom = $1; } elsif (/^\s*Hash:\s*(\S+)\s*$/) { $hash = $1; } elsif (/^\s*URL:\s*(\S+)\s*$/) { $url = $1; } + elsif (/^\s*Compression:\s*(\S+)\s*$/) { $compressionType = $1; } elsif (/^\s*Size:\s*(\d+)\s*$/) { $size = $1; } elsif (/^\s*BasePath:\s*(\/\S+)\s*$/) { $basePath = $1; } elsif (/^\s*BaseHash:\s*(\S+)\s*$/) { $baseHash = $1; } @@ -172,6 +175,7 @@ sub writeManifest { print MANIFEST "{\n"; print MANIFEST " StorePath: $storePath\n"; print MANIFEST " NarURL: $narFile->{url}\n"; + print MANIFEST " Compression: $narFile->{compressionType}\n"; print MANIFEST " Hash: $narFile->{hash}\n" if defined $narFile->{hash}; print MANIFEST " Size: $narFile->{size}\n" if defined $narFile->{size}; print MANIFEST " NarHash: $narFile->{narHash}\n"; @@ -225,7 +229,8 @@ sub updateManifestDB { mkpath($manifestDir); - my $dbPath = "$manifestDir/cache.sqlite"; + unlink "$manifestDir/cache.sqlite"; # remove obsolete cache + my $dbPath = "$manifestDir/cache-v2.sqlite"; # Open/create the database. our $dbh = DBI->connect("dbi:SQLite:dbname=$dbPath", "", "") @@ -252,6 +257,7 @@ EOF manifest integer not null, storePath text not null, url text not null, + compressionType text not null, hash text, size integer, narHash text, @@ -292,8 +298,8 @@ EOF flock(MAINLOCK, LOCK_EX) or die; our $insertNAR = $dbh->prepare( - "insert into NARs(manifest, storePath, url, hash, size, narHash, " . - "narSize, refs, deriver, system) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)") or die; + "insert into NARs(manifest, storePath, url, compressionType, hash, size, narHash, " . + "narSize, refs, deriver, system) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)") or die; our $insertPatch = $dbh->prepare( "insert into Patches(manifest, storePath, basePath, baseHash, url, hash, " . @@ -327,8 +333,8 @@ EOF sub addNARToDB { my ($storePath, $narFile) = @_; $insertNAR->execute( - $id, $storePath, $narFile->{url}, $narFile->{hash}, $narFile->{size}, - $narFile->{narHash}, $narFile->{narSize}, $narFile->{references}, + $id, $storePath, $narFile->{url}, $narFile->{compressionType}, $narFile->{hash}, + $narFile->{size}, $narFile->{narHash}, $narFile->{narSize}, $narFile->{references}, $narFile->{deriver}, $narFile->{system}); }; diff --git a/scripts/download-using-manifests.pl.in b/scripts/download-using-manifests.pl.in index 24f7c98e0..7a76076d7 100755 --- a/scripts/download-using-manifests.pl.in +++ b/scripts/download-using-manifests.pl.in @@ -339,13 +339,19 @@ while (scalar @path > 0) { print LOGFILE "$$ narfile $narFile->{url} $size $v\n"; Nix::Utils::checkURL $narFile->{url}; + + my $decompressor = + $narFile->{compressionType} eq "bzip2" ? "$Nix::Config::bzip2 -d" : + $narFile->{compressionType} eq "xz" ? "$Nix::Config::xz -d" : + die "unknown compression type `$narFile->{compressionType}'"; + if ($curStep < $maxStep) { # The archive will be used a base to a patch. - system("$curl '$narFile->{url}' | $Nix::Config::bzip2 -d > $tmpNar") == 0 + system("$curl '$narFile->{url}' | $decompressor > $tmpNar") == 0 or die "cannot download and unpack `$narFile->{url}' into `$v'\n"; } else { # Unpack the archive into the target path. - system("$curl '$narFile->{url}' | $Nix::Config::bzip2 -d | $Nix::Config::binDir/nix-store --restore '$v'") == 0 + system("$curl '$narFile->{url}' | $decompressor | $Nix::Config::binDir/nix-store --restore '$v'") == 0 or die "cannot download and unpack `$narFile->{url}' into `$v'\n"; } diff --git a/scripts/nix-push.in b/scripts/nix-push.in index 1edd8e773..00d03c3c1 100755 --- a/scripts/nix-push.in +++ b/scripts/nix-push.in @@ -227,6 +227,7 @@ for (my $n = 0; $n < scalar @storePaths; $n++) { { url => "$archivesURL/$narName" , hash => "sha256:$compressedHash" , size => $compressedSize + , compressionType => $compressionType , narHash => "$narHash" , narSize => $narSize , references => join(" ", @{$refs})