diff options
| author | Dan Engelbrecht <[email protected]> | 2025-08-12 13:53:58 +0200 |
|---|---|---|
| committer | GitHub Enterprise <[email protected]> | 2025-08-12 13:53:58 +0200 |
| commit | 3a9bc3071b9a9452a5aef23c438233fc9e86fb47 (patch) | |
| tree | b0a1d67fe765f2ddc96772db088d781be159d627 /src/zen/cmds/projectstore_cmd.cpp | |
| parent | add filtering to builds download (#463) (diff) | |
| download | archived-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.cpp | 95 |
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; } |