From dab6ee07fe6d4523d7fb0f6b352e23a608721b56 Mon Sep 17 00:00:00 2001 From: Paul Cristian Sarbu Date: Thu, 21 Sep 2023 16:09:58 +0200 Subject: remote serve: Extend client and API with tree-of-archive service calls --- .../serve_api/remote/source_tree_client.cpp | 72 ++++++++++++++++++++++ 1 file changed, 72 insertions(+) (limited to 'src/buildtool/serve_api/remote/source_tree_client.cpp') 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 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 const& resolve_symlinks, + bool sync_tree) -> std::optional { + 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(response.status())); + return std::nullopt; + } + return response.tree(); +} -- cgit v1.2.3