about summary refs log tree commit diff
path: root/src/fstate.cc
diff options
context:
space:
mode:
authorEelco Dolstra <e.dolstra@tudelft.nl>2003-07-16T08·30+0000
committerEelco Dolstra <e.dolstra@tudelft.nl>2003-07-16T08·30+0000
commitc11bbcfd26e554ca044c1cce293097e4e87ef31e (patch)
treeccbaf5b13b7f4d6de35ef7fcdaa00e51f194a25d /src/fstate.cc
parentd41d085b771d0f87658fe22512178603b3a0c633 (diff)
* Fix self-referential outputs.
* Fix -qp query.

Diffstat (limited to 'src/fstate.cc')
-rw-r--r--src/fstate.cc30
1 files changed, 20 insertions, 10 deletions
diff --git a/src/fstate.cc b/src/fstate.cc
index d15219344fc9..60a8d475c981 100644
--- a/src/fstate.cc
+++ b/src/fstate.cc
@@ -332,19 +332,19 @@ Slice normaliseFState(FSId id)
     }
 
     /* Check that none of the output paths exist. */
-    typedef pair<string, FSId> OutPath;
-    list<OutPath> outPaths;
+    typedef map<string, FSId> OutPaths;
+    OutPaths outPaths;
     while (!ATisEmpty(outs)) {
         ATerm t = ATgetFirst(outs);
         char * s1, * s2;
         if (!ATmatch(t, "(<str>, <str>)", &s1, &s2))
             throw badTerm("string expected", t);
-        outPaths.push_back(OutPath(s1, parseHash(s2)));
+        outPaths[s1] = parseHash(s2);
         inPaths.push_back(s1);
         outs = ATgetNext(outs);
     }
 
-    for (list<OutPath>::iterator i = outPaths.begin(); 
+    for (OutPaths::iterator i = outPaths.begin(); 
          i != outPaths.end(); i++)
         if (pathExists(i->first))
             throw Error(format("path `%1%' exists") % i->first);
@@ -357,7 +357,7 @@ Slice normaliseFState(FSId id)
     /* Check whether the output paths were created, and register each
        one. */
     FSIdSet used;
-    for (list<OutPath>::iterator i = outPaths.begin(); 
+    for (OutPaths::iterator i = outPaths.begin(); 
          i != outPaths.end(); i++)
     {
         string path = i->first;
@@ -374,10 +374,15 @@ Slice normaliseFState(FSId id)
 
         for (Strings::iterator j = refs.begin(); j != refs.end(); j++) {
             ElemMap::iterator k;
+            OutPaths::iterator l;
             if ((k = inMap.find(*j)) != inMap.end()) {
                 elem.refs.push_back(k->second.id);
                 used.insert(k->second.id);
-            } else abort(); /* fix! check in created paths */
+            } else if ((l = outPaths.find(*j)) != outPaths.end()) {
+                elem.refs.push_back(l->second);
+                used.insert(l->second);
+            } else 
+                throw Error(format("unknown referenced path `%1%'") % *j);
         }
 
         slice.elems.push_back(elem);
@@ -470,7 +475,7 @@ void realiseSlice(const Slice & slice)
 }
 
 
-Strings fstatePaths(FSId id)
+Strings fstatePaths(FSId id, bool normalise)
 {
     Strings paths;
 
@@ -480,10 +485,15 @@ Strings fstatePaths(FSId id)
     char * builder;
     char * platform;
 
-    if (ATgetType(fs) == AT_APPL && 
-        (string) ATgetName(ATgetAFun(fs)) == "Slice")
+    if (normalise ||
+        (ATgetType(fs) == AT_APPL && 
+         (string) ATgetName(ATgetAFun(fs)) == "Slice"))
     {
-        Slice slice = parseSlice(fs);
+        Slice slice;
+        if (normalise)
+            slice = normaliseFState(id);
+        else
+            slice = parseSlice(fs);
 
         /* !!! fix complexity */
         for (FSIds::const_iterator i = slice.roots.begin();