about summary refs log blame commit diff
path: root/scripts/copy-from-other-stores.pl.in
blob: 10130c0893ea074780853f7f4fcb84fbb77416f0 (plain) (tree)
1
2
3
4
5
6
7
8
9



                   

               


                                               
                     
 
                                                                  
 



                                    

 


                        

                          
                                       




                                                                          
     
                 


 
                            
 

                                 
 

                                                      
                                                                             



                                                      

                                                                 




                                    









                                                                            
 



                                                                         


                                             

                               
         
 
                                              






                                    

                                                        
                                                              
                                                                                                




                                                           
#! @perl@ -w

use strict;
use File::Basename;
use IO::Handle;

my $binDir = $ENV{"NIX_BIN_DIR"} || "@bindir@";


STDOUT->autoflush(1);

my @remoteStoresAll = split ':', ($ENV{"NIX_OTHER_STORES"} or "");

my @remoteStores;
foreach my $dir (@remoteStoresAll) {
    push @remoteStores, glob($dir);
}


$ENV{"NIX_REMOTE"} = "";


sub findStorePath {
    my $storePath = shift;
    foreach my $store (@remoteStores) {
        my $sourcePath = "$store/store/" . basename $storePath;
        next unless -e $sourcePath || -l $sourcePath;
        $ENV{"NIX_DB_DIR"} = "$store/var/nix/db";
        return ($store, $sourcePath) if
            system("@bindir@/nix-store --check-validity $storePath") == 0;
    }
    return undef;
}


if ($ARGV[0] eq "--query") {

    while (<STDIN>) {
        my $cmd = $_; chomp $cmd;

        if ($cmd eq "have") {
            my $storePath = <STDIN>; chomp $storePath;
            print STDOUT (defined findStorePath($storePath) ? "1\n" : "0\n");
        }

        elsif ($cmd eq "info") {
            my $storePath = <STDIN>; chomp $storePath;
            my ($store, $sourcePath) = findStorePath($storePath);
            if (!defined $store) {
                print "0\n";
                next; # not an error
            }
            print "1\n";

            $ENV{"NIX_DB_DIR"} = "$store/var/nix/db";
            
            my $deriver = `@bindir@/nix-store --query --deriver $storePath`;
            die "cannot query deriver of `$storePath'" if $? != 0;
            chomp $deriver;
            $deriver = "" if $deriver eq "unknown-deriver";

            my @references = split "\n",
                `@bindir@/nix-store --query --references $storePath`;
            die "cannot query references of `$storePath'" if $? != 0;

            my $narSize = `@bindir@/nix-store --query --size $storePath`;
            die "cannot query size of `$storePath'" if $? != 0;
            chomp $narSize;

            print "$deriver\n";
            print scalar @references, "\n";
            print "$_\n" foreach @references;
            print "$narSize\n";
            print "$narSize\n";
        }

        else { die "unknown command `$cmd'"; }
    }
}


elsif ($ARGV[0] eq "--substitute") {
    die unless scalar @ARGV == 2;
    my $storePath = $ARGV[1];
    my ($store, $sourcePath) = findStorePath $storePath;
    die unless $store;
    print "\n*** Copying `$storePath' from `$sourcePath'\n\n";
    system("$binDir/nix-store --dump $sourcePath | $binDir/nix-store --restore $storePath") == 0
        or die "cannot copy `$sourcePath' to `$storePath'";
}


else { die; }