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 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, \();
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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/
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue