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.cpp142
1 files changed, 66 insertions, 76 deletions
diff --git a/src/zen/cmds/workspaces_cmd.cpp b/src/zen/cmds/workspaces_cmd.cpp
index 3930e56b7..9bb118eac 100644
--- a/src/zen/cmds/workspaces_cmd.cpp
+++ b/src/zen/cmds/workspaces_cmd.cpp
@@ -117,7 +117,7 @@ WorkspaceCommand::WorkspaceCommand()
WorkspaceCommand::~WorkspaceCommand() = default;
-int
+void
WorkspaceCommand::Run(const ZenCliOptions& GlobalOptions, int argc, char** argv)
{
ZEN_UNUSED(GlobalOptions);
@@ -129,12 +129,12 @@ WorkspaceCommand::Run(const ZenCliOptions& GlobalOptions, int argc, char** argv)
int ParentCommandArgCount = GetSubCommand(m_Options, argc, argv, m_SubCommands, SubOption, SubCommandArguments);
if (!ParseOptions(ParentCommandArgCount, argv))
{
- return 0;
+ return;
}
if (SubOption == nullptr)
{
- throw zen::OptionParseException("command verb is missing");
+ throw OptionParseException("'verb' option is required", m_Options.help());
}
m_HostName = ResolveTargetHostSpec(m_HostName);
@@ -144,7 +144,7 @@ WorkspaceCommand::Run(const ZenCliOptions& GlobalOptions, int argc, char** argv)
m_SystemRootDir = PickDefaultSystemRootDirectory();
if (m_SystemRootDir.empty())
{
- throw zen::OptionParseException("unable to resolve system root directory");
+ throw std::runtime_error("Unable to resolve default system root directory");
}
}
@@ -152,14 +152,14 @@ WorkspaceCommand::Run(const ZenCliOptions& GlobalOptions, int argc, char** argv)
if (!ParseOptions(*SubOption, gsl::narrow<int>(SubCommandArguments.size()), SubCommandArguments.data()))
{
- return 0;
+ return;
}
if (SubOption == &m_CreateOptions)
{
if (m_Path.empty())
{
- throw zen::OptionParseException(fmt::format("path is required\n{}", m_CreateOptions.help()));
+ throw OptionParseException("'--root-path' is required", SubOption->help());
}
std::filesystem::path Path = StringToPath(m_Path);
@@ -167,12 +167,12 @@ WorkspaceCommand::Run(const ZenCliOptions& GlobalOptions, int argc, char** argv)
if (m_Id.empty())
{
m_Id = Workspaces::PathToId(Path).ToString();
- ZEN_CONSOLE("Using generated workspace id {} from path '{}'", m_Id, Path);
+ ZEN_CONSOLE("Using generated workspace id '{}' from '--root-path' '{}'", m_Id, Path);
}
if (Oid::TryFromHexString(m_Id) == Oid::Zero)
{
- throw zen::OptionParseException(fmt::format("id '{}' is invalid", m_Id));
+ throw OptionParseException(fmt::format("'--workspace' ('{}') is malformed", m_Id), SubOption->help());
}
if (Workspaces::AddWorkspace(
@@ -185,16 +185,16 @@ WorkspaceCommand::Run(const ZenCliOptions& GlobalOptions, int argc, char** argv)
HttpClient Http(m_HostName);
if (HttpClient::Response Result = Http.Get("/ws/refresh"); !Result)
{
- ZEN_CONSOLE_ERROR("Failed to refresh workspaces for host {}. Reason: '{}'", m_HostName, Result.ErrorMessage(""sv));
+ ZEN_CONSOLE_WARN("Failed to refresh workspaces for host {}. Reason: '{}'", m_HostName, Result.ErrorMessage(""sv));
}
}
ZEN_CONSOLE("Added/updated workspace {}", m_Id);
- return 0;
+ return;
}
else
{
ZEN_CONSOLE_WARN("Workspace {} already exists", m_Id);
- return 0;
+ return;
}
}
@@ -206,7 +206,7 @@ WorkspaceCommand::Run(const ZenCliOptions& GlobalOptions, int argc, char** argv)
static std::vector<Workspaces::WorkspaceConfiguration> Configs = Workspaces::ReadConfig(Log(), StatePath, Error);
if (!Error.empty())
{
- ZEN_CONSOLE_ERROR("Failed to read workspaces state from '{}'. Reason: '{}'", StatePath, Error);
+ throw std::runtime_error(fmt::format("Failed to read workspaces state from '{}'. Reason: '{}'", StatePath, Error));
}
else
{
@@ -216,20 +216,20 @@ WorkspaceCommand::Run(const ZenCliOptions& GlobalOptions, int argc, char** argv)
ShowWorkspace(Config, " "sv);
}
}
- return 0;
+ return;
}
else
{
if (Oid::TryFromHexString(m_Id) == Oid::Zero)
{
- throw zen::OptionParseException(fmt::format("id '{}' is invalid", m_Id));
+ throw OptionParseException(fmt::format("'--workspace' ('{}') is malformed", m_Id), SubOption->help());
}
Workspaces::WorkspaceConfiguration Workspace = Workspaces::FindWorkspace(Log(), StatePath, Oid::FromHexString(m_Id));
if (Workspace.Id != Oid::Zero)
{
ShowWorkspace(Workspace, ""sv);
- return 0;
+ return;
}
else
{
@@ -242,12 +242,12 @@ WorkspaceCommand::Run(const ZenCliOptions& GlobalOptions, int argc, char** argv)
{
if (m_Id.empty())
{
- throw zen::OptionParseException(fmt::format("id is required", m_RemoveOptions.help()));
+ throw OptionParseException("'--workspace' is required", SubOption->help());
}
if (Oid::TryFromHexString(m_Id) == Oid::Zero)
{
- throw zen::OptionParseException(fmt::format("id '{}' is invalid", m_Id));
+ throw OptionParseException(fmt::format("'--workspace' ('{}') is malformed", m_Id), SubOption->help());
}
if (Workspaces::RemoveWorkspace(Log(), StatePath, Oid::FromHexString(m_Id)))
@@ -257,7 +257,7 @@ WorkspaceCommand::Run(const ZenCliOptions& GlobalOptions, int argc, char** argv)
HttpClient Http(m_HostName);
if (HttpClient::Response Result = Http.Get("/ws/refresh"); !Result)
{
- ZEN_CONSOLE_ERROR("Failed to refresh workspaces for host {}. Reason: '{}'", m_HostName, Result.ErrorMessage(""sv));
+ ZEN_CONSOLE_WARN("Failed to refresh workspaces for host {}. Reason: '{}'", m_HostName, Result.ErrorMessage(""sv));
}
}
ZEN_CONSOLE("Removed workspace {}", m_Id);
@@ -266,7 +266,7 @@ WorkspaceCommand::Run(const ZenCliOptions& GlobalOptions, int argc, char** argv)
{
ZEN_CONSOLE_WARN("Workspace {} does not exist", m_Id);
}
- return 0;
+ return;
}
ZEN_ASSERT(false);
@@ -368,7 +368,7 @@ WorkspaceShareCommand::WorkspaceShareCommand()
WorkspaceShareCommand::~WorkspaceShareCommand() = default;
-int
+void
WorkspaceShareCommand::Run(const ZenCliOptions& GlobalOptions, int argc, char** argv)
{
ZEN_UNUSED(GlobalOptions);
@@ -380,12 +380,12 @@ WorkspaceShareCommand::Run(const ZenCliOptions& GlobalOptions, int argc, char**
int ParentCommandArgCount = GetSubCommand(m_Options, argc, argv, m_SubCommands, SubOption, SubCommandArguments);
if (!ParseOptions(ParentCommandArgCount, argv))
{
- return 0;
+ return;
}
if (SubOption == nullptr)
{
- throw zen::OptionParseException("command verb is missing");
+ throw OptionParseException("'verb' option is required", m_Options.help());
}
m_HostName = ResolveTargetHostSpec(m_HostName);
@@ -395,7 +395,7 @@ WorkspaceShareCommand::Run(const ZenCliOptions& GlobalOptions, int argc, char**
m_SystemRootDir = PickDefaultSystemRootDirectory();
if (m_SystemRootDir.empty())
{
- throw zen::OptionParseException("unable to resolve system root directory");
+ throw std::runtime_error("Unable to resolve default system root directory");
}
}
else
@@ -407,7 +407,7 @@ WorkspaceShareCommand::Run(const ZenCliOptions& GlobalOptions, int argc, char**
if (!ParseOptions(*SubOption, gsl::narrow<int>(SubCommandArguments.size()), SubCommandArguments.data()))
{
- return 0;
+ return;
}
if (SubOption == &m_CreateOptions)
@@ -416,20 +416,19 @@ WorkspaceShareCommand::Run(const ZenCliOptions& GlobalOptions, int argc, char**
{
if (m_WorkspaceId.empty())
{
- throw zen::OptionParseException("workspace id or root path is required");
+ throw OptionParseException("'--workspace' or '--root-path' is required", SubOption->help());
}
Oid WorkspaceId = Oid::TryFromHexString(m_WorkspaceId);
if (WorkspaceId == Oid::Zero)
{
- throw zen::OptionParseException(fmt::format("id '{}' is invalid", m_WorkspaceId));
+ throw OptionParseException(fmt::format("'--workspace' ('{}') is malformed", m_WorkspaceId), SubOption->help());
}
Workspaces::WorkspaceConfiguration WorkspaceConfig = Workspaces::FindWorkspace(Log(), StatePath, WorkspaceId);
if (WorkspaceConfig.Id == Oid::Zero)
{
- ZEN_CONSOLE_ERROR("Workspace {} does not exist", m_WorkspaceId);
- return 0;
+ throw std::runtime_error(fmt::format("Workspace {} does not exist", m_WorkspaceId));
}
m_WorkspaceRoot = WorkspaceConfig.RootPath;
}
@@ -445,7 +444,7 @@ WorkspaceShareCommand::Run(const ZenCliOptions& GlobalOptions, int argc, char**
{
if (Oid::TryFromHexString(m_WorkspaceId) == Oid::Zero)
{
- throw zen::OptionParseException(fmt::format("workspace id '{}' is invalid", m_WorkspaceId));
+ throw OptionParseException(fmt::format("'--workspace' ('{}') is malformed", m_WorkspaceId), SubOption->help());
}
}
if (Workspaces::AddWorkspace(Log(), StatePath, {.Id = Oid::FromHexString(m_WorkspaceId), .RootPath = m_WorkspaceRoot}))
@@ -469,7 +468,7 @@ WorkspaceShareCommand::Run(const ZenCliOptions& GlobalOptions, int argc, char**
if (Oid::TryFromHexString(m_ShareId) == Oid::Zero)
{
- throw zen::OptionParseException(fmt::format("workspace id '{}' is invalid", m_ShareId));
+ throw OptionParseException(fmt::format("'--workspace' ('{}') is malformed", m_ShareId), SubOption->help());
}
if (Workspaces::AddWorkspaceShare(Log(),
@@ -481,16 +480,14 @@ WorkspaceShareCommand::Run(const ZenCliOptions& GlobalOptions, int argc, char**
HttpClient Http(m_HostName);
if (HttpClient::Response Result = Http.Get("/ws/refresh"); !Result)
{
- ZEN_CONSOLE_ERROR("Failed to refresh workspaces for host {}. Reason: '{}'", m_HostName, Result.ErrorMessage(""sv));
+ ZEN_CONSOLE_WARN("Failed to refresh workspaces for host {}. Reason: '{}'", m_HostName, Result.ErrorMessage(""sv));
}
}
ZEN_CONSOLE("Created workspace share {}", m_ShareId);
- return 0;
}
else
{
ZEN_CONSOLE("Workspace share {} already exists", m_ShareId);
- return 0;
}
}
@@ -503,50 +500,47 @@ WorkspaceShareCommand::Run(const ZenCliOptions& GlobalOptions, int argc, char**
Workspaces::FindWorkspaceShare(Log(), StatePath, m_Alias, WorkspaceConfig);
if (ShareConfig.Id == Oid::Zero)
{
- ZEN_CONSOLE("Workspace share with alias {} does not exist", m_Alias);
- return 0;
+ throw std::runtime_error(fmt::format("Workspace share with alias {} does not exist", m_Alias));
}
ShowShare(ShareConfig, WorkspaceConfig.Id, ""sv);
- return 0;
+ return;
}
if (m_WorkspaceId.empty())
{
- throw zen::OptionParseException("workspace id or root path is required");
+ throw OptionParseException("'--workspace' or '--root-path' is required", SubOption->help());
}
if (Oid::TryFromHexString(m_WorkspaceId) == Oid::Zero)
{
- throw zen::OptionParseException(fmt::format("workspace id '{}' is invalid", m_WorkspaceId));
+ throw OptionParseException(fmt::format("'--workspace' ('{}') is malformed", m_WorkspaceId), SubOption->help());
}
Workspaces::WorkspaceConfiguration WorkspaceConfig = Workspaces::FindWorkspace(Log(), StatePath, Oid::FromHexString(m_WorkspaceId));
if (WorkspaceConfig.Id == Oid::Zero)
{
- ZEN_CONSOLE("Workspace {} does not exist", m_WorkspaceId);
- return 0;
+ throw std::runtime_error(fmt::format("Workspace {} does not exist", m_WorkspaceId));
}
std::filesystem::path WorkspaceRoot = WorkspaceConfig.RootPath;
if (m_ShareId.empty())
{
- throw zen::OptionParseException("share id is required");
+ throw OptionParseException("'--share' is required", SubOption->help());
}
if (Oid::TryFromHexString(m_ShareId) == Oid::Zero)
{
- throw zen::OptionParseException(fmt::format("workspace id '{}' is invalid", m_ShareId));
+ throw OptionParseException(fmt::format("'--share' ('{}') is malformed", m_ShareId), SubOption->help());
}
Workspaces::WorkspaceShareConfiguration Share = Workspaces::FindWorkspaceShare(Log(), WorkspaceRoot, Oid::FromHexString(m_ShareId));
if (Share.Id == Oid::Zero)
{
- ZEN_CONSOLE("Workspace share {} does not exist", m_ShareId);
- return 0;
+ throw std::runtime_error(fmt::format("Workspace share {} does not exist", m_ShareId));
}
ShowShare(Share, Oid::Zero, ""sv);
- return 0;
+ return;
}
if (SubOption == &m_RemoveOptions)
@@ -560,7 +554,7 @@ WorkspaceShareCommand::Run(const ZenCliOptions& GlobalOptions, int argc, char**
if (ShareConfig.Id == Oid::Zero)
{
ZEN_CONSOLE("Workspace share with alias {} does not exist", m_Alias);
- return 0;
+ return;
}
m_ShareId = ShareConfig.Id.ToString();
m_WorkspaceId = WorkspaceConfig.Id.ToString();
@@ -569,30 +563,30 @@ WorkspaceShareCommand::Run(const ZenCliOptions& GlobalOptions, int argc, char**
if (m_WorkspaceId.empty())
{
- throw zen::OptionParseException("workspace id or root path is required");
+ throw OptionParseException("'--workspace' or '--root-path' is required", SubOption->help());
}
if (Oid::TryFromHexString(m_WorkspaceId) == Oid::Zero)
{
- throw zen::OptionParseException(fmt::format("workspace id '{}' is invalid", m_WorkspaceId));
+ throw OptionParseException(fmt::format("'--workspace' ('{}') is malformed", m_WorkspaceId), SubOption->help());
}
Workspaces::WorkspaceConfiguration WorkspaceConfig = Workspaces::FindWorkspace(Log(), StatePath, Oid::FromHexString(m_WorkspaceId));
if (WorkspaceConfig.Id == Oid::Zero)
{
ZEN_CONSOLE("Workspace {} does not exist", m_WorkspaceId);
- return 0;
+ return;
}
WorkspaceRoot = WorkspaceConfig.RootPath;
if (m_ShareId.empty())
{
- throw zen::OptionParseException("share id is required");
+ throw OptionParseException("'--share' is required", SubOption->help());
}
if (Oid::TryFromHexString(m_ShareId) == Oid::Zero)
{
- throw zen::OptionParseException(fmt::format("workspace id '{}' is invalid", m_ShareId));
+ throw OptionParseException(fmt::format("'--share' ('{}') is malformed", m_ShareId), SubOption->help());
}
if (Workspaces::RemoveWorkspaceShare(Log(), WorkspaceRoot, Oid::FromHexString(m_ShareId)))
@@ -602,16 +596,16 @@ WorkspaceShareCommand::Run(const ZenCliOptions& GlobalOptions, int argc, char**
HttpClient Http(m_HostName);
if (HttpClient::Response Result = Http.Get("/ws/refresh"); !Result)
{
- ZEN_CONSOLE_ERROR("Failed to refresh workspaces for host {}. Reason: '{}'", m_HostName, Result.ErrorMessage(""sv));
+ ZEN_CONSOLE_WARN("Failed to refresh workspaces for host {}. Reason: '{}'", m_HostName, Result.ErrorMessage(""sv));
}
}
ZEN_CONSOLE("Removed workspace share {}", m_ShareId);
- return 0;
+ return;
}
else
{
ZEN_CONSOLE("Removed workspace share {} does not exist", m_ShareId);
- return 0;
+ return;
}
}
@@ -620,12 +614,12 @@ WorkspaceShareCommand::Run(const ZenCliOptions& GlobalOptions, int argc, char**
{
if (m_WorkspaceId.empty())
{
- throw zen::OptionParseException("workspace id is required");
+ throw OptionParseException("'--workspace' is required", Opts.help());
}
if (m_ShareId.empty())
{
- throw zen::OptionParseException(fmt::format("share id is required", Opts.help()));
+ throw OptionParseException("'--share' is required", Opts.help());
}
return fmt::format("{}/{}", m_WorkspaceId, m_ShareId);
}
@@ -649,20 +643,19 @@ WorkspaceShareCommand::Run(const ZenCliOptions& GlobalOptions, int argc, char**
if (m_HostName.empty())
{
- throw zen::OptionParseException("unable to resolve server specification");
+ throw OptionParseException("Unable to resolve server specification", SubOption->help());
}
HttpClient Http(m_HostName);
if (HttpClient::Response Result = Http.Get(fmt::format("/ws/{}/files", GetShareIdentityUrl(m_FilesOptions)), {}, Params))
{
ZEN_CONSOLE("{}: {}", Result, Result.ToText());
- return 0;
}
else
{
Result.ThrowError("failed to get workspace share files"sv);
- return 1;
}
+ return;
}
if (SubOption == &m_EntriesOptions)
@@ -683,20 +676,19 @@ WorkspaceShareCommand::Run(const ZenCliOptions& GlobalOptions, int argc, char**
if (m_HostName.empty())
{
- throw zen::OptionParseException("unable to resolve server specification");
+ throw OptionParseException("Unable to resolve server specification", SubOption->help());
}
HttpClient Http(m_HostName);
if (HttpClient::Response Result = Http.Get(fmt::format("/ws/{}/entries", GetShareIdentityUrl(m_EntriesOptions)), {}, Params))
{
ZEN_CONSOLE("{}: {}", Result, Result.ToText());
- return 0;
}
else
{
Result.ThrowError("failed to get workspace share entries"sv);
- return 1;
}
+ return;
}
auto ChunksToOidStrings = [](HttpClient& Http,
@@ -751,14 +743,14 @@ WorkspaceShareCommand::Run(const ZenCliOptions& GlobalOptions, int argc, char**
if (SubOption == &m_GetChunkOptions)
{
- if (m_ChunkId.empty())
+ if (m_HostName.empty())
{
- throw zen::OptionParseException("chunk id is required");
+ throw OptionParseException("Unable to resolve server specification", SubOption->help());
}
- if (m_HostName.empty())
+ if (m_ChunkId.empty())
{
- throw zen::OptionParseException("unable to resolve server specification");
+ throw OptionParseException("'--chunk' is required", SubOption->help());
}
HttpClient Http(m_HostName);
@@ -777,30 +769,29 @@ WorkspaceShareCommand::Run(const ZenCliOptions& GlobalOptions, int argc, char**
if (HttpClient::Response Result = Http.Get(fmt::format("/ws/{}/{}", GetShareIdentityUrl(m_GetChunkOptions), m_ChunkId), {}, Params))
{
ZEN_CONSOLE("{}: Bytes: {}", Result, NiceBytes(Result.ResponsePayload.GetSize()));
- return 0;
}
else
{
Result.ThrowError("failed to get workspace share chunk"sv);
- return 1;
}
+ return;
}
if (SubOption == &m_GetChunkBatchOptions)
{
- if (m_ShareId.empty())
+ if (m_HostName.empty())
{
- throw zen::OptionParseException(fmt::format("share id is required", m_InfoOptions.help()));
+ throw OptionParseException("Unable to resolve server specification", SubOption->help());
}
- if (m_ChunkIds.empty())
+ if (m_ShareId.empty())
{
- throw zen::OptionParseException("share is is required");
+ throw OptionParseException("'--share' is required", SubOption->help());
}
- if (m_HostName.empty())
+ if (m_ChunkIds.empty())
{
- throw zen::OptionParseException("unable to resolve server specification");
+ throw OptionParseException("'--chunks' is required", SubOption->help());
}
HttpClient Http(m_HostName);
@@ -832,13 +823,12 @@ WorkspaceShareCommand::Run(const ZenCliOptions& GlobalOptions, int argc, char**
{
ZEN_CONSOLE("{}: Bytes: {}", m_ChunkIds[Index], NiceBytes(Results[Index].GetSize()));
}
- return 0;
}
else
{
Result.ThrowError("failed to get workspace share batch"sv);
- return 1;
}
+ return;
}
ZEN_ASSERT(false);