summaryrefslogtreecommitdiff
path: root/src/buildtool/serve_api/remote/source_tree_client.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/buildtool/serve_api/remote/source_tree_client.cpp')
-rw-r--r--src/buildtool/serve_api/remote/source_tree_client.cpp72
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();
+}