From 56b4ed39089423b8a5d1750e528d1f8a66d655b2 Mon Sep 17 00:00:00 2001 From: Raito Bezarius Date: Tue, 28 Oct 2025 20:26:34 +0100 Subject: [PATCH] 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 --- lix/libmain/shared.cc | 5 ++-- lix/libmain/shared.hh | 2 +- lix/nix/main.cc | 25 +++++++++++-------- .../nix-eval-jobs/src/nix-eval-jobs.cc | 2 ++ 4 files changed, 19 insertions(+), 15 deletions(-) diff --git a/lix/libmain/shared.cc b/lix/libmain/shared.cc index 0f844c4b1..a6918a5f2 100644 --- a/lix/libmain/shared.cc +++ b/lix/libmain/shared.cc @@ -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 fun) +int handleExceptions(const std::string & programName, std::function fun) { ReceiveInterrupts receiveInterrupts; // FIXME: need better place for this @@ -324,7 +323,7 @@ int handleExceptions(const std::string & programName, std::function fun) bool onlyForSubcommands = baseNameOf(programName) == "lix"; try { - fun(); + return fun(); } catch (Exit & e) { return e.status; } catch (UsageError & e) { diff --git a/lix/libmain/shared.hh b/lix/libmain/shared.hh index 042a38797..bb6a485ea 100644 --- a/lix/libmain/shared.hh +++ b/lix/libmain/shared.hh @@ -14,7 +14,7 @@ namespace nix { -int handleExceptions(const std::string & programName, std::function fun); +int handleExceptions(const std::string & programName, std::function fun); /** * Don't forget to call initPlugins() after settings are initialized! diff --git a/lix/nix/main.cc b/lix/nix/main.cc index 3ab140b58..8f67698fa 100644 --- a/lix/nix/main.cc +++ b/lix/nix/main.cc @@ -453,7 +453,7 @@ void registerNixHelp() registerCommand("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); }); } diff --git a/subprojects/nix-eval-jobs/src/nix-eval-jobs.cc b/subprojects/nix-eval-jobs/src/nix-eval-jobs.cc index 100e6ec7f..1653ae214 100644 --- a/subprojects/nix-eval-jobs/src/nix-eval-jobs.cc +++ b/subprojects/nix-eval-jobs/src/nix-eval-jobs.cc @@ -423,5 +423,7 @@ int main(int argc, char **argv) { }, resolveNamedConstituents(state->jobs)); } + + return 0; }); }