summaryrefslogtreecommitdiff
path: root/src/buildtool/execution_api/local/local_api.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/buildtool/execution_api/local/local_api.hpp')
-rw-r--r--src/buildtool/execution_api/local/local_api.hpp37
1 files changed, 37 insertions, 0 deletions
diff --git a/src/buildtool/execution_api/local/local_api.hpp b/src/buildtool/execution_api/local/local_api.hpp
index 1e3de092..5880475e 100644
--- a/src/buildtool/execution_api/local/local_api.hpp
+++ b/src/buildtool/execution_api/local/local_api.hpp
@@ -15,14 +15,18 @@
#ifndef INCLUDED_SRC_BUILDTOOL_EXECUTION_API_LOCAL_LOCAL_API_HPP
#define INCLUDED_SRC_BUILDTOOL_EXECUTION_API_LOCAL_LOCAL_API_HPP
+#include <iterator>
#include <map>
#include <memory>
#include <optional>
+#include <sstream>
#include <string>
#include <unordered_map>
+#include <variant>
#include <vector>
#include "fmt/core.h"
+#include "grpcpp/support/status.h"
#include "gsl/gsl"
#include "src/buildtool/common/repository_config.hpp"
#include "src/buildtool/compatibility/compatibility.hpp"
@@ -30,6 +34,7 @@
#include "src/buildtool/execution_api/bazel_msg/bazel_blob.hpp"
#include "src/buildtool/execution_api/bazel_msg/blob_tree.hpp"
#include "src/buildtool/execution_api/common/execution_api.hpp"
+#include "src/buildtool/execution_api/execution_service/cas_utils.hpp"
#include "src/buildtool/execution_api/git/git_api.hpp"
#include "src/buildtool/execution_api/local/local_action.hpp"
#include "src/buildtool/file_system/file_system_manager.hpp"
@@ -454,6 +459,38 @@ class LocalApi final : public IExecutionApi {
return result;
}
+ [[nodiscard]] auto SpliceBlob(
+ ArtifactDigest const& blob_digest,
+ std::vector<ArtifactDigest> const& chunk_digests) const noexcept
+ -> std::optional<ArtifactDigest> final {
+ Logger::Log(LogLevel::Debug,
+ "SpliceBlob({}, {} chunks)",
+ blob_digest.hash(),
+ chunk_digests.size());
+ auto digests = std::vector<bazel_re::Digest>{};
+ digests.reserve(chunk_digests.size());
+ std::transform(
+ chunk_digests.cbegin(),
+ chunk_digests.cend(),
+ std::back_inserter(digests),
+ [](auto const& artifact_digest) {
+ return static_cast<bazel_re::Digest>(artifact_digest);
+ });
+ auto splice_result = CASUtils::SpliceBlob(
+ static_cast<bazel_re::Digest>(blob_digest), digests, *storage_);
+ if (std::holds_alternative<grpc::Status>(splice_result)) {
+ auto* status = std::get_if<grpc::Status>(&splice_result);
+ Logger::Log(LogLevel::Error, status->error_message());
+ return std::nullopt;
+ }
+ auto* digest = std::get_if<bazel_re::Digest>(&splice_result);
+ return ArtifactDigest{*digest};
+ }
+
+ [[nodiscard]] auto BlobSpliceSupport() const noexcept -> bool final {
+ return true;
+ }
+
private:
std::optional<gsl::not_null<RepositoryConfig*>> repo_config_{};
gsl::not_null<Storage const*> storage_ = &Storage::Instance();