Merge pull request #7941 from edolstra/stdout

Check writes to stdout
This commit is contained in:
Eelco Dolstra 2023-03-02 15:57:31 +01:00 committed by GitHub
commit b9370fd7a0
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
18 changed files with 42 additions and 46 deletions

View file

@ -32,7 +32,8 @@ void Logger::warn(const std::string & msg)
void Logger::writeToStdout(std::string_view s) void Logger::writeToStdout(std::string_view s)
{ {
std::cout << s << "\n"; writeFull(STDOUT_FILENO, s);
writeFull(STDOUT_FILENO, "\n");
} }
class SimpleLogger : public Logger class SimpleLogger : public Logger

View file

@ -102,11 +102,9 @@ public:
virtual void writeToStdout(std::string_view s); virtual void writeToStdout(std::string_view s);
template<typename... Args> template<typename... Args>
inline void cout(const std::string & fs, const Args & ... args) inline void cout(const Args & ... args)
{ {
boost::format f(fs); writeToStdout(fmt(args...));
formatHelper(f, args...);
writeToStdout(f.str());
} }
virtual std::optional<char> ask(std::string_view s) virtual std::optional<char> ask(std::string_view s)

View file

@ -139,11 +139,11 @@ struct CmdBuild : InstallablesCommand, MixDryRun, MixJSON, MixProfile
for (auto & buildable : buildables) { for (auto & buildable : buildables) {
std::visit(overloaded { std::visit(overloaded {
[&](const BuiltPath::Opaque & bo) { [&](const BuiltPath::Opaque & bo) {
std::cout << store->printStorePath(bo.path) << std::endl; logger->cout(store->printStorePath(bo.path));
}, },
[&](const BuiltPath::Built & bfd) { [&](const BuiltPath::Built & bfd) {
for (auto & output : bfd.outputs) { for (auto & output : bfd.outputs) {
std::cout << store->printStorePath(output.second) << std::endl; logger->cout(store->printStorePath(output.second));
} }
}, },
}, buildable.path.raw()); }, buildable.path.raw());

View file

@ -17,7 +17,7 @@ struct MixCat : virtual Args
if (st.type != FSAccessor::Type::tRegular) if (st.type != FSAccessor::Type::tRegular)
throw Error("path '%1%' is not a regular file", path); throw Error("path '%1%' is not a regular file", path);
std::cout << accessor->readFile(path); writeFull(STDOUT_FILENO, accessor->readFile(path));
} }
}; };

View file

@ -25,7 +25,7 @@ struct CmdDescribeStores : Command, MixJSON
res[storeName] = storeConfig->toJSON(); res[storeName] = storeConfig->toJSON();
} }
if (json) { if (json) {
std::cout << res; logger->cout("%s", res);
} else { } else {
for (auto & [storeName, storeConfig] : res.items()) { for (auto & [storeName, storeConfig] : res.items()) {
std::cout << "## " << storeName << std::endl << std::endl; std::cout << "## " << storeName << std::endl << std::endl;

View file

@ -97,7 +97,7 @@ void printClosureDiff(
items.push_back(fmt("%s → %s", showVersions(removed), showVersions(added))); items.push_back(fmt("%s → %s", showVersions(removed), showVersions(added)));
if (showDelta) if (showDelta)
items.push_back(fmt("%s%+.1f KiB" ANSI_NORMAL, sizeDelta > 0 ? ANSI_RED : ANSI_GREEN, sizeDelta / 1024.0)); items.push_back(fmt("%s%+.1f KiB" ANSI_NORMAL, sizeDelta > 0 ? ANSI_RED : ANSI_GREEN, sizeDelta / 1024.0));
std::cout << fmt("%s%s: %s\n", indent, name, concatStringsSep(", ", items)); logger->cout("%s%s: %s", indent, name, concatStringsSep(", ", items));
} }
} }
} }

View file

@ -112,11 +112,11 @@ struct CmdEval : MixJSON, InstallableCommand, MixReadOnlyOption
else if (raw) { else if (raw) {
stopProgressBar(); stopProgressBar();
std::cout << *state->coerceToString(noPos, *v, context, "while generating the eval command output"); writeFull(STDOUT_FILENO, *state->coerceToString(noPos, *v, context, "while generating the eval command output"));
} }
else if (json) { else if (json) {
std::cout << printValueAsJSON(*state, true, *v, pos, context, false).dump() << std::endl; logger->cout("%s", printValueAsJSON(*state, true, *v, pos, context, false));
} }
else { else {

View file

@ -952,7 +952,7 @@ struct CmdFlakeArchive : FlakeCommand, MixJSON, MixDryRun
{"path", store->printStorePath(flake.flake.sourceInfo->storePath)}, {"path", store->printStorePath(flake.flake.sourceInfo->storePath)},
{"inputs", traverse(*flake.lockFile.root)}, {"inputs", traverse(*flake.lockFile.root)},
}; };
std::cout << jsonRoot.dump() << std::endl; logger->cout("%s", jsonRoot);
} else { } else {
traverse(*flake.lockFile.root); traverse(*flake.lockFile.root);
} }

View file

@ -53,7 +53,7 @@ struct CmdLog : InstallableCommand
if (!log) continue; if (!log) continue;
stopProgressBar(); stopProgressBar();
printInfo("got build log for '%s' from '%s'", installable->what(), logSub.getUri()); printInfo("got build log for '%s' from '%s'", installable->what(), logSub.getUri());
std::cout << *log; writeFull(STDOUT_FILENO, *log);
return; return;
} }

View file

@ -93,7 +93,7 @@ struct MixLs : virtual Args, MixJSON
if (json) { if (json) {
if (showDirectory) if (showDirectory)
throw UsageError("'--directory' is useless with '--json'"); throw UsageError("'--directory' is useless with '--json'");
std::cout << listNar(accessor, path, recursive); logger->cout("%s", listNar(accessor, path, recursive));
} else } else
listText(accessor); listText(accessor);
} }

View file

@ -292,7 +292,7 @@ void mainWrapped(int argc, char * * argv)
NixArgs args; NixArgs args;
if (argc == 2 && std::string(argv[1]) == "__dump-args") { if (argc == 2 && std::string(argv[1]) == "__dump-args") {
std::cout << args.toJSON().dump() << "\n"; logger->cout("%s", args.toJSON());
return; return;
} }
@ -312,7 +312,7 @@ void mainWrapped(int argc, char * * argv)
b["doc"] = trim(stripIndentation(primOp->doc)); b["doc"] = trim(stripIndentation(primOp->doc));
res[state.symbols[builtin.name]] = std::move(b); res[state.symbols[builtin.name]] = std::move(b);
} }
std::cout << res.dump() << "\n"; logger->cout("%s", res);
return; return;
} }
@ -321,14 +321,14 @@ void mainWrapped(int argc, char * * argv)
if (completions) { if (completions) {
switch (completionType) { switch (completionType) {
case ctNormal: case ctNormal:
std::cout << "normal\n"; break; logger->cout("normal"); break;
case ctFilenames: case ctFilenames:
std::cout << "filenames\n"; break; logger->cout("filenames"); break;
case ctAttrs: case ctAttrs:
std::cout << "attrs\n"; break; logger->cout("attrs"); break;
} }
for (auto & s : *completions) for (auto & s : *completions)
std::cout << s.completion << "\t" << trim(s.description) << "\n"; logger->cout(s.completion + "\t" + trim(s.description));
} }
}); });

View file

@ -45,7 +45,7 @@ struct CmdMakeContentAddressed : virtual CopyCommand, virtual StorePathsCommand,
} }
auto json = json::object(); auto json = json::object();
json["rewrites"] = jsonRewrites; json["rewrites"] = jsonRewrites;
std::cout << json.dump(); logger->cout("%s", json);
} else { } else {
for (auto & path : storePaths) { for (auto & path : storePaths) {
auto i = remappings.find(path); auto i = remappings.find(path);

View file

@ -234,9 +234,9 @@ static int main_nix_prefetch_url(int argc, char * * argv)
if (!printPath) if (!printPath)
printInfo("path is '%s'", store->printStorePath(storePath)); printInfo("path is '%s'", store->printStorePath(storePath));
std::cout << printHash16or32(hash) << std::endl; logger->cout(printHash16or32(hash));
if (printPath) if (printPath)
std::cout << store->printStorePath(storePath) << std::endl; logger->cout(store->printStorePath(storePath));
return 0; return 0;
} }

View file

@ -228,12 +228,12 @@ struct ProfileManifest
while (i != prevElems.end() || j != curElems.end()) { while (i != prevElems.end() || j != curElems.end()) {
if (j != curElems.end() && (i == prevElems.end() || i->describe() > j->describe())) { if (j != curElems.end() && (i == prevElems.end() || i->describe() > j->describe())) {
std::cout << fmt("%s%s: ∅ -> %s\n", indent, j->describe(), j->versions()); logger->cout("%s%s: ∅ -> %s", indent, j->describe(), j->versions());
changes = true; changes = true;
++j; ++j;
} }
else if (i != prevElems.end() && (j == curElems.end() || i->describe() < j->describe())) { else if (i != prevElems.end() && (j == curElems.end() || i->describe() < j->describe())) {
std::cout << fmt("%s%s: %s -> ∅\n", indent, i->describe(), i->versions()); logger->cout("%s%s: %s -> ∅", indent, i->describe(), i->versions());
changes = true; changes = true;
++i; ++i;
} }
@ -241,7 +241,7 @@ struct ProfileManifest
auto v1 = i->versions(); auto v1 = i->versions();
auto v2 = j->versions(); auto v2 = j->versions();
if (v1 != v2) { if (v1 != v2) {
std::cout << fmt("%s%s: %s -> %s\n", indent, i->describe(), v1, v2); logger->cout("%s%s: %s -> %s", indent, i->describe(), v1, v2);
changes = true; changes = true;
} }
++i; ++i;
@ -250,7 +250,7 @@ struct ProfileManifest
} }
if (!changes) if (!changes)
std::cout << fmt("%sNo changes.\n", indent); logger->cout("%sNo changes.", indent);
} }
}; };
@ -640,9 +640,9 @@ struct CmdProfileDiffClosures : virtual StoreCommand, MixDefaultProfile
for (auto & gen : gens) { for (auto & gen : gens) {
if (prevGen) { if (prevGen) {
if (!first) std::cout << "\n"; if (!first) logger->cout("");
first = false; first = false;
std::cout << fmt("Version %d -> %d:\n", prevGen->number, gen.number); logger->cout("Version %d -> %d:", prevGen->number, gen.number);
printClosureDiff(store, printClosureDiff(store,
store->followLinksToStorePath(prevGen->path), store->followLinksToStorePath(prevGen->path),
store->followLinksToStorePath(gen.path), store->followLinksToStorePath(gen.path),
@ -678,10 +678,10 @@ struct CmdProfileHistory : virtual StoreCommand, EvalCommand, MixDefaultProfile
for (auto & gen : gens) { for (auto & gen : gens) {
ProfileManifest manifest(*getEvalState(), gen.path); ProfileManifest manifest(*getEvalState(), gen.path);
if (!first) std::cout << "\n"; if (!first) logger->cout("");
first = false; first = false;
std::cout << fmt("Version %s%d" ANSI_NORMAL " (%s)%s:\n", logger->cout("Version %s%d" ANSI_NORMAL " (%s)%s:",
gen.number == curGen ? ANSI_GREEN : ANSI_BOLD, gen.number == curGen ? ANSI_GREEN : ANSI_BOLD,
gen.number, gen.number,
std::put_time(std::gmtime(&gen.creationTime), "%Y-%m-%d"), std::put_time(std::gmtime(&gen.creationTime), "%Y-%m-%d"),

View file

@ -65,18 +65,16 @@ struct CmdRealisationInfo : BuiltPathsCommand, MixJSON
res.push_back(currentPath); res.push_back(currentPath);
} }
std::cout << res.dump(); logger->cout("%s", res);
} }
else { else {
for (auto & path : realisations) { for (auto & path : realisations) {
if (auto realisation = std::get_if<Realisation>(&path.raw)) { if (auto realisation = std::get_if<Realisation>(&path.raw)) {
std::cout << logger->cout("%s %s",
realisation->id.to_string() << " " << realisation->id.to_string(),
store->printStorePath(realisation->outPath); store->printStorePath(realisation->outPath));
} else } else
std::cout << store->printStorePath(path.path()); logger->cout("%s", store->printStorePath(path.path()));
std::cout << std::endl;
} }
} }
} }

View file

@ -196,9 +196,8 @@ struct CmdSearch : InstallableCommand, MixJSON
for (auto & cursor : installable->getCursors(*state)) for (auto & cursor : installable->getCursors(*state))
visit(*cursor, cursor->getAttrPath(), true); visit(*cursor, cursor->getAttrPath(), true);
if (json) { if (json)
std::cout << jsonOut->dump() << std::endl; logger->cout("%s", *jsonOut);
}
if (!json && !results) if (!json && !results)
throw Error("no results for the given search term(s)!"); throw Error("no results for the given search term(s)!");

View file

@ -57,7 +57,7 @@ struct CmdShowDerivation : InstallablesCommand
jsonRoot[store->printStorePath(drvPath)] = jsonRoot[store->printStorePath(drvPath)] =
store->readDerivation(drvPath).toJSON(*store); store->readDerivation(drvPath).toJSON(*store);
} }
std::cout << jsonRoot.dump(2) << std::endl; logger->cout(jsonRoot.dump(2));
} }
}; };

View file

@ -173,7 +173,7 @@ struct CmdKeyGenerateSecret : Command
if (!keyName) if (!keyName)
throw UsageError("required argument '--key-name' is missing"); throw UsageError("required argument '--key-name' is missing");
std::cout << SecretKey::generate(*keyName).to_string(); writeFull(STDOUT_FILENO, SecretKey::generate(*keyName).to_string());
} }
}; };
@ -194,7 +194,7 @@ struct CmdKeyConvertSecretToPublic : Command
void run() override void run() override
{ {
SecretKey secretKey(drainFD(STDIN_FILENO)); SecretKey secretKey(drainFD(STDIN_FILENO));
std::cout << secretKey.toPublicKey().to_string(); writeFull(STDOUT_FILENO, secretKey.toPublicKey().to_string());
} }
}; };