nix-push: Support generating a manifest again
This makes all the tests succeed. Woohoo!
This commit is contained in:
parent
50395b71a9
commit
67c6f3eded
6 changed files with 46 additions and 17 deletions
|
@ -8,31 +8,28 @@ use File::stat;
|
||||||
use File::Copy;
|
use File::Copy;
|
||||||
use Nix::Config;
|
use Nix::Config;
|
||||||
use Nix::Store;
|
use Nix::Store;
|
||||||
|
use Nix::Manifest;
|
||||||
my $hashAlgo = "sha256";
|
|
||||||
|
|
||||||
my $tmpDir = tempdir("nix-push.XXXXXX", CLEANUP => 1, TMPDIR => 1)
|
my $tmpDir = tempdir("nix-push.XXXXXX", CLEANUP => 1, TMPDIR => 1)
|
||||||
or die "cannot create a temporary directory";
|
or die "cannot create a temporary directory";
|
||||||
|
|
||||||
my $nixExpr = "$tmpDir/create-nars.nix";
|
my $nixExpr = "$tmpDir/create-nars.nix";
|
||||||
|
|
||||||
my $curl = "$Nix::Config::curl --fail --silent";
|
|
||||||
my $extraCurlFlags = ${ENV{'CURL_FLAGS'}};
|
|
||||||
$curl = "$curl $extraCurlFlags" if defined $extraCurlFlags;
|
|
||||||
|
|
||||||
|
|
||||||
# Parse the command line.
|
# Parse the command line.
|
||||||
my $compressionType = "xz";
|
my $compressionType = "xz";
|
||||||
my $force = 0;
|
my $force = 0;
|
||||||
my $destDir;
|
my $destDir;
|
||||||
|
my $writeManifest = 0;
|
||||||
|
my $archivesURL;
|
||||||
my @roots;
|
my @roots;
|
||||||
|
|
||||||
sub showSyntax {
|
sub showSyntax {
|
||||||
print STDERR <<EOF
|
print STDERR <<EOF
|
||||||
Usage: nix-push --dest DIR PATHS...
|
Usage: nix-push --dest DIR [--manifest] [--url-prefix URL] PATHS...
|
||||||
|
|
||||||
`nix-push' packs the closure of PATHS into a set of NAR archives
|
`nix-push' packs the closure of PATHS into a set of NAR files stored
|
||||||
stored in DIR.
|
in DIR. Optionally generate a manifest.
|
||||||
EOF
|
EOF
|
||||||
; # `
|
; # `
|
||||||
exit 1;
|
exit 1;
|
||||||
|
@ -52,6 +49,12 @@ for (my $n = 0; $n < scalar @ARGV; $n++) {
|
||||||
die "$0: `$arg' requires an argument\n" unless $n < scalar @ARGV;
|
die "$0: `$arg' requires an argument\n" unless $n < scalar @ARGV;
|
||||||
$destDir = $ARGV[$n];
|
$destDir = $ARGV[$n];
|
||||||
mkpath($destDir, 0, 0755);
|
mkpath($destDir, 0, 0755);
|
||||||
|
} elsif ($arg eq "--manifest") {
|
||||||
|
$writeManifest = 1;
|
||||||
|
} elsif ($arg eq "--url-prefix") {
|
||||||
|
$n++;
|
||||||
|
die "$0: `$arg' requires an argument\n" unless $n < scalar @ARGV;
|
||||||
|
$archivesURL = $ARGV[$n];
|
||||||
} elsif (substr($arg, 0, 1) eq "-") {
|
} elsif (substr($arg, 0, 1) eq "-") {
|
||||||
showSyntax;
|
showSyntax;
|
||||||
} else {
|
} else {
|
||||||
|
@ -61,6 +64,8 @@ for (my $n = 0; $n < scalar @ARGV; $n++) {
|
||||||
|
|
||||||
showSyntax if !defined $destDir;
|
showSyntax if !defined $destDir;
|
||||||
|
|
||||||
|
$archivesURL = "file://$destDir" unless defined $archivesURL;
|
||||||
|
|
||||||
|
|
||||||
# From the given store paths, determine the set of requisite store
|
# From the given store paths, determine the set of requisite store
|
||||||
# paths, i.e, the paths required to realise them.
|
# paths, i.e, the paths required to realise them.
|
||||||
|
@ -98,7 +103,7 @@ foreach my $storePath (@storePaths) {
|
||||||
# Construct a Nix expression that creates a Nix archive.
|
# Construct a Nix expression that creates a Nix archive.
|
||||||
my $nixexpr =
|
my $nixexpr =
|
||||||
"(import <nix/nar.nix> " .
|
"(import <nix/nar.nix> " .
|
||||||
"{ storePath = builtins.storePath \"$storePath\"; hashAlgo = \"$hashAlgo\"; compressionType = \"$compressionType\"; }) ";
|
"{ storePath = builtins.storePath \"$storePath\"; hashAlgo = \"sha256\"; compressionType = \"$compressionType\"; }) ";
|
||||||
|
|
||||||
print NIX $nixexpr;
|
print NIX $nixexpr;
|
||||||
}
|
}
|
||||||
|
@ -126,6 +131,8 @@ print STDERR "copying archives...\n";
|
||||||
my $totalNarSize = 0;
|
my $totalNarSize = 0;
|
||||||
my $totalCompressedSize = 0;
|
my $totalCompressedSize = 0;
|
||||||
|
|
||||||
|
my %narFiles;
|
||||||
|
|
||||||
for (my $n = 0; $n < scalar @storePaths; $n++) {
|
for (my $n = 0; $n < scalar @storePaths; $n++) {
|
||||||
my $storePath = $storePaths[$n];
|
my $storePath = $storePaths[$n];
|
||||||
my $narDir = $narPaths[$n];
|
my $narDir = $narPaths[$n];
|
||||||
|
@ -205,7 +212,24 @@ for (my $n = 0; $n < scalar @storePaths; $n++) {
|
||||||
close INFO or die;
|
close INFO or die;
|
||||||
rename($tmp, $dst) or die "cannot rename $tmp to $dst: $!\n";
|
rename($tmp, $dst) or die "cannot rename $tmp to $dst: $!\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$narFiles{$storePath} = [
|
||||||
|
{ url => "$archivesURL/$narName"
|
||||||
|
, hash => "sha256:$compressedHash"
|
||||||
|
, size => $compressedSize
|
||||||
|
, narHash => "$narHash"
|
||||||
|
, narSize => $narSize
|
||||||
|
, references => join(" ", @{$refs})
|
||||||
|
, deriver => $deriver
|
||||||
|
}
|
||||||
|
] if $writeManifest;
|
||||||
}
|
}
|
||||||
|
|
||||||
printf STDERR "total compressed size %.2f MiB, %.1f%%\n",
|
printf STDERR "total compressed size %.2f MiB, %.1f%%\n",
|
||||||
$totalCompressedSize / (1024 * 1024), $totalCompressedSize / $totalNarSize * 100;
|
$totalCompressedSize / (1024 * 1024), $totalCompressedSize / $totalNarSize * 100;
|
||||||
|
|
||||||
|
|
||||||
|
# Optionally write a manifest.
|
||||||
|
if ($writeManifest) {
|
||||||
|
writeManifest "$destDir/MANIFEST", \%narFiles, \();
|
||||||
|
}
|
||||||
|
|
|
@ -7,14 +7,17 @@ mkdir -p $TEST_ROOT/cache2 $TEST_ROOT/patches
|
||||||
RESULT=$TEST_ROOT/result
|
RESULT=$TEST_ROOT/result
|
||||||
|
|
||||||
# Build version 1 and 2 of the "foo" package.
|
# Build version 1 and 2 of the "foo" package.
|
||||||
nix-push --copy $TEST_ROOT/cache2 $TEST_ROOT/manifest1 \
|
nix-push --dest $TEST_ROOT/cache2 --manifest --bzip2 \
|
||||||
$(nix-build -o $RESULT binary-patching.nix --arg version 1)
|
$(nix-build -o $RESULT binary-patching.nix --arg version 1)
|
||||||
|
mv $TEST_ROOT/cache2/MANIFEST $TEST_ROOT/manifest1
|
||||||
|
|
||||||
out2=$(nix-build -o $RESULT binary-patching.nix --arg version 2)
|
out2=$(nix-build -o $RESULT binary-patching.nix --arg version 2)
|
||||||
nix-push --copy $TEST_ROOT/cache2 $TEST_ROOT/manifest2 $out2
|
nix-push --dest $TEST_ROOT/cache2 --manifest --bzip2 $out2
|
||||||
|
mv $TEST_ROOT/cache2/MANIFEST $TEST_ROOT/manifest2
|
||||||
|
|
||||||
out3=$(nix-build -o $RESULT binary-patching.nix --arg version 3)
|
out3=$(nix-build -o $RESULT binary-patching.nix --arg version 3)
|
||||||
nix-push --copy $TEST_ROOT/cache2 $TEST_ROOT/manifest3 $out3
|
nix-push --dest $TEST_ROOT/cache2 --manifest --bzip2 $out3
|
||||||
|
mv $TEST_ROOT/cache2/MANIFEST $TEST_ROOT/manifest3
|
||||||
|
|
||||||
rm $RESULT
|
rm $RESULT
|
||||||
|
|
||||||
|
|
|
@ -9,7 +9,7 @@ clearStore
|
||||||
clearProfiles
|
clearProfiles
|
||||||
|
|
||||||
cat > $TEST_ROOT/foo.nixpkg <<EOF
|
cat > $TEST_ROOT/foo.nixpkg <<EOF
|
||||||
NIXPKG1 file://$TEST_ROOT/manifest simple $system $drvPath $outPath
|
NIXPKG1 file://$TEST_ROOT/cache/MANIFEST simple $system $drvPath $outPath
|
||||||
EOF
|
EOF
|
||||||
|
|
||||||
nix-install-package --non-interactive -p $profiles/test $TEST_ROOT/foo.nixpkg
|
nix-install-package --non-interactive -p $profiles/test $TEST_ROOT/foo.nixpkg
|
||||||
|
|
|
@ -19,7 +19,7 @@ nix-channel --remove xyzzy
|
||||||
# Create a channel.
|
# Create a channel.
|
||||||
rm -rf $TEST_ROOT/foo
|
rm -rf $TEST_ROOT/foo
|
||||||
mkdir -p $TEST_ROOT/foo
|
mkdir -p $TEST_ROOT/foo
|
||||||
nix-push --copy $TEST_ROOT/foo $TEST_ROOT/foo/MANIFEST $(nix-store -r $(nix-instantiate dependencies.nix))
|
nix-push --dest $TEST_ROOT/foo --manifest --bzip2 $(nix-store -r $(nix-instantiate dependencies.nix))
|
||||||
rm -rf $TEST_ROOT/nixexprs
|
rm -rf $TEST_ROOT/nixexprs
|
||||||
mkdir -p $TEST_ROOT/nixexprs
|
mkdir -p $TEST_ROOT/nixexprs
|
||||||
cp config.nix dependencies.nix dependencies.builder*.sh $TEST_ROOT/nixexprs/
|
cp config.nix dependencies.nix dependencies.builder*.sh $TEST_ROOT/nixexprs/
|
||||||
|
|
|
@ -2,7 +2,7 @@ source common.sh
|
||||||
|
|
||||||
pullCache () {
|
pullCache () {
|
||||||
echo "pulling cache..."
|
echo "pulling cache..."
|
||||||
nix-pull file://$TEST_ROOT/manifest
|
nix-pull file://$TEST_ROOT/cache/MANIFEST
|
||||||
}
|
}
|
||||||
|
|
||||||
clearStore
|
clearStore
|
||||||
|
|
|
@ -1,5 +1,7 @@
|
||||||
source common.sh
|
source common.sh
|
||||||
|
|
||||||
|
clearStore
|
||||||
|
|
||||||
drvPath=$(nix-instantiate dependencies.nix)
|
drvPath=$(nix-instantiate dependencies.nix)
|
||||||
outPath=$(nix-store -r $drvPath)
|
outPath=$(nix-store -r $drvPath)
|
||||||
|
|
||||||
|
@ -7,4 +9,4 @@ echo "pushing $drvPath"
|
||||||
|
|
||||||
mkdir -p $TEST_ROOT/cache
|
mkdir -p $TEST_ROOT/cache
|
||||||
|
|
||||||
nix-push --copy $TEST_ROOT/cache $TEST_ROOT/manifest $drvPath
|
nix-push --dest $TEST_ROOT/cache --manifest $drvPath --bzip2
|
||||||
|
|
Loading…
Reference in a new issue