about summary refs log tree commit diff
path: root/src/libstore/misc.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/libstore/misc.cc')
-rw-r--r--src/libstore/misc.cc47
1 files changed, 46 insertions, 1 deletions
diff --git a/src/libstore/misc.cc b/src/libstore/misc.cc
index 33efe8bebc98..91cf25f27187 100644
--- a/src/libstore/misc.cc
+++ b/src/libstore/misc.cc
@@ -29,10 +29,55 @@ void computeFSClosure(const Path & storePath,
 }
 
 
- Path findOutput(const Derivation & drv, string id)
+Path findOutput(const Derivation & drv, string id)
 {
     for (DerivationOutputs::const_iterator i = drv.outputs.begin();
          i != drv.outputs.end(); ++i)
         if (i->first == id) return i->second.path;
     throw Error(format("derivation has no output `%1%'") % id);
 }
+
+
+void queryMissing(const PathSet & targets,
+    PathSet & willBuild, PathSet & willSubstitute)
+{
+    PathSet todo(targets.begin(), targets.end()), done;
+
+    while (!todo.empty()) {
+        Path p = *(todo.begin());
+        todo.erase(p);
+        if (done.find(p) != done.end()) continue;
+        done.insert(p);
+
+        if (isDerivation(p)) {
+            if (!isValidPath(p)) continue;
+            Derivation drv = derivationFromPath(p);
+
+            bool mustBuild = false;
+            for (DerivationOutputs::iterator i = drv.outputs.begin();
+                 i != drv.outputs.end(); ++i)
+                if (!isValidPath(i->second.path) &&
+                    querySubstitutes(noTxn, i->second.path).size() == 0)
+                    mustBuild = true;
+
+            if (mustBuild) {
+                willBuild.insert(p);
+                todo.insert(drv.inputSrcs.begin(), drv.inputSrcs.end());
+                for (DerivationInputs::iterator i = drv.inputDrvs.begin();
+                     i != drv.inputDrvs.end(); ++i)
+                    todo.insert(i->first);
+            } else 
+                for (DerivationOutputs::iterator i = drv.outputs.begin();
+                     i != drv.outputs.end(); ++i)
+                    todo.insert(i->second.path);
+        }
+
+        else {
+            if (isValidPath(p)) continue;
+            if (querySubstitutes(noTxn, p).size() > 0)
+                willSubstitute.insert(p);
+            PathSet refs;
+            queryReferences(noTxn, p, todo);
+        }
+    }
+}