diff --git a/src/core/dispatcher.cppm b/src/core/dispatcher.cppm index baca4b5..17fa8b2 100644 --- a/src/core/dispatcher.cppm +++ b/src/core/dispatcher.cppm @@ -29,6 +29,7 @@ import std; import :cmd_meta; import :command_context; import utils; +import version; export template using CommandFunc = int (*)(CommandContext &) noexcept; @@ -583,17 +584,19 @@ auto echo_posixly_correct_literal_mode(std::string_view cmdName, return args.empty() || args[0] != "-n"; } -auto command_supports_dispatcher_version(std::string_view cmdName) -> bool { - return cmdName == "yes" || cmdName == "true" || cmdName == "false" || - cmdName == "link" || cmdName == "unlink" || cmdName == "arch" || - cmdName == "hostid" || cmdName == "logname" || - cmdName == "whoami" || cmdName == "factor" || cmdName == "tsort" || - cmdName == "users"; +auto command_declares_option( + std::span options, + std::string_view name) -> bool { + return std::ranges::any_of(options, [name](const auto& option) { + return option.short_name == name || option.long_name == name; + }); } auto wants_standard_version(std::string_view cmdName, - std::span args) -> bool { - if (!command_supports_dispatcher_version(cmdName)) { + std::span args, + std::span options) + -> bool { + if (echo_posixly_correct_literal_mode(cmdName, args)) { return false; } @@ -602,7 +605,7 @@ auto wants_standard_version(std::string_view cmdName, break; } if (arg == "--version" || arg == "-V") { - return true; + return !command_declares_option(options, arg); } } @@ -790,8 +793,9 @@ class RegistryImpl { return 0; } - if (wants_standard_version(cmdName, effective_args)) { - safePrintLn(std::string(cmdName) + " (WinuxCmd) 0.1.0"); + if (wants_standard_version(cmdName, effective_args, options)) { + safePrintLn(std::string(cmdName) + " (WinuxCmd) " + + std::string(WinuxCmd::VERSION_STRING)); return 0; } diff --git a/tests/unit/ls/ls_unit_test.cpp b/tests/unit/ls/ls_unit_test.cpp index 461922c..e6157ee 100644 --- a/tests/unit/ls/ls_unit_test.cpp +++ b/tests/unit/ls/ls_unit_test.cpp @@ -2637,6 +2637,24 @@ TEST(ls, ls_version_sort) { EXPECT_LT(file2_pos, file10_pos); } +TEST(ls, ls_dispatcher_version_flags_succeed) { + Pipeline short_flag; + short_flag.add(L"ls.exe", {L"-V"}); + auto short_result = short_flag.run(); + + EXPECT_EQ(short_result.exit_code, 0); + EXPECT_NE(short_result.stdout_text.find("ls (WinuxCmd)"), std::string::npos); + EXPECT_TRUE(short_result.stderr_text.empty()); + + Pipeline long_flag; + long_flag.add(L"ls.exe", {L"--version"}); + auto long_result = long_flag.run(); + + EXPECT_EQ(long_result.exit_code, 0); + EXPECT_NE(long_result.stdout_text.find("ls (WinuxCmd)"), std::string::npos); + EXPECT_TRUE(long_result.stderr_text.empty()); +} + TEST(ls, ls_long_with_file) { TempDir tmp; tmp.write("testfile.txt", "test content for long format"); diff --git a/tests/unit/sort/sort_unit_test.cpp b/tests/unit/sort/sort_unit_test.cpp index 2cdaecd..f3acaf2 100644 --- a/tests/unit/sort/sort_unit_test.cpp +++ b/tests/unit/sort/sort_unit_test.cpp @@ -442,6 +442,28 @@ TEST(sort, sort_version_sort) { EXPECT_EQ_TEXT(r.stdout_text, "1.2.0\n1.2.2\n1.2.10\n1.10.0\n"); } +TEST(sort, sort_version_flag_does_not_steal_version_sort_short_option) { + TempDir tmp; + tmp.write("v.txt", "1.10\n1.2\n"); + + Pipeline version_sort; + version_sort.set_cwd(tmp.wpath()); + version_sort.add(L"sort.exe", {L"-V", L"v.txt"}); + auto sort_result = version_sort.run(); + + EXPECT_EQ(sort_result.exit_code, 0); + EXPECT_EQ_TEXT(sort_result.stdout_text, "1.2\n1.10\n"); + + Pipeline version_flag; + version_flag.add(L"sort.exe", {L"--version"}); + auto version_result = version_flag.run(); + + EXPECT_EQ(version_result.exit_code, 0); + EXPECT_NE(version_result.stdout_text.find("sort (WinuxCmd)"), + std::string::npos); + EXPECT_TRUE(version_result.stderr_text.empty()); +} + TEST(sort, sort_long_sort_numeric_word) { TempDir tmp; tmp.write("n.txt", "10\n2\n1\n");