diff options
-rw-r--r-- | src/store.cc | 33 | ||||
-rw-r--r-- | src/store.hh | 3 |
2 files changed, 21 insertions, 15 deletions
diff --git a/src/store.cc b/src/store.cc index 8d424bc59027..2facb4cb1a20 100644 --- a/src/store.cc +++ b/src/store.cc @@ -181,7 +181,7 @@ bool isInPrefix(const string & path, const string & _prefix) string expandId(const FSId & id, const string & target, - const string & prefix, FSIdSet pending) + const string & prefix, FSIdSet pending, bool ignoreSubstitutes) { Nest nest(lvlDebug, format("expanding %1%") % (string) id); @@ -221,23 +221,27 @@ string expandId(const FSId & id, const string & target, } } - if (pending.find(id) != pending.end()) - throw Error(format("id %1% already being expanded") % (string) id); - pending.insert(id); + if (!ignoreSubstitutes) { + + if (pending.find(id) != pending.end()) + throw Error(format("id %1% already being expanded") % (string) id); + pending.insert(id); - /* Try to realise the substitutes, but only if this id is not - already being realised by a substitute. */ - Strings subs; - nixDB.queryStrings(noTxn, dbSubstitutes, id, subs); /* non-existence = ok */ + /* Try to realise the substitutes, but only if this id is not + already being realised by a substitute. */ + Strings subs; + nixDB.queryStrings(noTxn, dbSubstitutes, id, subs); /* non-existence = ok */ - for (Strings::iterator it = subs.begin(); it != subs.end(); it++) { - FSId subId = parseHash(*it); + for (Strings::iterator it = subs.begin(); it != subs.end(); it++) { + FSId subId = parseHash(*it); - debug(format("trying substitute %1%") % (string) subId); + debug(format("trying substitute %1%") % (string) subId); - realiseSlice(normaliseFState(subId, pending), pending); + realiseSlice(normaliseFState(subId, pending), pending); + + return expandId(id, target, prefix, pending); + } - return expandId(id, target, prefix, pending); } throw Error(format("cannot expand id `%1%'") % (string) id); @@ -257,7 +261,8 @@ void addToStore(string srcPath, string & dstPath, FSId & id, try { /* !!! should not use the substitutes! */ - dstPath = expandId(id, deterministicName ? dstPath : "", nixStore); + dstPath = expandId(id, deterministicName ? dstPath : "", + nixStore, FSIdSet(), true); return; } catch (...) { } diff --git a/src/store.hh b/src/store.hh index b2cdc41f166e..d1f1be6689ed 100644 --- a/src/store.hh +++ b/src/store.hh @@ -35,7 +35,8 @@ bool queryPathId(const string & path, FSId & id); substitute (since when we build the substitute, we would first try to expand the id... kaboom!). */ string expandId(const FSId & id, const string & target = "", - const string & prefix = "/", FSIdSet pending = FSIdSet()); + const string & prefix = "/", FSIdSet pending = FSIdSet(), + bool ignoreSubstitutes = false); /* Copy a file to the nixStore directory and register it in dbRefs. Return the hash code of the value. */ |