summaryrefslogtreecommitdiff
path: root/src/buildtool/execution_api/local/local_cas_reader.cpp
diff options
context:
space:
mode:
authorMaksim Denisov <denisov.maksim@huawei.com>2024-05-24 12:08:48 +0200
committerMaksim Denisov <denisov.maksim@huawei.com>2024-05-27 16:36:58 +0200
commitcd9b1aab78186a1b9a01dbd5319cfd9faafe4662 (patch)
treec7d475f718a17663b58ffc5ee816fd461e811245 /src/buildtool/execution_api/local/local_cas_reader.cpp
parent1c6acd97737f4d49b5e0d1dbb97e3c1d75d0e145 (diff)
downloadjustbuild-cd9b1aab78186a1b9a01dbd5319cfd9faafe4662.tar.gz
Use common interface for stream dumping
...in LocalApi and BazelApi.
Diffstat (limited to 'src/buildtool/execution_api/local/local_cas_reader.cpp')
-rw-r--r--src/buildtool/execution_api/local/local_cas_reader.cpp45
1 files changed, 45 insertions, 0 deletions
diff --git a/src/buildtool/execution_api/local/local_cas_reader.cpp b/src/buildtool/execution_api/local/local_cas_reader.cpp
index 411bc5d7..a8933adc 100644
--- a/src/buildtool/execution_api/local/local_cas_reader.cpp
+++ b/src/buildtool/execution_api/local/local_cas_reader.cpp
@@ -14,6 +14,10 @@
#include "src/buildtool/execution_api/local/local_cas_reader.hpp"
+#include <cstdio>
+#include <memory>
+
+#include "gsl/gsl"
#include "src/buildtool/crypto/hash_function.hpp"
#include "src/buildtool/execution_api/bazel_msg/bazel_msg_factory.hpp"
#include "src/buildtool/file_system/file_system_manager.hpp"
@@ -64,3 +68,44 @@ auto LocalCasReader::ReadGitTree(ArtifactDigest const& digest) const noexcept
Logger::Log(LogLevel::Debug, "Tree {} not found in CAS", digest.hash());
return std::nullopt;
}
+
+auto LocalCasReader::DumpRawTree(Artifact::ObjectInfo const& info,
+ DumpCallback const& dumper) const noexcept
+ -> bool {
+ auto path = cas_.TreePath(info.digest);
+ return path ? DumpRaw(*path, dumper) : false;
+}
+
+auto LocalCasReader::DumpBlob(Artifact::ObjectInfo const& info,
+ DumpCallback const& dumper) const noexcept
+ -> bool {
+ auto path = cas_.BlobPath(info.digest, IsExecutableObject(info.type));
+ return path ? DumpRaw(*path, dumper) : false;
+}
+
+auto LocalCasReader::DumpRaw(std::filesystem::path const& path,
+ DumpCallback const& dumper) noexcept -> bool {
+ auto closer = [](gsl::owner<FILE*> file) -> void {
+ if (file != nullptr) {
+ std::fclose(file);
+ }
+ };
+ auto in = std::shared_ptr<FILE>{std::fopen(path.c_str(), "rb"), closer};
+ if (not in) {
+ return false;
+ }
+
+ constexpr std::size_t kChunkSize{512};
+ std::string buffer(kChunkSize, '\0');
+ while (auto size = std::fread(buffer.data(), 1, buffer.size(), in.get())) {
+ try {
+ buffer.resize(size);
+ if (not std::invoke(dumper, buffer)) {
+ return false;
+ }
+ } catch (...) {
+ return false;
+ }
+ }
+ return true;
+}