diff options
Diffstat (limited to 'src/zen/cmds/projectstore_cmd.cpp')
| -rw-r--r-- | src/zen/cmds/projectstore_cmd.cpp | 217 |
1 files changed, 109 insertions, 108 deletions
diff --git a/src/zen/cmds/projectstore_cmd.cpp b/src/zen/cmds/projectstore_cmd.cpp index b18637d10..2d025ae3a 100644 --- a/src/zen/cmds/projectstore_cmd.cpp +++ b/src/zen/cmds/projectstore_cmd.cpp @@ -590,33 +590,73 @@ namespace oplog_legacy_shim { /////////////////////////////////////// -DropProjectCommand::DropProjectCommand() +//////////////////////////////////////////////////////////////////////////////// +// ProjectCommand + +ProjectCommand::ProjectCommand() { m_Options.add_options()("h,help", "Print help"); - m_Options.add_option("", "u", "hosturl", kHostUrlHelp, cxxopts::value(m_HostName)->default_value(""), "<hosturl>"); - m_Options.add_option("", "p", "project", "Project name", cxxopts::value(m_ProjectName), "<projectid>"); - m_Options.add_option("", "o", "oplog", "Oplog name", cxxopts::value(m_OplogName), "<oplogid>"); - m_Options.add_option("", "", "dryrun", "Dry run - resolve arguments but do not drop", cxxopts::value(m_DryRun), "<dryrun>"); - m_Options.parse_positional({"project", "oplog"}); - m_Options.positional_help("[<projectid> [<oplogid>]]"); + + AddSubCommand(m_CreateSubCmd); + AddSubCommand(m_DropSubCmd); + AddSubCommand(m_InfoSubCmd); + AddSubCommand(m_OpDetailsSubCmd); + AddSubCommand(m_StatsSubCmd); } -DropProjectCommand::~DropProjectCommand() +ProjectCommand::~ProjectCommand() = default; + +//////////////////////////////////////////////////////////////////////////////// +// ProjectSubCmdBase + +ProjectSubCmdBase::ProjectSubCmdBase(std::string_view Name, std::string_view Description) : ZenSubCmdBase(Name, Description) { + m_SubOptions.add_option("", "u", "hosturl", ZenCmdBase::kHostUrlHelp, cxxopts::value(m_HostName)->default_value(""), "<hosturl>"); } -void -DropProjectCommand::Run(const ZenCliOptions& GlobalOptions, int argc, char** argv) -{ - using namespace projectstore_impl; - ZEN_UNUSED(GlobalOptions); +//////////////////////////////////////////////////////////////////////////////// +// Legacy shim dispatcher - if (!ParseOptions(argc, argv)) +namespace project_legacy_shim { + void RunAs(const char* SubCommandName, const ZenCliOptions& GlobalOptions, int argc, char** argv) { - return; + // cxxopts treats argv as writable char** in the style of C main(argv). + // Stage the injected token in writable std::string storage so we never + // hand out pointers to string literals. + std::string Token(SubCommandName); + + std::vector<char*> NewArgv; + NewArgv.reserve(static_cast<size_t>(argc) + 1); + NewArgv.push_back(argv[0]); + NewArgv.push_back(Token.data()); + for (int i = 1; i < argc; ++i) + { + NewArgv.push_back(argv[i]); + } + + ProjectCommand Impl; + Impl.Run(GlobalOptions, static_cast<int>(NewArgv.size()), NewArgv.data()); } +} // namespace project_legacy_shim + +//////////////////////////////////////////////////////////////////////////////// +// ProjectDropSubCmd + +ProjectDropSubCmd::ProjectDropSubCmd() : ProjectSubCmdBase("drop", "Drop project or project oplog") +{ + m_SubOptions.add_option("", "p", "project", "Project name", cxxopts::value(m_ProjectName), "<projectid>"); + m_SubOptions.add_option("", "o", "oplog", "Oplog name", cxxopts::value(m_OplogName), "<oplogid>"); + m_SubOptions.add_option("", "", "dryrun", "Dry run - resolve arguments but do not drop", cxxopts::value(m_DryRun), "<dryrun>"); + m_SubOptions.parse_positional({"project", "oplog"}); + m_SubOptions.positional_help("[<projectid> [<oplogid>]]"); +} + +void +ProjectDropSubCmd::Run(const ZenCliOptions& /*GlobalOptions*/) +{ + using namespace projectstore_impl; - ZenServiceClient Service({.HostSpec = m_HostName, .CommandName = Name}); + ZenServiceClient Service({.HostSpec = m_HostName, .CommandName = "drop"}); HttpClient& Http = Service.Http(); m_ProjectName = ResolveProject(Http, m_ProjectName); @@ -629,11 +669,13 @@ DropProjectCommand::Run(const ZenCliOptions& GlobalOptions, int argc, char** arg { if (m_DryRun) { - ZEN_CONSOLE("Would drop project '{}' from '{}'. Use --dryrun=false to execute the drop operation.", m_ProjectName, m_HostName); + ZEN_CONSOLE("Would drop project '{}' from '{}'. Use --dryrun=false to execute the drop operation.", + m_ProjectName, + Service.HostSpec()); } else { - ZEN_CONSOLE("Dropping project '{}' from '{}'", m_ProjectName, m_HostName); + ZEN_CONSOLE("Dropping project '{}' from '{}'", m_ProjectName, Service.HostSpec()); if (HttpClient::Response Result = Http.Delete(fmt::format("/prj/{}", m_ProjectName))) { ZEN_CONSOLE("{}", Result); @@ -656,11 +698,11 @@ DropProjectCommand::Run(const ZenCliOptions& GlobalOptions, int argc, char** arg ZEN_CONSOLE("Would drop oplog '{}/{}' from '{}'. Add --dryrun=false to execute the drop operation.", m_ProjectName, m_OplogName, - m_HostName); + Service.HostSpec()); } else { - ZEN_CONSOLE("Dropping oplog '{}/{}' from '{}'", m_ProjectName, m_OplogName, m_HostName); + ZEN_CONSOLE("Dropping oplog '{}/{}' from '{}'", m_ProjectName, m_OplogName, Service.HostSpec()); if (HttpClient::Response Result = Http.Delete(fmt::format("/prj/{}/oplog/{}", m_ProjectName, m_OplogName))) { ZEN_CONSOLE("{}", Result); @@ -673,39 +715,28 @@ DropProjectCommand::Run(const ZenCliOptions& GlobalOptions, int argc, char** arg } } -/////////////////////////////////////// - -ProjectInfoCommand::ProjectInfoCommand() -{ - m_Options.add_options()("h,help", "Print help"); - m_Options.add_option("", "u", "hosturl", kHostUrlHelp, cxxopts::value(m_HostName)->default_value(""), "<hosturl>"); - m_Options.add_option("", "p", "project", "Project name", cxxopts::value(m_ProjectName), "<projectid>"); - m_Options.add_option("", "o", "oplog", "Oplog name", cxxopts::value(m_OplogName), "<oplogid>"); - m_Options.parse_positional({"project", "oplog"}); - m_Options.positional_help("[<projectid> [<oplogid>]]"); -} +//////////////////////////////////////////////////////////////////////////////// +// ProjectInfoSubCmd -ProjectInfoCommand::~ProjectInfoCommand() +ProjectInfoSubCmd::ProjectInfoSubCmd() : ProjectSubCmdBase("info", "Info on project or project oplog") { + m_SubOptions.add_option("", "p", "project", "Project name", cxxopts::value(m_ProjectName), "<projectid>"); + m_SubOptions.add_option("", "o", "oplog", "Oplog name", cxxopts::value(m_OplogName), "<oplogid>"); + m_SubOptions.parse_positional({"project", "oplog"}); + m_SubOptions.positional_help("[<projectid> [<oplogid>]]"); } void -ProjectInfoCommand::Run(const ZenCliOptions& GlobalOptions, int argc, char** argv) +ProjectInfoSubCmd::Run(const ZenCliOptions& /*GlobalOptions*/) { using namespace projectstore_impl; - ZEN_UNUSED(GlobalOptions); - - if (!ParseOptions(argc, argv)) - { - return; - } if (!m_OplogName.empty() && m_ProjectName.empty()) { - throw OptionParseException("'--project' is required", m_Options.help()); + throw OptionParseException("'--project' is required", m_SubOptions.help()); } - ZenServiceClient Service({.HostSpec = m_HostName, .CommandName = Name}); + ZenServiceClient Service({.HostSpec = m_HostName, .CommandName = "info"}); HttpClient& Http = Service.Http(); std::string Url; @@ -723,7 +754,7 @@ ProjectInfoCommand::Run(const ZenCliOptions& GlobalOptions, int argc, char** arg } Url = fmt::format("/prj/{}", m_ProjectName); - ZEN_CONSOLE("Info on project '{}' from '{}{}'", m_ProjectName, m_HostName, Url); + ZEN_CONSOLE("Info on project '{}' from '{}{}'", m_ProjectName, Service.HostSpec(), Url); } else { @@ -740,7 +771,7 @@ ProjectInfoCommand::Run(const ZenCliOptions& GlobalOptions, int argc, char** arg } Url = fmt::format("/prj/{}/oplog/{}", m_ProjectName, m_OplogName); - ZEN_CONSOLE("Info on oplog '{}/{}' from '{}{}'", m_ProjectName, m_OplogName, m_HostName, Url); + ZEN_CONSOLE("Info on oplog '{}/{}' from '{}{}'", m_ProjectName, m_OplogName, Service.HostSpec(), Url); } if (HttpClient::Response Result = Http.Get(Url, HttpClient::Accept(ZenContentType::kJSON))) @@ -753,42 +784,32 @@ ProjectInfoCommand::Run(const ZenCliOptions& GlobalOptions, int argc, char** arg } } -/////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////// +// ProjectCreateSubCmd -CreateProjectCommand::CreateProjectCommand() +ProjectCreateSubCmd::ProjectCreateSubCmd() : ProjectSubCmdBase("create", "Create a project") { - m_Options.add_options()("h,help", "Print help"); - m_Options.add_option("", "u", "hosturl", kHostUrlHelp, cxxopts::value(m_HostName)->default_value(""), "<hosturl>"); - m_Options.add_option("", "p", "project", "Project name", cxxopts::value(m_ProjectId), "<projectid>"); - m_Options.add_option("", "", "rootdir", "Absolute path to root directory", cxxopts::value(m_RootDir), "<root>"); - m_Options.add_option("", "", "enginedir", "Absolute path to engine root directory", cxxopts::value(m_EngineRootDir), "<engineroot>"); - m_Options.add_option("", "", "projectdir", "Absolute path to project directory", cxxopts::value(m_ProjectRootDir), "<projectroot>"); - m_Options.add_option("", "", "projectfile", "Absolute path to .uproject file", cxxopts::value(m_ProjectFile), "<projectfile>"); - m_Options.add_option("", "f", "force-update", "Force update of existing project", cxxopts::value(m_ForceUpdate), "<force-update>"); - m_Options.parse_positional({"project", "rootdir", "enginedir", "projectdir", "projectfile"}); + m_SubOptions.add_option("", "p", "project", "Project name", cxxopts::value(m_ProjectId), "<projectid>"); + m_SubOptions.add_option("", "", "rootdir", "Absolute path to root directory", cxxopts::value(m_RootDir), "<root>"); + m_SubOptions.add_option("", "", "enginedir", "Absolute path to engine root directory", cxxopts::value(m_EngineRootDir), "<engineroot>"); + m_SubOptions.add_option("", "", "projectdir", "Absolute path to project directory", cxxopts::value(m_ProjectRootDir), "<projectroot>"); + m_SubOptions.add_option("", "", "projectfile", "Absolute path to .uproject file", cxxopts::value(m_ProjectFile), "<projectfile>"); + m_SubOptions.add_option("", "f", "force-update", "Force update of existing project", cxxopts::value(m_ForceUpdate), "<force-update>"); + m_SubOptions.parse_positional({"project", "rootdir", "enginedir", "projectdir", "projectfile"}); } -CreateProjectCommand::~CreateProjectCommand() = default; - void -CreateProjectCommand::Run(const ZenCliOptions& GlobalOptions, int argc, char** argv) +ProjectCreateSubCmd::Run(const ZenCliOptions& /*GlobalOptions*/) { using namespace projectstore_impl; - ZEN_UNUSED(GlobalOptions); - using namespace std::literals; - if (!ParseOptions(argc, argv)) - { - return; - } - if (m_ProjectId.empty()) { - throw OptionParseException("'--project' is required", m_Options.help()); + throw OptionParseException("'--project' is required", m_SubOptions.help()); } - ZenServiceClient Service({.HostSpec = m_HostName, .CommandName = Name}); + ZenServiceClient Service({.HostSpec = m_HostName, .CommandName = "create"}); HttpClient& Http = Service.Http(); std::string Url = fmt::format("/prj/{}", m_ProjectId); @@ -1857,28 +1878,19 @@ OplogSnapshotSubCmd::Run(const ZenCliOptions& /*GlobalOptions*/) //////////////////////////// -ProjectStatsCommand::ProjectStatsCommand() -{ - m_Options.add_options()("h,help", "Print help"); - m_Options.add_option("", "u", "hosturl", kHostUrlHelp, cxxopts::value(m_HostName)->default_value(""), "<hosturl>"); -} +//////////////////////////////////////////////////////////////////////////////// +// ProjectStatsSubCmd -ProjectStatsCommand::~ProjectStatsCommand() +ProjectStatsSubCmd::ProjectStatsSubCmd() : ProjectSubCmdBase("stats", "Stats on project store") { } void -ProjectStatsCommand::Run(const ZenCliOptions& GlobalOptions, int argc, char** argv) +ProjectStatsSubCmd::Run(const ZenCliOptions& /*GlobalOptions*/) { using namespace projectstore_impl; - ZEN_UNUSED(GlobalOptions); - - if (!ParseOptions(argc, argv)) - { - return; - } - ZenServiceClient Service({.HostSpec = m_HostName, .CommandName = Name}); + ZenServiceClient Service({.HostSpec = m_HostName, .CommandName = "stats"}); HttpClient& Http = Service.Http(); if (HttpClient::Response Result = Http.Get("/stats/prj", HttpClient::Accept(ZenContentType::kJSON))) { @@ -1890,42 +1902,31 @@ ProjectStatsCommand::Run(const ZenCliOptions& GlobalOptions, int argc, char** ar } } -//////////////////////////// - -ProjectOpDetailsCommand::ProjectOpDetailsCommand() -{ - m_Options.add_options()("h,help", "Print help"); - m_Options.add_option("", "u", "hosturl", kHostUrlHelp, cxxopts::value(m_HostName)->default_value(""), "<hosturl>"); - m_Options.add_option("", "c", "csv", "Output in CSV format (default is JSon)", cxxopts::value(m_CSV), "<csv>"); - m_Options.add_option("", "d", "details", "Detailed info on oplog", cxxopts::value(m_Details), "<details>"); - m_Options.add_option("", "o", "opdetails", "Details info on oplog body", cxxopts::value(m_OpDetails), "<opdetails>"); - m_Options.add_option("", "p", "project", "Project name to get info from", cxxopts::value(m_ProjectName), "<projectid>"); - m_Options.add_option("", "l", "oplog", "Oplog name to get info from", cxxopts::value(m_OplogName), "<oplogid>"); - m_Options.add_option("", "i", "opid", "Oid of a specific op info for", cxxopts::value(m_OpId), "<opid>"); - m_Options.add_option("", - "a", - "attachmentdetails", - "Get detailed information about attachments", - cxxopts::value(m_AttachmentDetails), - "<attachmentdetails>"); -} +//////////////////////////////////////////////////////////////////////////////// +// ProjectOpDetailsSubCmd -ProjectOpDetailsCommand::~ProjectOpDetailsCommand() +ProjectOpDetailsSubCmd::ProjectOpDetailsSubCmd() : ProjectSubCmdBase("op-details", "Detail info on ops inside a project store oplog") { + m_SubOptions.add_option("", "c", "csv", "Output in CSV format (default is JSon)", cxxopts::value(m_CSV), "<csv>"); + m_SubOptions.add_option("", "d", "details", "Detailed info on oplog", cxxopts::value(m_Details), "<details>"); + m_SubOptions.add_option("", "o", "opdetails", "Details info on oplog body", cxxopts::value(m_OpDetails), "<opdetails>"); + m_SubOptions.add_option("", "p", "project", "Project name to get info from", cxxopts::value(m_ProjectName), "<projectid>"); + m_SubOptions.add_option("", "l", "oplog", "Oplog name to get info from", cxxopts::value(m_OplogName), "<oplogid>"); + m_SubOptions.add_option("", "i", "opid", "Oid of a specific op info for", cxxopts::value(m_OpId), "<opid>"); + m_SubOptions.add_option("", + "a", + "attachmentdetails", + "Get detailed information about attachments", + cxxopts::value(m_AttachmentDetails), + "<attachmentdetails>"); } void -ProjectOpDetailsCommand::Run(const ZenCliOptions& GlobalOptions, int argc, char** argv) +ProjectOpDetailsSubCmd::Run(const ZenCliOptions& /*GlobalOptions*/) { using namespace projectstore_impl; - ZEN_UNUSED(GlobalOptions); - - if (!ParseOptions(argc, argv)) - { - return; - } - ZenServiceClient Service({.HostSpec = m_HostName, .CommandName = Name}); + ZenServiceClient Service({.HostSpec = m_HostName, .CommandName = "op-details"}); HttpClient& Http = Service.Http(); m_ProjectName = ResolveProject(Http, m_ProjectName); |