fix(3p/nix): Update for usage of new attribute set API

The new attribute set API uses the iterators of the btree_map
directly. This requires changes in various files because the internals
of libexpr are very entangled.

This code runs and compiles, but there is a bug causing empty
attribute sets to be assigned incorrectly.
This commit is contained in:
Vincent Ambo 2020-05-22 01:58:12 +01:00
parent 42205f27fc
commit 986a8f6b75
14 changed files with 187 additions and 176 deletions

View file

@ -31,11 +31,11 @@ static void showAttrs(EvalState& state, bool strict, bool location,
StringSet names;
for (auto& i : attrs) {
names.insert(i.name);
names.insert(i.second.name);
}
for (auto& i : names) {
Attr& a(*attrs.find(state.symbols.Create(i)));
auto& [_, a] = *attrs.find(state.symbols.Create(i));
XMLAttrs xmlAttrs;
xmlAttrs["name"] = i;
@ -43,7 +43,7 @@ static void showAttrs(EvalState& state, bool strict, bool location,
posToXML(xmlAttrs, *a.pos);
}
XMLOpenElement _(doc, "attr", xmlAttrs);
XMLOpenElement elem(doc, "attr", xmlAttrs);
printValueAsXML(state, strict, location, *a.value, doc, context, drvsSeen);
}
}
@ -93,20 +93,20 @@ static void printValueAsXML(EvalState& state, bool strict, bool location,
a = v.attrs->find(state.sDrvPath);
if (a != v.attrs->end()) {
if (strict) {
state.forceValue(*a->value);
state.forceValue(*a->second.value);
}
if (a->value->type == tString) {
xmlAttrs["drvPath"] = drvPath = a->value->string.s;
if (a->second.value->type == tString) {
xmlAttrs["drvPath"] = drvPath = a->second.value->string.s;
}
}
a = v.attrs->find(state.sOutPath);
if (a != v.attrs->end()) {
if (strict) {
state.forceValue(*a->value);
state.forceValue(*a->second.value);
}
if (a->value->type == tString) {
xmlAttrs["outPath"] = a->value->string.s;
if (a->second.value->type == tString) {
xmlAttrs["outPath"] = a->second.value->string.s;
}
}