diff options
Diffstat (limited to 'src/zen/cmds/workspaces_cmd.cpp')
| -rw-r--r-- | src/zen/cmds/workspaces_cmd.cpp | 66 |
1 files changed, 50 insertions, 16 deletions
diff --git a/src/zen/cmds/workspaces_cmd.cpp b/src/zen/cmds/workspaces_cmd.cpp index 220ef6a9e..9e49b464e 100644 --- a/src/zen/cmds/workspaces_cmd.cpp +++ b/src/zen/cmds/workspaces_cmd.cpp @@ -127,14 +127,36 @@ WorkspaceCommand::Run(const ZenCliOptions& GlobalOptions, int argc, char** argv) std::vector<char*> SubCommandArguments; cxxopts::Options* SubOption = nullptr; int ParentCommandArgCount = GetSubCommand(m_Options, argc, argv, m_SubCommands, SubOption, SubCommandArguments); - if (!ParseOptions(ParentCommandArgCount, argv)) + + if (SubOption == nullptr) + { + if (!ParseOptions(ParentCommandArgCount, argv)) + { + return; + } + throw OptionParseException("'verb' option is required", m_Options.help()); + } + + // Parse subcommand permissively — forward unrecognised options to the parent parser. + std::vector<std::string> SubUnmatched; + if (!ParseOptionsPermissive(*SubOption, gsl::narrow<int>(SubCommandArguments.size()), SubCommandArguments.data(), SubUnmatched)) { return; } - if (SubOption == nullptr) + // Build parent arg list: original parent args (without subcommand name) + forwarded unmatched. + std::vector<char*> ParentArgs; + ParentArgs.reserve(static_cast<size_t>(ParentCommandArgCount - 1) + SubUnmatched.size()); + ParentArgs.push_back(argv[0]); + std::copy(argv + 1, argv + ParentCommandArgCount - 1, std::back_inserter(ParentArgs)); + for (std::string& Arg : SubUnmatched) { - throw OptionParseException("'verb' option is required", m_Options.help()); + ParentArgs.push_back(Arg.data()); + } + + if (!ParseOptions(static_cast<int>(ParentArgs.size()), ParentArgs.data())) + { + return; } m_HostName = ResolveTargetHostSpec(m_HostName); @@ -150,11 +172,6 @@ WorkspaceCommand::Run(const ZenCliOptions& GlobalOptions, int argc, char** argv) std::filesystem::path StatePath = m_SystemRootDir / "workspaces"; - if (!ParseOptions(*SubOption, gsl::narrow<int>(SubCommandArguments.size()), SubCommandArguments.data())) - { - return; - } - if (SubOption == &m_CreateOptions) { if (m_Path.empty()) @@ -376,14 +393,36 @@ WorkspaceShareCommand::Run(const ZenCliOptions& GlobalOptions, int argc, char** std::vector<char*> SubCommandArguments; cxxopts::Options* SubOption = nullptr; int ParentCommandArgCount = GetSubCommand(m_Options, argc, argv, m_SubCommands, SubOption, SubCommandArguments); - if (!ParseOptions(ParentCommandArgCount, argv)) + + if (SubOption == nullptr) + { + if (!ParseOptions(ParentCommandArgCount, argv)) + { + return; + } + throw OptionParseException("'verb' option is required", m_Options.help()); + } + + // Parse subcommand permissively — forward unrecognised options to the parent parser. + std::vector<std::string> SubUnmatched; + if (!ParseOptionsPermissive(*SubOption, gsl::narrow<int>(SubCommandArguments.size()), SubCommandArguments.data(), SubUnmatched)) { return; } - if (SubOption == nullptr) + // Build parent arg list: original parent args (without subcommand name) + forwarded unmatched. + std::vector<char*> ParentArgs; + ParentArgs.reserve(static_cast<size_t>(ParentCommandArgCount - 1) + SubUnmatched.size()); + ParentArgs.push_back(argv[0]); + std::copy(argv + 1, argv + ParentCommandArgCount - 1, std::back_inserter(ParentArgs)); + for (std::string& Arg : SubUnmatched) { - throw OptionParseException("'verb' option is required", m_Options.help()); + ParentArgs.push_back(Arg.data()); + } + + if (!ParseOptions(static_cast<int>(ParentArgs.size()), ParentArgs.data())) + { + return; } m_HostName = ResolveTargetHostSpec(m_HostName); @@ -403,11 +442,6 @@ WorkspaceShareCommand::Run(const ZenCliOptions& GlobalOptions, int argc, char** std::filesystem::path StatePath = m_SystemRootDir / "workspaces"; - if (!ParseOptions(*SubOption, gsl::narrow<int>(SubCommandArguments.size()), SubCommandArguments.data())) - { - return; - } - if (SubOption == &m_CreateOptions) { if (m_WorkspaceRoot.empty()) |