aboutsummaryrefslogtreecommitdiff
path: root/src/nix-env
diff options
context:
space:
mode:
authorEelco Dolstra <eelco.dolstra@logicblox.com>2013-11-19 14:29:39 +0100
committerEelco Dolstra <eelco.dolstra@logicblox.com>2013-11-19 14:29:39 +0100
commit30b986908eed5d8fd6a2b21da98878f2a0bf19c0 (patch)
tree90193b0624a66c87297b6be0aeb50851fe918b88 /src/nix-env
parent0f24400d90daf65cf20142a662f8245008437e2c (diff)
Check meta values and warn about bad ones
Diffstat (limited to 'src/nix-env')
-rw-r--r--src/nix-env/nix-env.cc54
-rw-r--r--src/nix-env/user-env.cc2
2 files changed, 32 insertions, 24 deletions
diff --git a/src/nix-env/nix-env.cc b/src/nix-env/nix-env.cc
index 2d548ba1a..cf74747da 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 0ef28a12e..c2dab4f0c 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();