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)
{
std::cout << s << "\n";
writeFull(STDOUT_FILENO, s);
writeFull(STDOUT_FILENO, "\n");
}
class SimpleLogger : public Logger
@ -84,7 +85,7 @@ public:
void startActivity(ActivityId act, Verbosity lvl, ActivityType type,
const std::string & s, const Fields & fields, ActivityId parent)
override
override
{
if (lvl <= verbosity && !s.empty())
log(lvl, s + "...");

View file

@ -102,11 +102,9 @@ public:
virtual void writeToStdout(std::string_view s);
template<typename... Args>
inline void cout(const std::string & fs, const Args & ... args)
inline void cout(const Args & ... args)
{
boost::format f(fs);
formatHelper(f, args...);
writeToStdout(f.str());
writeToStdout(fmt(args...));
}
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) {
std::visit(overloaded {
[&](const BuiltPath::Opaque & bo) {
std::cout << store->printStorePath(bo.path) << std::endl;
logger->cout(store->printStorePath(bo.path));
},
[&](const BuiltPath::Built & bfd) {
for (auto & output : bfd.outputs) {
std::cout << store->printStorePath(output.second) << std::endl;
logger->cout(store->printStorePath(output.second));
}
},
}, buildable.path.raw());

View file

@ -17,7 +17,7 @@ struct MixCat : virtual Args
if (st.type != FSAccessor::Type::tRegular)
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();
}
if (json) {
std::cout << res;
logger->cout("%s", res);
} else {
for (auto & [storeName, storeConfig] : res.items()) {
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)));
if (showDelta)
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) {
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) {
std::cout << printValueAsJSON(*state, true, *v, pos, context, false).dump() << std::endl;
logger->cout("%s", printValueAsJSON(*state, true, *v, pos, context, false));
}
else {

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -228,12 +228,12 @@ struct ProfileManifest
while (i != prevElems.end() || j != curElems.end()) {
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;
++j;
}
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;
++i;
}
@ -241,7 +241,7 @@ struct ProfileManifest
auto v1 = i->versions();
auto v2 = j->versions();
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;
}
++i;
@ -250,7 +250,7 @@ struct ProfileManifest
}
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) {
if (prevGen) {
if (!first) std::cout << "\n";
if (!first) logger->cout("");
first = false;
std::cout << fmt("Version %d -> %d:\n", prevGen->number, gen.number);
logger->cout("Version %d -> %d:", prevGen->number, gen.number);
printClosureDiff(store,
store->followLinksToStorePath(prevGen->path),
store->followLinksToStorePath(gen.path),
@ -678,10 +678,10 @@ struct CmdProfileHistory : virtual StoreCommand, EvalCommand, MixDefaultProfile
for (auto & gen : gens) {
ProfileManifest manifest(*getEvalState(), gen.path);
if (!first) std::cout << "\n";
if (!first) logger->cout("");
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,
std::put_time(std::gmtime(&gen.creationTime), "%Y-%m-%d"),

View file

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

View file

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

View file

@ -57,7 +57,7 @@ struct CmdShowDerivation : InstallablesCommand
jsonRoot[store->printStorePath(drvPath)] =
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)
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
{
SecretKey secretKey(drainFD(STDIN_FILENO));
std::cout << secretKey.toPublicKey().to_string();
writeFull(STDOUT_FILENO, secretKey.toPublicKey().to_string());
}
};