liminix/pkgs/min-copy-closure/min-copy-closure.sh

84 lines
1.4 KiB
Bash
Executable File

#!/usr/bin/env bash
ssh_command=${SSH_COMMAND-ssh}
root_prefix=/
verbose=true
while [[ $# -gt 0 ]]; do
case $1 in
-r|--root)
root_prefix="$2"
shift
shift
;;
-q|--quiet)
verbose=""
shift
;;
-*|--*)
echo "Unknown option $1"
exit 1
;;
*)
if test -z "$target_host"; then
target_host="$1"
else
paths+=("$1") # save positional arg
fi
shift # past argument
;;
esac
done
progress() {
test -n "$verbose" && echo $*
}
if [ -z "$target_host" ] ; then
echo Usage: min-copy-closure [--root /mnt] target-host paths
exit 1
fi
if [ -z "$IN_NIX_BUILD" ] ; then
# can't run nix-store in a derivation, so we have to
# skip the requisites when running tests in hydra
paths=$(nix-store -q --requisites "$paths")
fi
needed=""
coproc remote {
${ssh_command} -C -T ${target_host}
}
exec 10>&${remote[1]}
for p in $paths; do
progress -n Checking $(basename $p) ...
echo "test -e ${root_prefix}$p && echo skip || echo $p" >&10
read n <&${remote[0]}
case $n in
skip)
progress skip
;;
*)
needed="${needed} $n"
progress will copy
;;
esac
done
if test -z "$needed" ; then
echo Nothing to copy
exit 1
fi
echo "cd ${root_prefix} && cpio -d -i >/dev/console" >&10
find $needed | cpio -H newc -o >&10
# make sure the connection hasn't died
echo "echo finished" >&10
read n <&${remote[0]}
echo $n