From ab649814fc9b5ee6b8a1d8d5cd501442a5f66b17 Mon Sep 17 00:00:00 2001 From: Wouter den Breejen Date: Tue, 4 Mar 2008 12:15:55 +0000 Subject: [PATCH] Merged trunk R.10943 back in --- mergeTrunkBackIn.sh | 5 ++- scripts/Makefile.am | 7 ++-- scripts/nix-reduce-build.in | 68 +++++++++++++++++++++++++++++++++++++ src/libexpr/nixexpr.cc | 6 +++- src/libstore/local-store.cc | 11 ++---- 5 files changed, 84 insertions(+), 13 deletions(-) create mode 100644 scripts/nix-reduce-build.in diff --git a/mergeTrunkBackIn.sh b/mergeTrunkBackIn.sh index 223670ad3..c502b76c4 100755 --- a/mergeTrunkBackIn.sh +++ b/mergeTrunkBackIn.sh @@ -1,4 +1,4 @@ -svn merge -r 10154:10531 https://svn.cs.uu.nl:12443/repos/trace/nix/trunk +svn merge -r 10855:10943 https://svn.cs.uu.nl:12443/repos/trace/nix/trunk #already done: # 8628 @@ -31,3 +31,6 @@ svn merge -r 10154:10531 https://svn.cs.uu.nl:12443/repos/trace/nix/trunk # 10133 # 10154 # 10531 +# 10692 +# 10855 +# 10943 diff --git a/scripts/Makefile.am b/scripts/Makefile.am index e79db31b7..fa66e5894 100644 --- a/scripts/Makefile.am +++ b/scripts/Makefile.am @@ -2,10 +2,10 @@ bin_SCRIPTS = nix-collect-garbage \ nix-pull nix-push nix-prefetch-url \ nix-install-package nix-channel nix-build \ nix-pack-closure nix-unpack-closure \ - nix-copy-closure + nix-copy-closure noinst_SCRIPTS = nix-profile.sh generate-patches.pl \ - find-runtime-roots.pl build-remote.pl + find-runtime-roots.pl build-remote.pl nix-reduce-build nix-pull nix-push: readmanifest.pm readconfig.pm download-using-manifests.pl @@ -35,4 +35,5 @@ EXTRA_DIST = nix-collect-garbage.in \ nix-pack-closure.in nix-unpack-closure.in \ nix-copy-closure.in \ find-runtime-roots.pl.in \ - build-remote.pl.in + build-remote.pl.in \ + nix-reduce-build.in diff --git a/scripts/nix-reduce-build.in b/scripts/nix-reduce-build.in new file mode 100644 index 000000000..6d7f8bdd7 --- /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" diff --git a/src/libexpr/nixexpr.cc b/src/libexpr/nixexpr.cc index 123513594..1eeec2cf1 100644 --- a/src/libexpr/nixexpr.cc +++ b/src/libexpr/nixexpr.cc @@ -215,7 +215,11 @@ static void checkVarDefs2(set & done, const ATermMap & defs, Expr e) ATerm with, body; ATermList rbnds, nrbnds; - if (matchVar(e, name)) { + /* Closed terms don't have free variables, so we don't have to + check by definition. */ + if (matchClosed(e, value)) return; + + else if (matchVar(e, name)) { if (!defs.get(name)) throw EvalError(format("undefined variable `%1%'") % aterm2String(name)); diff --git a/src/libstore/local-store.cc b/src/libstore/local-store.cc index 6a8050d1c..a0006ddfb 100644 --- a/src/libstore/local-store.cc +++ b/src/libstore/local-store.cc @@ -1136,11 +1136,8 @@ void LocalStore::exportPath(const Path & path, bool sign, { assertStorePath(path); - /* Wrap all of this in a transaction to make sure that we export - consistent metadata. */ - Transaction txn(nixDB); addTempRoot(path); - if (!isValidPathTxn(txn, path)) + if (!isValidPath(path)) throw Error(format("path `%1%' is not valid") % path); HashAndWriteSink hashAndWriteSink(sink); @@ -1152,10 +1149,10 @@ void LocalStore::exportPath(const Path & path, bool sign, writeString(path, hashAndWriteSink); PathSet references; - nix::queryXReferencesTxn(txn, path, references, true, 0); //TODO we can only now export the final revision //TODO also export the state references ??? + queryXReferencesTxn(noTxn, path, references, true, 0); //TODO we can export the inital or latest revision //TODO also export the state references ??? writeStringSet(references, hashAndWriteSink); - Path deriver = nix::queryDeriver(txn, path); + Path deriver = queryDeriver(path); writeString(deriver, hashAndWriteSink); if (sign) { @@ -1185,8 +1182,6 @@ void LocalStore::exportPath(const Path & path, bool sign, } else writeInt(0, hashAndWriteSink); - - txn.commit(); }