* `nix-install-package --help' (NIX-9). * `nix-install-package --non-interactive': don't prompt or pause. * Tests for nix-install-package. * Security fixes: filter the values obtained from the nixpkg.
		
			
				
	
	
		
			81 lines
		
	
	
	
		
			2.2 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
			
		
		
	
	
			81 lines
		
	
	
	
		
			2.2 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
#! @perl@ -w
 | 
						|
 | 
						|
# This tool unpacks the closures created by "nix-pack-closure" and
 | 
						|
# adds them to the Nix store.
 | 
						|
 | 
						|
# TODO: make this program "streamy", i.e., don't use a temporary
 | 
						|
# directory.
 | 
						|
 | 
						|
use strict;
 | 
						|
use POSIX qw(tmpnam);
 | 
						|
 | 
						|
my $binDir = $ENV{"NIX_BIN_DIR"};
 | 
						|
$binDir = "@bindir@" unless defined $binDir;
 | 
						|
 | 
						|
my $tmpDir;
 | 
						|
do { $tmpDir = tmpnam(); }
 | 
						|
until mkdir $tmpDir, 0777;
 | 
						|
END { my $x = $?; system ("@coreutils@/rm", "-rf", $tmpDir); $? = $x; }
 | 
						|
 | 
						|
 | 
						|
# Unpack the NAR archive on standard input.
 | 
						|
system("nix-store --restore '$tmpDir/unpacked'") == 0
 | 
						|
    or die "nix-store --restore failed";
 | 
						|
 | 
						|
 | 
						|
open VALID, ">$tmpDir/validity" or die;
 | 
						|
 | 
						|
 | 
						|
# For each path in the closure that is not yet valid, add it to the
 | 
						|
# store.  TODO: use proper locking.  Or even better, let nix-store do
 | 
						|
# this.
 | 
						|
opendir(DIR, "$tmpDir/unpacked/contents") or die "cannot open directory: $!";
 | 
						|
 | 
						|
foreach my $name (sort(readdir DIR)) {
 | 
						|
    next if $name eq "." or $name eq "..";
 | 
						|
 | 
						|
    my $storePath = "@storedir@/$name"; # !!!
 | 
						|
 | 
						|
    # !!! this really isn't a good validity check!
 | 
						|
    system "$binDir/nix-store --check-validity '$storePath' 2> /dev/null";
 | 
						|
    if ($? != 0) {
 | 
						|
        print STDERR "unpacking `$storePath'...\n";
 | 
						|
 | 
						|
        # !!! race
 | 
						|
        system("@coreutils@/rm -rf '$storePath'") == 0
 | 
						|
            or die "cannot remove `$storePath': $?";
 | 
						|
 | 
						|
        system("$binDir/nix-store --restore '$storePath' < '$tmpDir/unpacked/contents/$name'") == 0
 | 
						|
            or die "nix-store --dump failed on `$storePath': $?";
 | 
						|
        
 | 
						|
        print VALID "$storePath\n";
 | 
						|
 | 
						|
        open DRV, "<$tmpDir/unpacked/derivers/$name" or die;
 | 
						|
        my $deriver = <DRV>;
 | 
						|
        chomp $deriver;
 | 
						|
        $deriver = "" if $deriver eq "unknown-deriver";
 | 
						|
        close DRV;
 | 
						|
 | 
						|
        my @refs;
 | 
						|
        open REFS, "<$tmpDir/unpacked/references/$name" or die;
 | 
						|
        while (<REFS>) {
 | 
						|
            chomp;
 | 
						|
            push @refs, $_;
 | 
						|
        }
 | 
						|
        close REFS;
 | 
						|
 | 
						|
        print VALID "$deriver\n";
 | 
						|
        
 | 
						|
        print VALID (scalar @refs), "\n";
 | 
						|
        foreach my $ref (@refs) {
 | 
						|
            print VALID "$ref\n";
 | 
						|
        }
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
closedir(DIR) or die;
 | 
						|
 | 
						|
 | 
						|
# Register the invalid paths as valid.
 | 
						|
system("nix-store --register-validity <'$tmpDir/validity'") == 0
 | 
						|
    or die "nix-store --register-validity failed";
 |