* Fix self-referential outputs.
* Fix -qp query.
This commit is contained in:
		
							parent
							
								
									d41d085b77
								
							
						
					
					
						commit
						c11bbcfd26
					
				
					 5 changed files with 28 additions and 30 deletions
				
			
		|  | @ -164,7 +164,7 @@ static Expr evalExpr(Expr e) | |||
|             char * id; | ||||
| 
 | ||||
|             if (ATmatch(value, "FSId(<str>)", &id)) { | ||||
|                 Strings paths = fstatePaths(parseHash(id)); | ||||
|                 Strings paths = fstatePaths(parseHash(id), false); | ||||
|                 if (paths.size() != 1) abort(); | ||||
|                 string path = *(paths.begin()); | ||||
|                 ins = ATinsert(ins, ATmake("<str>", id)); | ||||
|  |  | |||
|  | @ -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(); | ||||
|  |  | |||
|  | @ -74,20 +74,6 @@ struct Slice | |||
| }; | ||||
| 
 | ||||
| 
 | ||||
| #if 0 | ||||
| /* Realise an fstate expression in the file system.  This requires
 | ||||
|    execution of all Derive() nodes. */ | ||||
| FState realiseFState(FState fs, StringSet & paths); | ||||
| 
 | ||||
| /* Return the path of an fstate expression.  An empty string is
 | ||||
|    returned if the term is not a valid fstate expression. (!!!) */ | ||||
| string fstatePath(FState fs); | ||||
| 
 | ||||
| /* Return the paths referenced by fstate expression. */ | ||||
| void fstateRefs(FState fs, StringSet & paths); | ||||
| #endif | ||||
| 
 | ||||
| 
 | ||||
| /* Return a canonical textual representation of an expression. */ | ||||
| string printTerm(ATerm t); | ||||
| 
 | ||||
|  | @ -115,7 +101,7 @@ Slice normaliseFState(FSId id); | |||
| /* Realise a Slice in the file system. */ | ||||
| void realiseSlice(const Slice & slice); | ||||
| 
 | ||||
| Strings fstatePaths(FSId id); | ||||
| Strings fstatePaths(FSId id, bool normalise); | ||||
| 
 | ||||
| 
 | ||||
| #endif /* !__FSTATE_H */ | ||||
|  |  | |||
|  | @ -157,14 +157,15 @@ static void opQuery(Strings opFlags, Strings opArgs) | |||
| 
 | ||||
|         switch (query) { | ||||
| 
 | ||||
| #if 0 | ||||
|         case qPath: { | ||||
|             StringSet refs; | ||||
|             cout << format("%s\n") %  | ||||
|                 (string) fstatePath(realiseFState(termFromHash(hash), refs)); | ||||
|             Strings paths = fstatePaths(id, true); | ||||
|             for (Strings::iterator i = paths.begin();  | ||||
|                  i != paths.end(); i++) | ||||
|                 cout << format("%s\n") % *i; | ||||
|             break; | ||||
|         } | ||||
| 
 | ||||
| #if 0 | ||||
|         case qRefs: { | ||||
|             StringSet refs; | ||||
|             FState fs = hash2fstate(hash); | ||||
|  |  | |||
|  | @ -6,3 +6,4 @@ mkdir $out || exit 1 | |||
| cd $out || exit 1 | ||||
| echo "Hallo Wereld" > bla | ||||
| echo $builder >> bla | ||||
| echo $out >> bla | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue