diff options
Diffstat (limited to 'src/buildtool/serve_api/remote/source_tree_client.cpp')
-rw-r--r-- | src/buildtool/serve_api/remote/source_tree_client.cpp | 72 |
1 files changed, 72 insertions, 0 deletions
diff --git a/src/buildtool/serve_api/remote/source_tree_client.cpp b/src/buildtool/serve_api/remote/source_tree_client.cpp index 2026d80d..a2ff930f 100644 --- a/src/buildtool/serve_api/remote/source_tree_client.cpp +++ b/src/buildtool/serve_api/remote/source_tree_client.cpp @@ -16,6 +16,46 @@ #include "src/buildtool/common/remote/client_common.hpp" +namespace { + +auto StringToArchiveType(std::string const& type) + -> justbuild::just_serve::ServeArchiveTreeRequest_ArchiveType { + using ServeArchiveType = + justbuild::just_serve::ServeArchiveTreeRequest_ArchiveType; + return type == "zip" + ? ServeArchiveType::ServeArchiveTreeRequest_ArchiveType_ZIP + : ServeArchiveType::ServeArchiveTreeRequest_ArchiveType_TAR; +} + +auto PragmaSpecialToSymlinksResolve( + std::optional<PragmaSpecial> const& resolve_symlinks) + -> justbuild::just_serve::ServeArchiveTreeRequest_SymlinksResolve { + using ServeSymlinksResolve = + justbuild::just_serve::ServeArchiveTreeRequest_SymlinksResolve; + if (not resolve_symlinks) { + return ServeSymlinksResolve:: + ServeArchiveTreeRequest_SymlinksResolve_NONE; + } + switch (resolve_symlinks.value()) { + case PragmaSpecial::Ignore: { + return ServeSymlinksResolve:: + ServeArchiveTreeRequest_SymlinksResolve_IGNORE; + } + case PragmaSpecial::ResolvePartially: { + return ServeSymlinksResolve:: + ServeArchiveTreeRequest_SymlinksResolve_PARTIAL; + } + case PragmaSpecial::ResolveCompletely: { + return ServeSymlinksResolve:: + ServeArchiveTreeRequest_SymlinksResolve_COMPLETE; + } + } + // default return, to avoid [-Werror=return-type] error + return ServeSymlinksResolve::ServeArchiveTreeRequest_SymlinksResolve_NONE; +} + +} // namespace + SourceTreeClient::SourceTreeClient(std::string const& server, Port port) noexcept { stub_ = justbuild::just_serve::SourceTree::NewStub( @@ -48,3 +88,35 @@ auto SourceTreeClient::ServeCommitTree(std::string const& commit_id, } return response.tree(); } + +auto SourceTreeClient::ServeArchiveTree( + std::string const& content, + std::string const& archive_type, + std::string const& subdir, + std::optional<PragmaSpecial> const& resolve_symlinks, + bool sync_tree) -> std::optional<std::string> { + justbuild::just_serve::ServeArchiveTreeRequest request{}; + request.set_content(content); + request.set_archive_type(StringToArchiveType(archive_type)); + request.set_subdir(subdir); + request.set_resolve_symlinks( + PragmaSpecialToSymlinksResolve(resolve_symlinks)); + request.set_sync_tree(sync_tree); + + grpc::ClientContext context; + justbuild::just_serve::ServeArchiveTreeResponse response; + grpc::Status status = stub_->ServeArchiveTree(&context, request, &response); + + if (not status.ok()) { + LogStatus(&logger_, LogLevel::Debug, status); + return std::nullopt; + } + if (response.status() != + ::justbuild::just_serve::ServeArchiveTreeResponse::OK) { + logger_.Emit(LogLevel::Debug, + "ServeArchiveTree response returned with {}", + static_cast<int>(response.status())); + return std::nullopt; + } + return response.tree(); +} |