From b455c4c45cba49397952e662cace85aedb6848fe Mon Sep 17 00:00:00 2001 From: Michael Raskin <7c6f434c@mail.ru> Date: Wed, 6 Aug 2008 19:43:53 +0000 Subject: [PATCH] Updates to nix-reduce-build Common code in local build package sources refactored out in a function; before building the real set of derivations needed is found (slightly slower for only one build strategy, but less garbage on output and better performance for multiple build strategies). Now you have full choice of best-effort build regardless of method (substituters or actual build), using substituters, building only fixed derivations (should get you all the downloads) and local build without even trying substituters. Some minor fix in the help text about behavior with no package sources. --- scripts/nix-reduce-build.in | 76 ++++++++++++++++++++++++------------- 1 file changed, 50 insertions(+), 26 deletions(-) diff --git a/scripts/nix-reduce-build.in b/scripts/nix-reduce-build.in index 7da368a22c..0c33275d5e 100644 --- a/scripts/nix-reduce-build.in +++ b/scripts/nix-reduce-build.in @@ -24,6 +24,9 @@ if test -z "$1" || test "a--help" = "a$1" ; then echo "derivations with specified output hash (sha256, sha1 or md5)." >&2 echo " nix-daemon-substitute:// and nix-self-substitute:// try to substitute" >&2; echo "maximum amount of paths" >&2; + echo " nix-daemon-build:// and nix-self-build:// try to build (not substitute)" >&2; + echo "maximum amount of paths" >&2; + echo " If no package sources are specified, required paths are listed." >&2; exit; fi; @@ -71,10 +74,37 @@ 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 +egrep '[.]drv$' derivers-closure > critical-derivers; + if test -z "$1" ; then cat needed-paths; fi; +refresh_critical_derivers() { + echo "Finding needed derivers..." >&2; + cat critical-derivers | while read; do + if ! (nix-store --query --outputs "$REPLY" | xargs nix-store --check-validity &> /dev/null;); then + echo "$REPLY"; + fi; + done > new-critical-derivers; + mv new-critical-derivers critical-derivers; + echo The needed paths are realized by $(cat critical-derivers | wc -l) derivers. >&2 +} + +build_here() { + cat critical-derivers | while read; do + echo "Realising $REPLY using nix-daemon" >&2 + @bindir@/nix-store -r "${REPLY}" + done; +} + +try_to_substitute(){ + cat needed-paths | while read ; do + echo "Building $REPLY using nix-daemon" >&2 + @bindir@/nix-store -r "${NIX_STORE_DIR:-/nix/store}/${REPLY##*/}" + done; +} + for i in "$@"; do sshHost="${i#ssh://}"; httpHost="${i#http://}"; @@ -96,47 +126,41 @@ for i in "$@"; do 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; + NIX_REMOTE=daemon try_to_substitute; + refresh_critical_derivers; + NIX_REMOTE=daemon build_here; 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; + NIX_REMOTE= try_to_substitute; + refresh_critical_derivers; + NIX_REMOTE= build_here; elif [ "$i" = "nix-daemon-fixed://" ] ; then - cat derivers-closure | while read; do + refresh_critical_derivers; + + cat critical-derivers | while read; do if egrep '"(md5|sha1|sha256)"' "$REPLY" &>/dev/null; then echo "Realising $REPLY using nix-daemon" >&2 NIX_REMOTE=daemon @bindir@/nix-store -r "${REPLY}" fi; done; elif [ "$i" = "nix-self-fixed://" ] ; then - cat derivers-closure | while read; do + refresh_critical_derivers; + + cat critical-derivers | while read; do if egrep '"(md5|sha1|sha256)"' "$REPLY" &>/dev/null; then echo "Realising $REPLY using direct Nix build" >&2 NIX_REMOTE= @bindir@/nix-store -r "${REPLY}" fi; done; elif [ "$i" = "nix-daemon-substitute://" ] ; then - cat needed-paths | while read ; do - echo "Substituting $REPLY using nix-daemon" >&2 - NIX_REMOTE=daemon @bindir@/nix-store -r "${NIX_STORE_DIR:-/nix/store}/${REPLY##*/}" - done; + NIX_REMOTE=daemon try_to_substitute; elif [ "$i" = "nix-self-substitute://" ] ; then - cat needed-paths | while read ; do - echo "Substituting $REPLY using direct Nix build" >&2 - NIX_REMOTE= @bindir@/nix-store -r "${NIX_STORE_DIR:-/nix/store}/${REPLY##*/}" - done; + NIX_REMOTE= try_to_substitute; + elif [ "$i" = "nix-daemon-build://" ] ; then + refresh_critical_derivers; + NIX_REMOTE=daemon build_here; + elif [ "$i" = "nix-self-build://" ] ; then + refresh_critical_derivers; + NIX_REMOTE= build_here; fi; mv needed-paths wanted-paths; cat wanted-paths | xargs nix-store --check-validity --print-invalid > needed-paths;