about summary refs log tree commit diff
path: root/src/libstore
diff options
context:
space:
mode:
Diffstat (limited to 'src/libstore')
-rw-r--r--src/libstore/store.cc50
-rw-r--r--src/libstore/store.hh13
2 files changed, 50 insertions, 13 deletions
diff --git a/src/libstore/store.cc b/src/libstore/store.cc
index e9d65404400e..5742bbb73870 100644
--- a/src/libstore/store.cc
+++ b/src/libstore/store.cc
@@ -508,24 +508,48 @@ Hash queryPathHash(const Path & path)
 
 
 void registerValidPath(const Transaction & txn,
-    const Path & _path, const Hash & hash, const PathSet & references,
+    const Path & path, const Hash & hash, const PathSet & references,
     const Path & deriver)
 {
-    Path path(canonPath(_path));
-    assertStorePath(path);
+    ValidPathInfo info;
+    info.path = path;
+    info.hash = hash;
+    info.references = references;
+    info.deriver = deriver;
+    ValidPathInfos infos;
+    infos.push_back(info);
+    registerValidPaths(txn, infos);
+}
 
-    debug(format("registering path `%1%'") % path);
-    setHash(txn, path, hash);
 
-    setReferences(txn, path, references);
-    
-    /* Check that all referenced paths are also valid. */
-    for (PathSet::iterator i = references.begin(); i != references.end(); ++i)
-        if (!isValidPathTxn(txn, *i))
-            throw Error(format("cannot register path `%1%' as valid, since its reference `%2%' is invalid")
-                % path % *i);
+void registerValidPaths(const Transaction & txn,
+    const ValidPathInfos & infos)
+{
+    PathSet newPaths;
+    for (ValidPathInfos::const_iterator i = infos.begin();
+         i != infos.end(); ++i)
+        newPaths.insert(i->path);
+        
+    for (ValidPathInfos::const_iterator i = infos.begin();
+         i != infos.end(); ++i)
+    {
+        assertStorePath(i->path);
+
+        debug(format("registering path `%1%'") % i->path);
+        setHash(txn, i->path, i->hash);
 
-    setDeriver(txn, path, deriver);
+        setReferences(txn, i->path, i->references);
+    
+        /* Check that all referenced paths are also valid (or about to
+           become valid). */
+        for (PathSet::iterator j = i->references.begin();
+             j != i->references.end(); ++j)
+            if (!isValidPathTxn(txn, *j) && newPaths.find(*j) == newPaths.end())
+                throw Error(format("cannot register path `%1%' as valid, since its reference `%2%' is invalid")
+                    % i->path % *j);
+
+        setDeriver(txn, i->path, i->deriver);
+    }
 }
 
 
diff --git a/src/libstore/store.hh b/src/libstore/store.hh
index 4a37a66322aa..01a971404c5c 100644
--- a/src/libstore/store.hh
+++ b/src/libstore/store.hh
@@ -66,6 +66,19 @@ void registerValidPath(const Transaction & txn,
     const Path & path, const Hash & hash, const PathSet & references,
     const Path & deriver);
 
+struct ValidPathInfo 
+{
+    Path path;
+    Path deriver;
+    Hash hash;
+    PathSet references;
+};
+
+typedef list<ValidPathInfo> ValidPathInfos;
+
+void registerValidPaths(const Transaction & txn,
+    const ValidPathInfos & infos);
+
 /* Throw an exception if `path' is not directly in the Nix store. */
 void assertStorePath(const Path & path);