Merge pull request #5922 from fzakaria/fzakaria/json-ignore-assertion

Add try/catch to queryJSON for assertion and errors
This commit is contained in:
Eelco Dolstra 2022-01-25 12:44:20 +01:00 committed by GitHub
commit a04a66c196
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 38 additions and 25 deletions

4
.gitignore vendored
View file

@ -120,3 +120,7 @@ GTAGS
compile_commands.json compile_commands.json
nix-rust/target nix-rust/target
result
.vscode/

View file

@ -911,36 +911,45 @@ static void queryJSON(Globals & globals, vector<DrvInfo> & elems, bool printOutP
{ {
JSONObject topObj(cout, true); JSONObject topObj(cout, true);
for (auto & i : elems) { for (auto & i : elems) {
JSONObject pkgObj = topObj.object(i.attrPath); try {
if (i.hasFailed()) continue;
auto drvName = DrvName(i.queryName()); JSONObject pkgObj = topObj.object(i.attrPath);
pkgObj.attr("name", drvName.fullName);
pkgObj.attr("pname", drvName.name);
pkgObj.attr("version", drvName.version);
pkgObj.attr("system", i.querySystem());
if (printOutPath) { auto drvName = DrvName(i.queryName());
DrvInfo::Outputs outputs = i.queryOutputs(); pkgObj.attr("name", drvName.fullName);
JSONObject outputObj = pkgObj.object("outputs"); pkgObj.attr("pname", drvName.name);
for (auto & j : outputs) { pkgObj.attr("version", drvName.version);
outputObj.attr(j.first, j.second); pkgObj.attr("system", i.querySystem());
}
}
if (printMeta) { if (printOutPath) {
JSONObject metaObj = pkgObj.object("meta"); DrvInfo::Outputs outputs = i.queryOutputs();
StringSet metaNames = i.queryMetaNames(); JSONObject outputObj = pkgObj.object("outputs");
for (auto & j : metaNames) { for (auto & j : outputs) {
auto placeholder = metaObj.placeholder(j); outputObj.attr(j.first, j.second);
Value * v = i.queryMeta(j);
if (!v) {
printError("derivation '%s' has invalid meta attribute '%s'", i.queryName(), j);
placeholder.write(nullptr);
} else {
PathSet context;
printValueAsJSON(*globals.state, true, *v, noPos, placeholder, context);
} }
} }
if (printMeta) {
JSONObject metaObj = pkgObj.object("meta");
StringSet metaNames = i.queryMetaNames();
for (auto & j : metaNames) {
auto placeholder = metaObj.placeholder(j);
Value * v = i.queryMeta(j);
if (!v) {
printError("derivation '%s' has invalid meta attribute '%s'", i.queryName(), j);
placeholder.write(nullptr);
} else {
PathSet context;
printValueAsJSON(*globals.state, true, *v, noPos, placeholder, context);
}
}
}
} catch (AssertionError & e) {
printMsg(lvlTalkative, "skipping derivation named '%1%' which gives an assertion failure", i.queryName());
} catch (Error & e) {
e.addTrace(std::nullopt, "while querying the derivation named '%1%'", i.queryName());
throw;
} }
} }
} }