libmain/main: propagate status codes via return values for mainWrapped

This also prevent `legacy` to return nothing as it's void.

Change-Id: Ic797544a59b04b41ad9e1c46af4cad3a1cb6fdc8
Signed-off-by: Raito Bezarius <raito@lix.systems>
This commit is contained in:
Raito Bezarius
2025-10-28 20:38:39 +01:00
parent 2c176afa7a
commit 56b4ed3908
4 changed files with 19 additions and 15 deletions
+2 -3
View File
@@ -313,8 +313,7 @@ void showManPage(const std::string & name)
throw SysError("command 'man %1%' failed", name.c_str());
}
int handleExceptions(const std::string & programName, std::function<void()> fun)
int handleExceptions(const std::string & programName, std::function<int()> fun)
{
ReceiveInterrupts receiveInterrupts; // FIXME: need better place for this
@@ -324,7 +323,7 @@ int handleExceptions(const std::string & programName, std::function<void()> fun)
bool onlyForSubcommands = baseNameOf(programName) == "lix";
try {
fun();
return fun();
} catch (Exit & e) {
return e.status;
} catch (UsageError & e) {
+1 -1
View File
@@ -14,7 +14,7 @@
namespace nix {
int handleExceptions(const std::string & programName, std::function<void()> fun);
int handleExceptions(const std::string & programName, std::function<int()> fun);
/**
* Don't forget to call initPlugins() after settings are initialized!
+14 -11
View File
@@ -453,7 +453,7 @@ void registerNixHelp()
registerCommand<CmdHelpStores>("help-stores");
}
void mainWrapped(AsyncIoRoot & aio, int argc, char * * argv)
int mainWrapped(AsyncIoRoot & aio, int argc, char ** argv)
{
savedArgv = argv;
@@ -461,7 +461,7 @@ void mainWrapped(AsyncIoRoot & aio, int argc, char * * argv)
started. */
if (argc > 0 && argv[0] == chrootHelperName) {
chrootHelper(argc, argv);
return;
return 0;
}
initNix();
@@ -493,7 +493,8 @@ void mainWrapped(AsyncIoRoot & aio, int argc, char * * argv)
registerLegacyCommands();
auto legacy = (*LegacyCommandRegistry::commands)[programName];
if (legacy) {
return legacy(aio, std::string(baseNameOf(argv[0])), Strings(argv + 1, argv + argc));
legacy(aio, std::string(baseNameOf(argv[0])), Strings(argv + 1, argv + argc));
return 0;
}
}
@@ -516,7 +517,7 @@ void mainWrapped(AsyncIoRoot & aio, int argc, char * * argv)
if (argc == 2 && std::string(argv[1]) == "__dump-cli") {
logger->cout(args.dumpCli());
return;
return 0;
}
if (argc == 2 && std::string(argv[1]) == "__dump-language") {
@@ -559,17 +560,17 @@ void mainWrapped(AsyncIoRoot & aio, int argc, char * * argv)
std::move(constantsJson);
});
logger->cout("%s", res);
return;
return 0;
}
if (argc == 2 && std::string(argv[1]) == "__dump-xp-features") {
logger->cout(documentExperimentalFeatures().dump());
return;
return 0;
}
if (argc == 2 && std::string(argv[1]) == "__dump-dp-features") {
logger->cout(documentDeprecatedFeatures().dump());
return;
return 0;
}
try {
@@ -589,7 +590,7 @@ void mainWrapped(AsyncIoRoot & aio, int argc, char * * argv)
}
for (auto & s : args.completions->completions)
logger->cout(s.completion + "\t" + trim(s.description));
return;
return 0;
}
if (args.helpRequested) {
@@ -603,12 +604,12 @@ void mainWrapped(AsyncIoRoot & aio, int argc, char * * argv)
break;
}
showHelp(aio, subcommand, args);
return;
return 0;
}
if (args.showVersion) {
printVersion(programName);
return;
return 0;
}
if (!args.command)
@@ -643,6 +644,8 @@ void mainWrapped(AsyncIoRoot & aio, int argc, char * * argv)
evalSettings.pureEval.setDefault(false);
}
args.run();
return 0;
}
}
@@ -660,6 +663,6 @@ int main(int argc, char * * argv)
return nix::handleExceptions(argv[0], [&]() {
nix::AsyncIoRoot aio;
nix::mainWrapped(aio, argc, argv);
return nix::mainWrapped(aio, argc, argv);
});
}
@@ -423,5 +423,7 @@ int main(int argc, char **argv) {
},
resolveNamedConstituents(state->jobs));
}
return 0;
});
}