mirror of
https://github.com/NixOS/nix
synced 2025-06-26 15:51:15 +02:00
nix-copy-closure -s: Do substitutions via ‘nix-store --serve’
This means we no longer need an SSH master connection, since we only execute a single command on the remote host.
This commit is contained in:
parent
7c3a5090bf
commit
7bb632b024
4 changed files with 43 additions and 11 deletions
|
@ -29,16 +29,12 @@ sub copyTo {
|
|||
my ($sshHost, $sshOpts, $storePaths, $compressor, $decompressor,
|
||||
$includeOutputs, $dryRun, $sign, $progressViewer, $useSubstitutes) = @_;
|
||||
|
||||
$useSubstitutes = 0 if $dryRun;
|
||||
|
||||
# Get the closure of this path.
|
||||
my @closure = reverse(topoSortPaths(computeFSClosure(0, $includeOutputs,
|
||||
map { followLinksToStorePath $_ } @{$storePaths})));
|
||||
|
||||
# Optionally use substitutes on the remote host.
|
||||
if (!$dryRun && $useSubstitutes) {
|
||||
system "ssh $sshHost @{$sshOpts} nix-store -r --ignore-unknown @closure";
|
||||
# Ignore exit status because this is just an optimisation.
|
||||
}
|
||||
|
||||
# Start ‘nix-store --serve’ on the remote host.
|
||||
my ($from, $to);
|
||||
my $pid = open2($from, $to, "ssh $sshHost @{$sshOpts} nix-store --serve --write");
|
||||
|
@ -60,8 +56,9 @@ sub copyTo {
|
|||
|
||||
# Send the "query valid paths" command with the "lock" option
|
||||
# enabled. This prevents a race where the remote host
|
||||
# garbage-collect paths that are already there.
|
||||
syswrite($to, pack("L<x4L<x4L<x4", 1, 1, scalar @closure)) or die;
|
||||
# garbage-collect paths that are already there. Optionally, ask
|
||||
# the remote host to substitute missing paths.
|
||||
syswrite($to, pack("L<x4L<x4L<x4L<x4", 1, 1, $useSubstitutes, scalar @closure)) or die;
|
||||
writeString($_, $to) foreach @closure;
|
||||
|
||||
# Get back the set of paths that are already valid on the remote host.
|
||||
|
@ -119,6 +116,12 @@ sub oldCopyTo {
|
|||
my ($closure, $sshHost, $sshOpts, $storePaths, $compressor, $decompressor,
|
||||
$includeOutputs, $dryRun, $sign, $progressViewer, $useSubstitutes) = @_;
|
||||
|
||||
# Optionally use substitutes on the remote host.
|
||||
if (!$dryRun && $useSubstitutes) {
|
||||
system "ssh $sshHost @{$sshOpts} nix-store -r --ignore-unknown @$closure";
|
||||
# Ignore exit status because this is just an optimisation.
|
||||
}
|
||||
|
||||
# Ask the remote host which paths are invalid. Because of limits
|
||||
# to the command line length, do this in chunks. Eventually,
|
||||
# we'll want to use ‘--from-stdin’, but we can't rely on the
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue