Check meta values and warn about bad ones
This commit is contained in:
		
							parent
							
								
									0f24400d90
								
							
						
					
					
						commit
						30b986908e
					
				
					 4 changed files with 54 additions and 26 deletions
				
			
		|  | @ -91,12 +91,30 @@ StringSet DrvInfo::queryMetaNames() | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | bool DrvInfo::checkMeta(Value & v) | ||||||
|  | { | ||||||
|  |     state->forceValue(v); | ||||||
|  |     if (v.type == tList) { | ||||||
|  |         for (unsigned int n = 0; n < v.list.length; ++n) | ||||||
|  |             if (!checkMeta(*v.list.elems[n])) return false; | ||||||
|  |         return true; | ||||||
|  |     } | ||||||
|  |     else if (v.type == tAttrs) { | ||||||
|  |         Bindings::iterator i = v.attrs->find(state->sOutPath); | ||||||
|  |         if (i != v.attrs->end()) return false; | ||||||
|  |         foreach (Bindings::iterator, i, *v.attrs) | ||||||
|  |             if (!checkMeta(*i->value)) return false; | ||||||
|  |         return true; | ||||||
|  |     } | ||||||
|  |     else return v.type == tInt || v.type == tBool || v.type == tString; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
| Value * DrvInfo::queryMeta(const string & name) | Value * DrvInfo::queryMeta(const string & name) | ||||||
| { | { | ||||||
|     if (!getMeta()) return 0; |     if (!getMeta()) return 0; | ||||||
|     Bindings::iterator a = meta->find(state->symbols.create(name)); |     Bindings::iterator a = meta->find(state->symbols.create(name)); | ||||||
|     if (a == meta->end()) return 0; |     if (a == meta->end() || !checkMeta(*a->value)) return 0; | ||||||
|     state->forceValue(*a->value); |  | ||||||
|     return a->value; |     return a->value; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -30,6 +30,8 @@ private: | ||||||
| 
 | 
 | ||||||
|     Bindings * getMeta(); |     Bindings * getMeta(); | ||||||
| 
 | 
 | ||||||
|  |     bool checkMeta(Value & v); | ||||||
|  | 
 | ||||||
| public: | public: | ||||||
|     string name; |     string name; | ||||||
|     string attrPath; /* path towards the derivation */ |     string attrPath; /* path towards the derivation */ | ||||||
|  |  | ||||||
|  | @ -873,8 +873,12 @@ static void queryJSON(Globals & globals, vector<DrvInfo> & elems) | ||||||
|         foreach (StringSet::iterator, j, metaNames) { |         foreach (StringSet::iterator, j, metaNames) { | ||||||
|             metaObj.attr(*j); |             metaObj.attr(*j); | ||||||
|             Value * v = i->queryMeta(*j); |             Value * v = i->queryMeta(*j); | ||||||
|             PathSet context; |             if (!v) | ||||||
|             printValueAsJSON(globals.state, true, *v, cout, context); |                 printMsg(lvlError, format("derivation `%1%' has invalid meta attribute `%2%'") % i->name % *j); | ||||||
|  |             else { | ||||||
|  |                 PathSet context; | ||||||
|  |                 printValueAsJSON(globals.state, true, *v, cout, context); | ||||||
|  |             } | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  | @ -1112,27 +1116,31 @@ static void opQuery(Globals & globals, | ||||||
|                         foreach (StringSet::iterator, j, metaNames) { |                         foreach (StringSet::iterator, j, metaNames) { | ||||||
|                             XMLAttrs attrs2; |                             XMLAttrs attrs2; | ||||||
|                             attrs2["name"] = *j; |                             attrs2["name"] = *j; | ||||||
|                             Value & v(*i->queryMeta(*j)); |                             Value * v = i->queryMeta(*j); | ||||||
|                             if (v.type == tString) { |                             if (!v) | ||||||
|                                 attrs2["type"] = "string"; |                                 printMsg(lvlError, format("derivation `%1%' has invalid meta attribute `%2%'") % i->name % *j); | ||||||
|                                 attrs2["value"] = v.string.s; |                             else { | ||||||
|                                 xml.writeEmptyElement("meta", attrs2); |                                 if (v->type == tString) { | ||||||
|                             } else if (v.type == tInt) { |                                     attrs2["type"] = "string"; | ||||||
|                                 attrs2["type"] = "int"; |                                     attrs2["value"] = v->string.s; | ||||||
|                                 attrs2["value"] = (format("%1%") % v.integer).str(); |                                     xml.writeEmptyElement("meta", attrs2); | ||||||
|                                 xml.writeEmptyElement("meta", attrs2); |                                 } else if (v->type == tInt) { | ||||||
|                             } else if (v.type == tBool) { |                                     attrs2["type"] = "int"; | ||||||
|                                 attrs2["type"] = "bool"; |                                     attrs2["value"] = (format("%1%") % v->integer).str(); | ||||||
|                                 attrs2["value"] = v.boolean ? "true" : "false"; |                                     xml.writeEmptyElement("meta", attrs2); | ||||||
|                                 xml.writeEmptyElement("meta", attrs2); |                                 } else if (v->type == tBool) { | ||||||
|                             } else if (v.type == tList) { |                                     attrs2["type"] = "bool"; | ||||||
|                                 attrs2["type"] = "strings"; |                                     attrs2["value"] = v->boolean ? "true" : "false"; | ||||||
|                                 XMLOpenElement m(xml, "meta", attrs2); |                                     xml.writeEmptyElement("meta", attrs2); | ||||||
|                                 for (unsigned int j = 0; j < v.list.length; ++j) { |                                 } else if (v->type == tList) { | ||||||
|                                     string s = globals.state.forceStringNoCtx(*v.list.elems[j]); |                                     attrs2["type"] = "strings"; | ||||||
|                                     XMLAttrs attrs3; |                                     XMLOpenElement m(xml, "meta", attrs2); | ||||||
|                                     attrs3["value"] = s; |                                     for (unsigned int j = 0; j < v->list.length; ++j) { | ||||||
|                                     xml.writeEmptyElement("string", attrs3); |                                         if (v->list.elems[j]->type != tString) continue; | ||||||
|  |                                         XMLAttrs attrs3; | ||||||
|  |                                         attrs3["value"] = v->list.elems[j]->string.s; | ||||||
|  |                                         xml.writeEmptyElement("string", attrs3); | ||||||
|  |                                     } | ||||||
|                                 } |                                 } | ||||||
|                             } |                             } | ||||||
|                         } |                         } | ||||||
|  |  | ||||||
|  | @ -88,7 +88,7 @@ bool createUserEnv(EvalState & state, DrvInfos & elems, | ||||||
|         StringSet metaNames = i->queryMetaNames(); |         StringSet metaNames = i->queryMetaNames(); | ||||||
|         foreach (StringSet::iterator, j, metaNames) { |         foreach (StringSet::iterator, j, metaNames) { | ||||||
|             Value * v = i->queryMeta(*j); |             Value * v = i->queryMeta(*j); | ||||||
|             state.strictForceValue(*v); // FIXME
 |             if (!v) continue; | ||||||
|             vMeta.attrs->push_back(Attr(state.symbols.create(*j), v)); |             vMeta.attrs->push_back(Attr(state.symbols.create(*j), v)); | ||||||
|         } |         } | ||||||
|         v.attrs->sort(); |         v.attrs->sort(); | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue