summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/buildtool/execution_api/local/TARGETS1
-rw-r--r--src/buildtool/execution_api/local/local_cas_reader.cpp30
2 files changed, 10 insertions, 21 deletions
diff --git a/src/buildtool/execution_api/local/TARGETS b/src/buildtool/execution_api/local/TARGETS
index 04f78c34..dd083f2a 100644
--- a/src/buildtool/execution_api/local/TARGETS
+++ b/src/buildtool/execution_api/local/TARGETS
@@ -54,6 +54,7 @@
, ["src/buildtool/file_system", "object_type"]
, ["src/buildtool/system", "system_command"]
, ["src/utils/cpp", "back_map"]
+ , ["src/utils/cpp", "incremental_reader"]
]
}
, "context":
diff --git a/src/buildtool/execution_api/local/local_cas_reader.cpp b/src/buildtool/execution_api/local/local_cas_reader.cpp
index c88f5c15..58af1cbd 100644
--- a/src/buildtool/execution_api/local/local_cas_reader.cpp
+++ b/src/buildtool/execution_api/local/local_cas_reader.cpp
@@ -17,7 +17,6 @@
#include <algorithm>
#include <compare>
#include <cstddef>
-#include <cstdio>
#include <deque>
#include <memory>
#include <stack>
@@ -37,6 +36,7 @@
#include "src/buildtool/logging/log_level.hpp"
#include "src/buildtool/logging/logger.hpp"
#include "src/utils/cpp/expected.hpp"
+#include "src/utils/cpp/incremental_reader.hpp"
#include "src/utils/cpp/path.hpp"
namespace {
@@ -164,29 +164,17 @@ auto LocalCasReader::StageBlobTo(
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) {
+ constexpr std::size_t kChunkSize{512};
+ auto to_read = IncrementalReader::FromFile(kChunkSize, path);
+ if (not to_read.has_value()) {
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;
+ return std::all_of(
+ to_read->begin(), to_read->end(), [&dumper](auto const& chunk) {
+ return chunk.has_value() and
+ std::invoke(dumper, std::string{chunk.value()});
+ });
}
auto LocalCasReader::IsNativeProtocol() const noexcept -> bool {