diff options
-rwxr-xr-x | scripts/nix-push.in | 44 | ||||
-rw-r--r-- | tests/binary-patching.sh | 9 | ||||
-rw-r--r-- | tests/install-package.sh | 2 | ||||
-rw-r--r-- | tests/nix-channel.sh | 2 | ||||
-rw-r--r-- | tests/nix-pull.sh | 2 | ||||
-rw-r--r-- | tests/nix-push.sh | 4 |
6 files changed, 46 insertions, 17 deletions
diff --git a/scripts/nix-push.in b/scripts/nix-push.in index 45a0695a64d7..39fdd6da9e39 100755 --- a/scripts/nix-push.in +++ b/scripts/nix-push.in @@ -8,31 +8,28 @@ use File::stat; use File::Copy; use Nix::Config; use Nix::Store; - -my $hashAlgo = "sha256"; +use Nix::Manifest; my $tmpDir = tempdir("nix-push.XXXXXX", CLEANUP => 1, TMPDIR => 1) or die "cannot create a temporary directory"; 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. my $compressionType = "xz"; my $force = 0; my $destDir; +my $writeManifest = 0; +my $archivesURL; my @roots; sub showSyntax { 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 -stored in DIR. +`nix-push' packs the closure of PATHS into a set of NAR files stored +in DIR. Optionally generate a manifest. EOF ; # ` 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; $destDir = $ARGV[$n]; 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 "-") { showSyntax; } else { @@ -61,6 +64,8 @@ for (my $n = 0; $n < scalar @ARGV; $n++) { showSyntax if !defined $destDir; +$archivesURL = "file://$destDir" unless defined $archivesURL; + # From the given store paths, determine the set of requisite store # 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. my $nixexpr = "(import <nix/nar.nix> " . - "{ storePath = builtins.storePath \"$storePath\"; hashAlgo = \"$hashAlgo\"; compressionType = \"$compressionType\"; }) "; + "{ storePath = builtins.storePath \"$storePath\"; hashAlgo = \"sha256\"; compressionType = \"$compressionType\"; }) "; print NIX $nixexpr; } @@ -126,6 +131,8 @@ print STDERR "copying archives...\n"; my $totalNarSize = 0; my $totalCompressedSize = 0; +my %narFiles; + for (my $n = 0; $n < scalar @storePaths; $n++) { my $storePath = $storePaths[$n]; my $narDir = $narPaths[$n]; @@ -205,7 +212,24 @@ for (my $n = 0; $n < scalar @storePaths; $n++) { close INFO or die; 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", $totalCompressedSize / (1024 * 1024), $totalCompressedSize / $totalNarSize * 100; + + +# Optionally write a manifest. +if ($writeManifest) { + writeManifest "$destDir/MANIFEST", \%narFiles, \(); +} diff --git a/tests/binary-patching.sh b/tests/binary-patching.sh index 8c52c2f1421b..188be109a0b5 100644 --- a/tests/binary-patching.sh +++ b/tests/binary-patching.sh @@ -7,14 +7,17 @@ mkdir -p $TEST_ROOT/cache2 $TEST_ROOT/patches RESULT=$TEST_ROOT/result # 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) +mv $TEST_ROOT/cache2/MANIFEST $TEST_ROOT/manifest1 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) -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 diff --git a/tests/install-package.sh b/tests/install-package.sh index b818eda121cf..653dfee4c8d1 100644 --- a/tests/install-package.sh +++ b/tests/install-package.sh @@ -9,7 +9,7 @@ clearStore clearProfiles 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 nix-install-package --non-interactive -p $profiles/test $TEST_ROOT/foo.nixpkg diff --git a/tests/nix-channel.sh b/tests/nix-channel.sh index eb1d572953d7..a25d56bec11e 100644 --- a/tests/nix-channel.sh +++ b/tests/nix-channel.sh @@ -19,7 +19,7 @@ nix-channel --remove xyzzy # Create a channel. rm -rf $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 mkdir -p $TEST_ROOT/nixexprs cp config.nix dependencies.nix dependencies.builder*.sh $TEST_ROOT/nixexprs/ diff --git a/tests/nix-pull.sh b/tests/nix-pull.sh index 9a89676cb99f..79e7ae26b5cc 100644 --- a/tests/nix-pull.sh +++ b/tests/nix-pull.sh @@ -2,7 +2,7 @@ source common.sh pullCache () { echo "pulling cache..." - nix-pull file://$TEST_ROOT/manifest + nix-pull file://$TEST_ROOT/cache/MANIFEST } clearStore diff --git a/tests/nix-push.sh b/tests/nix-push.sh index 69f05141af69..8ea59516c62c 100644 --- a/tests/nix-push.sh +++ b/tests/nix-push.sh @@ -1,5 +1,7 @@ source common.sh +clearStore + drvPath=$(nix-instantiate dependencies.nix) outPath=$(nix-store -r $drvPath) @@ -7,4 +9,4 @@ echo "pushing $drvPath" mkdir -p $TEST_ROOT/cache -nix-push --copy $TEST_ROOT/cache $TEST_ROOT/manifest $drvPath +nix-push --dest $TEST_ROOT/cache --manifest $drvPath --bzip2 |