From d303b389a9dbd44fe60deba5e98e68ec98bdddd3 Mon Sep 17 00:00:00 2001 From: Eelco Dolstra Date: Mon, 26 Mar 2007 21:05:17 +0000 Subject: [PATCH] * `nix-copy-closure --from': copy from a remote machine instead of to a remote machine. --- doc/manual/release-notes.xml | 5 +++ scripts/nix-copy-closure.in | 74 ++++++++++++++++++++++++++++++------ 2 files changed, 67 insertions(+), 12 deletions(-) diff --git a/doc/manual/release-notes.xml b/doc/manual/release-notes.xml index ead19962de..4830b323ef 100644 --- a/doc/manual/release-notes.xml +++ b/doc/manual/release-notes.xml @@ -15,6 +15,11 @@ TODO: multi-user support. + nix-copy-closure copies the + missing parts of a closure to or from a remote + machine. + + nix-prefetch-url now by default computes the SHA-256 hash of the file instead of the MD5 hash. In calls to fetchurl you should pass an diff --git a/scripts/nix-copy-closure.in b/scripts/nix-copy-closure.in index d5af65bfe5..511f207f1b 100644 --- a/scripts/nix-copy-closure.in +++ b/scripts/nix-copy-closure.in @@ -6,7 +6,7 @@ $binDir = "@bindir@" unless defined $binDir; if (scalar @ARGV < 1) { print STDERR <) { chomp; - print STDERR "target needs $_\n"; + print STDERR "target machine needs $_\n"; push @missing, $_; } close READ or die; @@ -93,7 +97,53 @@ if ($toMode) { # Copy TO the remote machine. my $extraOpts = ""; $extraOpts .= "--sign" if $sign == 1; system("nix-store --export $extraOpts @missing | $compressor | ssh @sshOpts $sshHost '$decompressor | nix-store --import'") == 0 - or die "copying store paths to remote machine failed: $?"; + or die "copying store paths to remote machine `$sshHost' failed: $?"; + } + +} + + +else { # Copy FROM the remote machine. + + # Query the closure of the given store paths on the remote + # machine. Paths are assumed to be store paths; there is no + # resolution (following of symlinks). + my $pid = open(READ, + "ssh @sshOpts $sshHost nix-store --query --requisites @storePaths|") or die; + + my @allStorePaths; + my %storePathsSeen; + + while () { + chomp; + die "bad: $_" unless /^\//; + if (!defined $storePathsSeen{$_}) { + push @allStorePaths, $_; + $storePathsSeen{$_} = 1; + print "GOT $_\n"; + } + } + + close READ or die "nix-store on remote machine `$sshHost' failed: $?"; + + + # What paths are already valid locally? + open(READ, "@bindir@/nix-store --check-validity --print-invalid @allStorePaths|"); + my @missing = (); + while () { + chomp; + print STDERR "local machine needs $_\n"; + push @missing, $_; + } + close READ or die; + + + # Export the store paths on the remote machine and import them on locally. + if (scalar @missing > 0) { + my $extraOpts = ""; + $extraOpts .= "--sign" if $sign == 1; + system("ssh @sshOpts $sshHost 'nix-store --export $extraOpts @missing | $compressor' | $decompressor | nix-store --import") == 0 + or die "copying store paths to remote machine `$sshHost' failed: $?"; } }