aboutsummaryrefslogtreecommitdiff
path: root/src/zen/cmds/projectstore_cmd.cpp
diff options
context:
space:
mode:
authorDan Engelbrecht <[email protected]>2025-08-12 13:53:58 +0200
committerGitHub Enterprise <[email protected]>2025-08-12 13:53:58 +0200
commit3a9bc3071b9a9452a5aef23c438233fc9e86fb47 (patch)
treeb0a1d67fe765f2ddc96772db088d781be159d627 /src/zen/cmds/projectstore_cmd.cpp
parentadd filtering to builds download (#463) (diff)
downloadarchived-zen-3a9bc3071b9a9452a5aef23c438233fc9e86fb47.tar.xz
archived-zen-3a9bc3071b9a9452a5aef23c438233fc9e86fb47.zip
use new builds api for oplogs (#464)
- Improvement: Refactored jupiter oplog export code to reuse builds jupiter wrapper classes - Improvement: If `zen builds`, `zen oplog-import` or `zen oplog-import` command fails due to a http error, the return code for the program will be set to the error/status code
Diffstat (limited to 'src/zen/cmds/projectstore_cmd.cpp')
-rw-r--r--src/zen/cmds/projectstore_cmd.cpp95
1 files changed, 73 insertions, 22 deletions
diff --git a/src/zen/cmds/projectstore_cmd.cpp b/src/zen/cmds/projectstore_cmd.cpp
index 58af0577e..f919edc87 100644
--- a/src/zen/cmds/projectstore_cmd.cpp
+++ b/src/zen/cmds/projectstore_cmd.cpp
@@ -149,6 +149,16 @@ namespace {
}
}
+ class AsyncJobError : public std::runtime_error
+ {
+ public:
+ using _Mybase = runtime_error;
+
+ AsyncJobError(const std::string& Message, int ReturnCode) : _Mybase(Message), m_ReturnCode(ReturnCode) {}
+
+ const int m_ReturnCode = 0;
+ };
+
void ExecuteAsyncOperation(HttpClient& Http, std::string_view Url, IoBuffer&& Payload, bool PlainProgress)
{
signal(SIGINT, SignalCallbackHandler);
@@ -252,13 +262,14 @@ namespace {
if (Status == "Aborted")
{
std::string_view AbortReason = StatusObject["AbortReason"].AsString();
+ int ReturnCode = StatusObject["ReturnCode"].AsInt32(-1);
if (!AbortReason.empty())
{
- throw std::runtime_error(std::string(AbortReason));
+ throw AsyncJobError(std::string(AbortReason), ReturnCode);
}
else
{
- throw std::runtime_error("Aborted");
+ throw AsyncJobError("Aborted", ReturnCode);
}
break;
}
@@ -1335,24 +1346,44 @@ ExportOplogCommand::Run(const ZenCliOptions& GlobalOptions, int argc, char** arg
ZEN_CONSOLE("Saving oplog '{}/{}' from '{}' to {}", m_ProjectName, m_OplogName, m_HostName, TargetDescription);
- if (m_Async)
+ try
{
- if (HttpClient::Response Result = Http.Post(fmt::format("/prj/{}/oplog/{}/rpc", m_ProjectName, m_OplogName),
- std::move(Payload),
- HttpClient::Accept(ZenContentType::kJSON));
- Result)
+ if (m_Async)
{
- ZEN_CONSOLE("{}", Result.ToText());
+ if (HttpClient::Response Result = Http.Post(fmt::format("/prj/{}/oplog/{}/rpc", m_ProjectName, m_OplogName),
+ std::move(Payload),
+ HttpClient::Accept(ZenContentType::kJSON));
+ Result)
+ {
+ ZEN_CONSOLE("{}", Result.ToText());
+ }
+ else
+ {
+ Result.ThrowError("failed requesting loading oplog export"sv);
+ }
}
else
{
- Result.ThrowError("failed requesting loading oplog export"sv);
- return 1;
+ ExecuteAsyncOperation(Http,
+ fmt::format("/prj/{}/oplog/{}/rpc", m_ProjectName, m_OplogName),
+ std::move(Payload),
+ m_PlainProgress);
}
}
- else
+ catch (const HttpClientError& Ex)
{
- ExecuteAsyncOperation(Http, fmt::format("/prj/{}/oplog/{}/rpc", m_ProjectName, m_OplogName), std::move(Payload), m_PlainProgress);
+ ZEN_CONSOLE("Oplog export failed: '{}'", Ex.what());
+ return Ex.m_Error != 0 ? Ex.m_Error : (int)Ex.m_ResponseCode;
+ }
+ catch (const AsyncJobError& Ex)
+ {
+ ZEN_CONSOLE("Oplog export failed: '{}'", Ex.what());
+ return Ex.m_ReturnCode;
+ }
+ catch (const std::exception& Ex)
+ {
+ ZEN_CONSOLE("Oplog export failed: '{}'", Ex.what());
+ return 1;
}
return 0;
}
@@ -1668,24 +1699,44 @@ ImportOplogCommand::Run(const ZenCliOptions& GlobalOptions, int argc, char** arg
ZEN_CONSOLE("Loading oplog '{}/{}' from '{}' to {}", m_ProjectName, m_OplogName, SourceDescription, m_HostName);
- if (m_Async)
+ try
{
- if (HttpClient::Response Result = Http.Post(fmt::format("/prj/{}/oplog/{}/rpc", m_ProjectName, m_OplogName),
- std::move(Payload),
- HttpClient::Accept(ZenContentType::kJSON));
- Result)
+ if (m_Async)
{
- ZEN_CONSOLE("{}", Result.ToText());
+ if (HttpClient::Response Result = Http.Post(fmt::format("/prj/{}/oplog/{}/rpc", m_ProjectName, m_OplogName),
+ std::move(Payload),
+ HttpClient::Accept(ZenContentType::kJSON));
+ Result)
+ {
+ ZEN_CONSOLE("{}", Result.ToText());
+ }
+ else
+ {
+ Result.ThrowError("failed requesting loading oplog import"sv);
+ }
}
else
{
- Result.ThrowError("failed requesting loading oplog import"sv);
- return 1;
+ ExecuteAsyncOperation(Http,
+ fmt::format("/prj/{}/oplog/{}/rpc", m_ProjectName, m_OplogName),
+ std::move(Payload),
+ m_PlainProgress);
}
}
- else
+ catch (const HttpClientError& Ex)
+ {
+ ZEN_CONSOLE("Oplog import failed: '{}'", Ex.what());
+ return Ex.m_Error != 0 ? Ex.m_Error : (int)Ex.m_ResponseCode;
+ }
+ catch (const AsyncJobError& Ex)
{
- ExecuteAsyncOperation(Http, fmt::format("/prj/{}/oplog/{}/rpc", m_ProjectName, m_OplogName), std::move(Payload), m_PlainProgress);
+ ZEN_CONSOLE("Oplog export failed: '{}'", Ex.what());
+ return Ex.m_ReturnCode;
+ }
+ catch (const std::exception& Ex)
+ {
+ ZEN_CONSOLE("Oplog import failed: '{}'", Ex.what());
+ return 1;
}
return 0;
}