diff options
Diffstat (limited to 'src/nix-env')
-rw-r--r-- | src/nix-env/nix-env.cc | 54 | ||||
-rw-r--r-- | src/nix-env/user-env.cc | 2 |
2 files changed, 32 insertions, 24 deletions
diff --git a/src/nix-env/nix-env.cc b/src/nix-env/nix-env.cc index 2d548ba1abd1..cf74747dacdd 100644 --- a/src/nix-env/nix-env.cc +++ b/src/nix-env/nix-env.cc @@ -873,8 +873,12 @@ static void queryJSON(Globals & globals, vector<DrvInfo> & elems) foreach (StringSet::iterator, j, metaNames) { metaObj.attr(*j); Value * v = i->queryMeta(*j); - PathSet context; - printValueAsJSON(globals.state, true, *v, cout, context); + if (!v) + 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) { XMLAttrs attrs2; attrs2["name"] = *j; - Value & v(*i->queryMeta(*j)); - if (v.type == tString) { - attrs2["type"] = "string"; - attrs2["value"] = v.string.s; - xml.writeEmptyElement("meta", attrs2); - } else if (v.type == tInt) { - attrs2["type"] = "int"; - attrs2["value"] = (format("%1%") % v.integer).str(); - xml.writeEmptyElement("meta", attrs2); - } else if (v.type == tBool) { - attrs2["type"] = "bool"; - attrs2["value"] = v.boolean ? "true" : "false"; - xml.writeEmptyElement("meta", attrs2); - } else if (v.type == tList) { - attrs2["type"] = "strings"; - XMLOpenElement m(xml, "meta", attrs2); - for (unsigned int j = 0; j < v.list.length; ++j) { - string s = globals.state.forceStringNoCtx(*v.list.elems[j]); - XMLAttrs attrs3; - attrs3["value"] = s; - xml.writeEmptyElement("string", attrs3); + Value * v = i->queryMeta(*j); + if (!v) + printMsg(lvlError, format("derivation `%1%' has invalid meta attribute `%2%'") % i->name % *j); + else { + if (v->type == tString) { + attrs2["type"] = "string"; + attrs2["value"] = v->string.s; + xml.writeEmptyElement("meta", attrs2); + } else if (v->type == tInt) { + attrs2["type"] = "int"; + attrs2["value"] = (format("%1%") % v->integer).str(); + xml.writeEmptyElement("meta", attrs2); + } else if (v->type == tBool) { + attrs2["type"] = "bool"; + attrs2["value"] = v->boolean ? "true" : "false"; + xml.writeEmptyElement("meta", attrs2); + } else if (v->type == tList) { + attrs2["type"] = "strings"; + XMLOpenElement m(xml, "meta", attrs2); + for (unsigned int j = 0; j < v->list.length; ++j) { + if (v->list.elems[j]->type != tString) continue; + XMLAttrs attrs3; + attrs3["value"] = v->list.elems[j]->string.s; + xml.writeEmptyElement("string", attrs3); + } } } } diff --git a/src/nix-env/user-env.cc b/src/nix-env/user-env.cc index 0ef28a12e73f..c2dab4f0c757 100644 --- a/src/nix-env/user-env.cc +++ b/src/nix-env/user-env.cc @@ -88,7 +88,7 @@ bool createUserEnv(EvalState & state, DrvInfos & elems, StringSet metaNames = i->queryMetaNames(); foreach (StringSet::iterator, j, metaNames) { Value * v = i->queryMeta(*j); - state.strictForceValue(*v); // FIXME + if (!v) continue; vMeta.attrs->push_back(Attr(state.symbols.create(*j), v)); } v.attrs->sort(); |