From 11d512e7a812e750deccf616b461876fb0a342c2 Mon Sep 17 00:00:00 2001 From: Michael Raskin <7c6f434c@mail.ru> Date: Wed, 27 Feb 2008 21:26:47 +0000 Subject: Added nix-reduce-build. You point it to some path you want to build and it fetches whatever it can from specified computers via nix-copy-closure. NOTE: You do want to set up RSA keys or ssh-agent or something... You really do want it. It will run separate ssh instances insane number of times. --- scripts/nix-reduce-build.in | 68 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 68 insertions(+) create mode 100644 scripts/nix-reduce-build.in (limited to 'scripts/nix-reduce-build.in') diff --git a/scripts/nix-reduce-build.in b/scripts/nix-reduce-build.in new file mode 100644 index 000000000000..6d7f8bdd7f63 --- /dev/null +++ b/scripts/nix-reduce-build.in @@ -0,0 +1,68 @@ +#! @shell@ + +WORKING_DIRECTORY=$(mktemp -d "${TMPDIR:-/tmp}"/nix-reduce-build-XXXXXX); +cd "$WORKING_DIRECTORY"; + +if test -z "$1" ; then + echo 'nix-reduce-build (paths or Nix expressions) -- (logins at remote computers)' >&2 + echo As in: >&2 + echo nix-reduce-build /etc/nixos/nixos -- user@somewhere.nowhere.example.org >&2 + exit; +fi; + +while ! test "$1" = "--" || test "$1" = "" ; do + echo "$1" >> initial; >&2 + shift; +done +shift; +echo Will work on $(cat initial | wc -l) targets. >&2 + +while read ; do + case "$REPLY" in + ${NIX_STORE_PATH:-/nix/store}/*) + echo "$REPLY" >> paths; >&2 + ;; + *) + nix-instantiate "$REPLY" >> paths; + ;; + esac; +done < initial; +echo Proceeding $(cat paths | wc -l) paths. >&2 + +while read; do + case "$REPLY" in + *.drv) + echo "$REPLY" >> derivers; >&2 + ;; + *) + nix-store --query --deriver "$REPLY" >>derivers; + ;; + esac; +done < paths; +echo Found $(cat derivers | wc -l) derivers. >&2 + +cat derivers | xargs nix-store --query -R > derivers-closure; +echo Proceeding at most $(cat derivers-closure | wc -l) derivers. >&2 + +cat derivers-closure | egrep '[.]drv$' | xargs nix-store --query --outputs > wanted-paths; +cat derivers-closure | egrep -v '[.]drv$' >> wanted-paths; +echo Prepared $(cat wanted-paths | wc -l) paths to get. >&2 + +cat wanted-paths | xargs nix-store --check-validity --print-invalid > needed-paths; +echo We need $(cat needed-paths | wc -l) paths. >&2 + +if test -z "$1" ; then + cat needed-paths; +fi; + +for i in "$@"; do + cat needed-paths | while read; do + nix-copy-closure --from "$i" --gzip "$REPLY" needed-paths; + echo We still need $(cat needed-paths | wc -l) paths. >&2 +done; + +cd / +rm -r "$WORKING_DIRECTORY" -- cgit 1.4.1