#! @shell@ WORKING_DIRECTORY=$(mktemp -d "${TMPDIR:-/tmp}"/nix-reduce-build-XXXXXX); cd "$WORKING_DIRECTORY"; if test -z "$1" || test "a--help" = "a$1" ; then echo 'nix-reduce-build (paths or Nix expressions) -- (package sources)' >&2 echo As in: >&2 echo nix-reduce-build /etc/nixos/nixos -- ssh://user@somewhere.nowhere.example.org >&2 echo nix-reduce-build /etc/nixos/nixos -- \\ echo " " \''http://somewhere.nowhere.example.org/nix/nix-http-export.cgi?needed_path='\' >&2 echo " store path name will be added into the end of the URL" >&2 echo nix-reduce-build /etc/nixos/nixos -- file://home/user/nar/ >&2 echo " that should be a directory where gzipped 'nix-store --export' ">&2 echo " files are located (they should have .nar.gz extension)" >&2 echo " Or all together: " >&2 echo -e nix-reduce-build /expr.nix /e2.nix -- \\\\\\\n\ " ssh://a@b.example.com http://n.example.com/get-nar?q= file://nar/" >&2 echo " Also supports best-effort local builds of failing expression set:" >&2 echo "nix-reduce-build /e.nix -- nix-daemon:// nix-self://" >&2 echo " nix-daemon:// builds using daemon" echo " nix-self:// builds directly using nix-store from current installation" >&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_DIR:-/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 sshHost="${i#ssh://}"; httpHost="${i#http://}"; httpsHost="${i#https://}"; filePath="${i#file:/}"; if [ "$i" != "$sshHost" ]; then cat needed-paths | while read; do echo "Getting $REPLY and its closure over ssh" >&2 nix-copy-closure --from "$sshHost" --gzip "$REPLY" &2 curl ${BAD_CERTIFICATE:+-k} -L "$i${REPLY##*/}" | gunzip | nix-store --import; done; elif [ "$i" != "$filePath" ] ; then cat needed-paths | while read; do echo "Installing $REPLY from file" >&2 gunzip < "$filePath/${REPLY##*/}".nar.gz | nix-store --import; done; elif [ "$i" = "nix-daemon://" ] ; then cat needed-paths | while read ; do echo "Building $REPLY using nix-daemon" >&2 NIX_REMOTE=daemon @bindir@/nix-store -r "${NIX_STORE_DIR:-/nix/store}/${REPLY##*/}" done; cat derivers-closure | while read; do echo "Realising $REPLY using nix-daemon" >&2 NIX_REMOTE=daemon @bindir@/nix-store -r "${REPLY}" done; elif [ "$i" = "nix-self://" ] ; then cat needed-paths | while read ; do echo "Building $REPLY using direct Nix build" >&2 NIX_REMOTE= @bindir@/nix-store -r "${NIX_STORE_DIR:-/nix/store}/${REPLY##*/}" done; cat derivers-closure | while read; do echo "Realising $REPLY using direct Nix build" >&2 NIX_REMOTE= @bindir@/nix-store -r "${REPLY}" done; fi; mv needed-paths wanted-paths; cat wanted-paths | xargs nix-store --check-validity --print-invalid > needed-paths; echo We still need $(cat needed-paths | wc -l) paths. >&2 done; cd / rm -r "$WORKING_DIRECTORY"