Add the '--show-progress' flag to nix-copy-closure

This commit is contained in:
Shea Levy 2012-03-29 18:20:31 +02:00 committed by Eelco Dolstra
parent 00c98a6bef
commit 055e803851
3 changed files with 20 additions and 5 deletions

View file

@ -26,6 +26,7 @@
<arg><option>--gzip</option></arg> <arg><option>--gzip</option></arg>
<arg><option>--bzip2</option></arg> <arg><option>--bzip2</option></arg>
<arg><option>--xz</option></arg> <arg><option>--xz</option></arg>
<arg><option>--show-progress</option></arg>
<arg><option>--include-outputs</option></arg> <arg><option>--include-outputs</option></arg>
<arg choice='plain'> <arg choice='plain'>
<replaceable>user@</replaceable><replaceable>machine</replaceable> <replaceable>user@</replaceable><replaceable>machine</replaceable>
@ -110,6 +111,13 @@ those paths. If this bothers you, use
</varlistentry> </varlistentry>
<varlistentry><term><option>--show-progress</option></term>
<listitem><para>Show the progress of each path's transfer as it's made.
This requires the <command>pv</command> utility to be in <envar>PATH</envar>.</para></listitem>
</varlistentry>
<varlistentry><term><option>--include-outputs</option></term> <varlistentry><term><option>--include-outputs</option></term>
<listitem><para>Also copy the outputs of store derivations included <listitem><para>Also copy the outputs of store derivations included

View file

@ -6,11 +6,12 @@ use Nix::Store;
sub copyTo { sub copyTo {
my ($sshHost, $sshOpts, $storePaths, $compressor, $decompressor, $includeOutputs, $dryRun, $sign) = @_; my ($sshHost, $sshOpts, $storePaths, $compressor, $decompressor, $includeOutputs, $dryRun, $sign, $progressViewer) = @_;
$compressor = "$compressor |" if $compressor ne ""; $compressor = "$compressor |" if $compressor ne "";
$decompressor = "$decompressor |" if $decompressor ne ""; $decompressor = "$decompressor |" if $decompressor ne "";
$progressViewer = "$progressViewer |" if $progressViewer ne "";
# Get the closure of this path. # Get the closure of this path.
my @closure = reverse(topoSortPaths(computeFSClosure(0, $includeOutputs, my @closure = reverse(topoSortPaths(computeFSClosure(0, $includeOutputs,
map { followLinksToStorePath $_ } @{$storePaths}))); map { followLinksToStorePath $_ } @{$storePaths})));
@ -34,7 +35,7 @@ sub copyTo {
if (scalar @missing > 0) { if (scalar @missing > 0) {
print STDERR "copying ", scalar @missing, " missing paths to $sshHost...\n"; print STDERR "copying ", scalar @missing, " missing paths to $sshHost...\n";
unless ($dryRun) { unless ($dryRun) {
open SSH, "| $compressor ssh $sshHost @{$sshOpts} '$decompressor nix-store --import' > /dev/null" or die; open SSH, "| $progressViewer $compressor ssh $sshHost @{$sshOpts} '$decompressor nix-store --import' > /dev/null" or die;
exportPaths(fileno(SSH), $sign, @missing); exportPaths(fileno(SSH), $sign, @missing);
close SSH or die "copying store paths to remote machine `$sshHost' failed: $?"; close SSH or die "copying store paths to remote machine `$sshHost' failed: $?";
} }

View file

@ -23,6 +23,8 @@ my $sign = 0;
my $compressor = ""; my $compressor = "";
my $decompressor = ""; my $decompressor = "";
my $progressViewer = "";
my $toMode = 1; my $toMode = 1;
my $includeOutputs = 0; my $includeOutputs = 0;
@ -60,6 +62,9 @@ while (@ARGV) {
elsif ($arg eq "--include-outputs") { elsif ($arg eq "--include-outputs") {
$includeOutputs = 1; $includeOutputs = 1;
} }
elsif ($arg eq "--show-progress") {
$progressViewer = "pv";
}
elsif ($arg eq "--dry-run") { elsif ($arg eq "--dry-run") {
$dryRun = 1; $dryRun = 1;
} }
@ -76,7 +81,7 @@ openSSHConnection $sshHost or die "$0: unable to start SSH\n";
if ($toMode) { # Copy TO the remote machine. if ($toMode) { # Copy TO the remote machine.
Nix::CopyClosure::copyTo($sshHost, [ @sshOpts ], [ @storePaths ], $compressor, $decompressor, $includeOutputs, $dryRun, $sign); Nix::CopyClosure::copyTo($sshHost, [ @sshOpts ], [ @storePaths ], $compressor, $decompressor, $includeOutputs, $dryRun, $sign, $progressViewer);
} }
else { # Copy FROM the remote machine. else { # Copy FROM the remote machine.
@ -101,9 +106,10 @@ else { # Copy FROM the remote machine.
print STDERR "copying ", scalar @missing, " missing paths from $sshHost...\n"; print STDERR "copying ", scalar @missing, " missing paths from $sshHost...\n";
$compressor = "| $compressor" if $compressor ne ""; $compressor = "| $compressor" if $compressor ne "";
$decompressor = "$decompressor |" if $decompressor ne ""; $decompressor = "$decompressor |" if $decompressor ne "";
$progressViewer = "$progressViewer |" if $progressViewer ne "";
unless ($dryRun) { unless ($dryRun) {
my $extraOpts = $sign ? "--sign" : ""; my $extraOpts = $sign ? "--sign" : "";
system("set -f; ssh $sshHost @sshOpts 'nix-store --export $extraOpts @missing $compressor' | $decompressor $Nix::Config::binDir/nix-store --import > /dev/null") == 0 system("set -f; ssh $sshHost @sshOpts 'nix-store --export $extraOpts @missing $compressor' | $decompressor $progressViewer $Nix::Config::binDir/nix-store --import > /dev/null") == 0
or die "copying store paths from remote machine `$sshHost' failed: $?"; or die "copying store paths from remote machine `$sshHost' failed: $?";
} }
} }