Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
26 changes: 15 additions & 11 deletions src/core/dispatcher.cppm
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ import std;
import :cmd_meta;
import :command_context;
import utils;
import version;

export template <size_t N>
using CommandFunc = int (*)(CommandContext<N> &) noexcept;
Expand Down Expand Up @@ -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<const cmd::meta::OptionMeta> 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<std::string_view> args) -> bool {
if (!command_supports_dispatcher_version(cmdName)) {
std::span<std::string_view> args,
std::span<const cmd::meta::OptionMeta> options)
-> bool {
if (echo_posixly_correct_literal_mode(cmdName, args)) {
return false;
}

Expand All @@ -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);
}
}

Expand Down Expand Up @@ -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;
}

Expand Down
18 changes: 18 additions & 0 deletions tests/unit/ls/ls_unit_test.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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");
Expand Down
22 changes: 22 additions & 0 deletions tests/unit/sort/sort_unit_test.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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");
Expand Down