about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--src/store.cc33
-rw-r--r--src/store.hh3
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. */