aboutsummaryrefslogtreecommitdiff
path: root/src/zen/cmds/workspaces_cmd.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/zen/cmds/workspaces_cmd.cpp')
-rw-r--r--src/zen/cmds/workspaces_cmd.cpp66
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())