summaryrefslogtreecommitdiff
path: root/src/buildtool/serve_api/remote/source_tree_client.cpp
diff options
context:
space:
mode:
authorMaksim Denisov <denisov.maksim@huawei.com>2025-01-14 13:05:19 +0100
committerMaksim Denisov <denisov.maksim@huawei.com>2025-01-21 09:58:36 +0100
commit7321beb731e5f09584baaf77554cbfe1c470742f (patch)
tree99e590b9b85951ae30324f88bc13133baf6de6eb /src/buildtool/serve_api/remote/source_tree_client.cpp
parentc326095d4201bea74bbe7ebfffb8a58de3b20bba (diff)
downloadjustbuild-7321beb731e5f09584baaf77554cbfe1c470742f.tar.gz
TreeStructure: Compute on serve
Diffstat (limited to 'src/buildtool/serve_api/remote/source_tree_client.cpp')
-rw-r--r--src/buildtool/serve_api/remote/source_tree_client.cpp37
1 files changed, 37 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 73114350..bdf3fa57 100644
--- a/src/buildtool/serve_api/remote/source_tree_client.cpp
+++ b/src/buildtool/serve_api/remote/source_tree_client.cpp
@@ -360,4 +360,41 @@ auto SourceTreeClient::GetRemoteTree(
return true;
}
+auto SourceTreeClient::ComputeTreeStructure(ArtifactDigest const& tree)
+ const noexcept -> expected<ArtifactDigest, GitLookupError> {
+ justbuild::just_serve::ComputeTreeStructureRequest request{};
+ request.set_tree(tree.hash());
+
+ grpc::ClientContext context;
+ justbuild::just_serve::ComputeTreeStructureResponse response;
+ grpc::Status status =
+ stub_->ComputeTreeStructure(&context, request, &response);
+
+ if (not status.ok()) {
+ LogStatus(&logger_, LogLevel::Debug, status);
+ return unexpected{GitLookupError::Fatal};
+ }
+ if (response.status() !=
+ ::justbuild::just_serve::ComputeTreeStructureResponse::OK) {
+ logger_.Emit(LogLevel::Debug,
+ "ComputeTreeStructure response returned with {}",
+ static_cast<int>(response.status()));
+ return unexpected{response.status() !=
+ ::justbuild::just_serve::
+ ComputeTreeStructureResponse::NOT_FOUND
+ ? GitLookupError::Fatal
+ : GitLookupError::NotFound};
+ }
+ // ComputeTreeStructure operates on git digests.
+ auto digest = ArtifactDigestFactory::Create(HashFunction::Type::GitSHA1,
+ response.tree_structure_hash(),
+ /*size_unknown=*/0,
+ /*is_tree=*/true);
+ if (not digest) {
+ logger_.Emit(LogLevel::Debug, std::move(digest).error());
+ return unexpected{GitLookupError::Fatal};
+ }
+ return *std::move(digest);
+}
+
#endif // BOOTSTRAP_BUILD_TOOL