diff options
author | Maksim Denisov <denisov.maksim@huawei.com> | 2025-01-14 13:05:19 +0100 |
---|---|---|
committer | Maksim Denisov <denisov.maksim@huawei.com> | 2025-01-21 09:58:36 +0100 |
commit | 7321beb731e5f09584baaf77554cbfe1c470742f (patch) | |
tree | 99e590b9b85951ae30324f88bc13133baf6de6eb /src/buildtool/serve_api/remote/source_tree_client.cpp | |
parent | c326095d4201bea74bbe7ebfffb8a58de3b20bba (diff) | |
download | justbuild-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.cpp | 37 |
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 |