forked from dan/liminix
84 lines
1.4 KiB
Bash
Executable File
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
|