From a824d58b566752b2a89a718fd628053754968d72 Mon Sep 17 00:00:00 2001 From: Eelco Dolstra Date: Fri, 1 Dec 2006 20:51:18 +0000 Subject: [PATCH] * Merge addToStore and addToStoreFixed. * addToStore now adds unconditionally, it doesn't use readOnlyMode. Read-only operation is up to the caller (who can call computeStorePathForPath). --- src/Makefile.am | 2 -- src/libexpr/eval.cc | 5 ++++- src/libstore/local-store.cc | 26 +++++++------------------- src/libstore/local-store.hh | 24 ++++++++---------------- src/libstore/remote-store.cc | 32 ++++---------------------------- src/libstore/remote-store.hh | 6 ++---- src/libstore/store-api.cc | 4 ++-- src/libstore/store-api.hh | 17 +++++++---------- src/libstore/worker-protocol.hh | 1 - src/nix-store/main.cc | 2 +- src/nix-worker/main.cc | 17 +++++------------ 11 files changed, 40 insertions(+), 96 deletions(-) diff --git a/src/Makefile.am b/src/Makefile.am index 601e0726b..92a7b6e15 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -2,5 +2,3 @@ SUBDIRS = bin2c boost libutil libstore libmain nix-store nix-hash \ libexpr nix-instantiate nix-env nix-worker nix-log2xml bsdiff-4.3 EXTRA_DIST = aterm-helper.pl - -#SETUID_PROGS = nix-store nix-instantiate nix-env diff --git a/src/libexpr/eval.cc b/src/libexpr/eval.cc index 04712e74b..e58ff695c 100644 --- a/src/libexpr/eval.cc +++ b/src/libexpr/eval.cc @@ -5,6 +5,7 @@ #include "store-api.hh" #include "derivations.hh" #include "nixexpr-ast.hh" +#include "globals.hh" namespace nix { @@ -251,7 +252,9 @@ string coerceToString(EvalState & state, Expr e, PathSet & context, if (state.srcToStore[path] != "") dstPath = state.srcToStore[path]; else { - dstPath = store->addToStore(path); + dstPath = readOnlyMode + ? computeStorePathForPath(path).first + : store->addToStore(path); state.srcToStore[path] = dstPath; printMsg(lvlChatty, format("copied source `%1%' -> `%2%'") % path % dstPath); diff --git a/src/libstore/local-store.cc b/src/libstore/local-store.cc index ed948cf4e..2f2a1b436 100644 --- a/src/libstore/local-store.cc +++ b/src/libstore/local-store.cc @@ -619,20 +619,20 @@ static void invalidatePath(Transaction & txn, const Path & path) } -Path LocalStore::_addToStore(bool fixed, bool recursive, - string hashAlgo, const Path & _srcPath) +Path LocalStore::addToStore(const Path & _srcPath, bool fixed, + bool recursive, string hashAlgo) { Path srcPath(absPath(_srcPath)); debug(format("adding `%1%' to the store") % srcPath); std::pair pr = - computeStorePathForPath(fixed, recursive, hashAlgo, srcPath); + computeStorePathForPath(srcPath, fixed, recursive, hashAlgo); Path & dstPath(pr.first); Hash & h(pr.second); - if (!readOnlyMode) addTempRoot(dstPath); + addTempRoot(dstPath); - if (!readOnlyMode && !isValidPath(dstPath)) { + if (!isValidPath(dstPath)) { /* The first check above is an optimisation to prevent unnecessary lock acquisition. */ @@ -664,26 +664,14 @@ Path LocalStore::_addToStore(bool fixed, bool recursive, } -Path LocalStore::addToStore(const Path & srcPath) -{ - return _addToStore(false, false, "", srcPath); -} - - -Path LocalStore::addToStoreFixed(bool recursive, string hashAlgo, const Path & srcPath) -{ - return _addToStore(true, recursive, hashAlgo, srcPath); -} - - Path LocalStore::addTextToStore(const string & suffix, const string & s, const PathSet & references) { Path dstPath = computeStorePathForText(suffix, s); - if (!readOnlyMode) addTempRoot(dstPath); + addTempRoot(dstPath); - if (!readOnlyMode && !isValidPath(dstPath)) { + if (!isValidPath(dstPath)) { PathLocks outputLock(singleton(dstPath)); diff --git a/src/libstore/local-store.hh b/src/libstore/local-store.hh index e41e43683..3a7b22048 100644 --- a/src/libstore/local-store.hh +++ b/src/libstore/local-store.hh @@ -45,27 +45,19 @@ public: Hash queryPathHash(const Path & path); - void queryReferences(const Path & storePath, - PathSet & references); + void queryReferences(const Path & path, PathSet & references); - void queryReferrers(const Path & storePath, - PathSet & referrers); + void queryReferrers(const Path & path, PathSet & referrers); - Path addToStore(const Path & srcPath); - - Path addToStoreFixed(bool recursive, string hashAlgo, - const Path & srcPath); + Path addToStore(const Path & srcPath, bool fixed = false, + bool recursive = false, string hashAlgo = ""); Path addTextToStore(const string & suffix, const string & s, const PathSet & references); void buildDerivations(const PathSet & drvPaths); - void ensurePath(const Path & storePath); - -private: - Path _addToStore(bool fixed, bool recursive, - string hashAlgo, const Path & _srcPath); + void ensurePath(const Path & path); }; @@ -120,16 +112,16 @@ bool isValidPathTxn(const Transaction & txn, const Path & path); /* Sets the set of outgoing FS references for a store path. Use with care! */ -void setReferences(const Transaction & txn, const Path & storePath, +void setReferences(const Transaction & txn, const Path & path, const PathSet & references); /* Sets the deriver of a store path. Use with care! */ -void setDeriver(const Transaction & txn, const Path & storePath, +void setDeriver(const Transaction & txn, const Path & path, const Path & deriver); /* Query the deriver of a store path. Return the empty string if no deriver has been set. */ -Path queryDeriver(const Transaction & txn, const Path & storePath); +Path queryDeriver(const Transaction & txn, const Path & path); /* Delete a value from the nixStore directory. */ void deleteFromStore(const Path & path, unsigned long long & bytesFreed); diff --git a/src/libstore/remote-store.cc b/src/libstore/remote-store.cc index e04bb6713..bcae21bf7 100644 --- a/src/libstore/remote-store.cc +++ b/src/libstore/remote-store.cc @@ -3,7 +3,6 @@ #include "remote-store.hh" #include "worker-protocol.hh" #include "archive.hh" -#include "globals.hh" #include #include @@ -123,33 +122,14 @@ void RemoteStore::queryReferrers(const Path & path, } -Path RemoteStore::addToStore(const Path & srcPath) +Path RemoteStore::addToStore(const Path & _srcPath, bool fixed, + bool recursive, string hashAlgo) { - if (readOnlyMode) { - /* No sense in making a round trip, we can just compute the - path here. */ - return computeStorePathForPath(false, false, "", srcPath).first; - } + Path srcPath(absPath(_srcPath)); writeInt(wopAddToStore, to); writeString(baseNameOf(srcPath), to); - dumpPath(srcPath, to); - Path path = readString(from); - return path; -} - - -Path RemoteStore::addToStoreFixed(bool recursive, string hashAlgo, - const Path & srcPath) -{ - if (readOnlyMode) { - /* No sense in making a round trip, we can just compute the - path here. */ - return computeStorePathForPath(true, recursive, hashAlgo, srcPath).first; - } - - writeInt(wopAddToStoreFixed, to); - writeString(baseNameOf(srcPath), to); + writeInt(fixed ? 1 : 0, to); writeInt(recursive ? 1 : 0, to); writeString(hashAlgo, to); dumpPath(srcPath, to); @@ -161,10 +141,6 @@ Path RemoteStore::addToStoreFixed(bool recursive, string hashAlgo, Path RemoteStore::addTextToStore(const string & suffix, const string & s, const PathSet & references) { - if (readOnlyMode) { - return computeStorePathForText(suffix, s); - } - writeInt(wopAddTextToStore, to); writeString(suffix, to); writeString(s, to); diff --git a/src/libstore/remote-store.hh b/src/libstore/remote-store.hh index eaa9b82ee..62feee0ea 100644 --- a/src/libstore/remote-store.hh +++ b/src/libstore/remote-store.hh @@ -37,10 +37,8 @@ public: void queryReferrers(const Path & path, PathSet & referrers); - Path addToStore(const Path & srcPath); - - Path addToStoreFixed(bool recursive, string hashAlgo, - const Path & srcPath); + Path addToStore(const Path & srcPath, bool fixed = false, + bool recursive = false, string hashAlgo = ""); Path addTextToStore(const string & suffix, const string & s, const PathSet & references); diff --git a/src/libstore/store-api.cc b/src/libstore/store-api.cc index e00f01bfd..a560b3f55 100644 --- a/src/libstore/store-api.cc +++ b/src/libstore/store-api.cc @@ -93,8 +93,8 @@ Path makeFixedOutputPath(bool recursive, } -std::pair computeStorePathForPath(bool fixed, bool recursive, - string hashAlgo, const Path & srcPath) +std::pair computeStorePathForPath(const Path & srcPath, + bool fixed, bool recursive, string hashAlgo) { Hash h(htSHA256); { diff --git a/src/libstore/store-api.hh b/src/libstore/store-api.hh index cbf2f7ef2..6fbe97931 100644 --- a/src/libstore/store-api.hh +++ b/src/libstore/store-api.hh @@ -63,14 +63,11 @@ public: PathSet & referrers) = 0; /* Copy the contents of a path to the store and register the - validity the resulting path. The resulting path is - returned. */ - virtual Path addToStore(const Path & srcPath) = 0; - - /* Like addToStore(), but for pre-adding the outputs of - fixed-output derivations. */ - virtual Path addToStoreFixed(bool recursive, string hashAlgo, - const Path & srcPath) = 0; + validity the resulting path. The resulting path is returned. + If `fixed' is true, then the output of a fixed-output + derivation is pre-loaded into the Nix store. */ + virtual Path addToStore(const Path & srcPath, bool fixed = false, + bool recursive = false, string hashAlgo = "") = 0; /* Like addToStore, but the contents written to the output path is a regular file containing the given string. */ @@ -119,8 +116,8 @@ Path makeFixedOutputPath(bool recursive, it computes the store path to which srcPath is to be copied. Returns the store path and the cryptographic hash of the contents of srcPath. */ -std::pair computeStorePathForPath(bool fixed, bool recursive, - string hashAlgo, const Path & srcPath); +std::pair computeStorePathForPath(const Path & srcPath, + bool fixed = false, bool recursive = false, string hashAlgo = ""); /* Preparatory part of addTextToStore(). diff --git a/src/libstore/worker-protocol.hh b/src/libstore/worker-protocol.hh index 16b616c80..65f5fc100 100644 --- a/src/libstore/worker-protocol.hh +++ b/src/libstore/worker-protocol.hh @@ -15,7 +15,6 @@ typedef enum { wopQueryReferences, wopQueryReferrers, wopAddToStore, - wopAddToStoreFixed, wopAddTextToStore, wopBuildDerivations, wopEnsurePath, diff --git a/src/nix-store/main.cc b/src/nix-store/main.cc index c3755c2a1..ad346c91f 100644 --- a/src/nix-store/main.cc +++ b/src/nix-store/main.cc @@ -133,7 +133,7 @@ static void opAddFixed(Strings opFlags, Strings opArgs) opArgs.pop_front(); for (Strings::iterator i = opArgs.begin(); i != opArgs.end(); ++i) - cout << format("%1%\n") % store->addToStoreFixed(recursive, hashAlgo, *i); + cout << format("%1%\n") % store->addToStore(*i, true, recursive, hashAlgo); } diff --git a/src/nix-worker/main.cc b/src/nix-worker/main.cc index 3642697dc..6d6571536 100644 --- a/src/nix-worker/main.cc +++ b/src/nix-worker/main.cc @@ -79,25 +79,18 @@ void processConnection(Source & from, Sink & to) break; } - case wopAddToStore: - case wopAddToStoreFixed: { + case wopAddToStore: { /* !!! uberquick hack */ string baseName = readString(from); - bool recursive = false; - string hashAlgo; - if (op == wopAddToStoreFixed) { - recursive = readInt(from) == 1; - hashAlgo = readString(from); - } + bool fixed = readInt(from) == 1; + bool recursive = readInt(from) == 1; + string hashAlgo = readString(from); Path tmp = createTempDir(); Path tmp2 = tmp + "/" + baseName; restorePath(tmp2, from); - if (op == wopAddToStoreFixed) - writeString(store->addToStoreFixed(recursive, hashAlgo, tmp2), to); - else - writeString(store->addToStore(tmp2), to); + writeString(store->addToStore(tmp2, fixed, recursive, hashAlgo), to); deletePath(tmp); break;