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