summaryrefslogtreecommitdiff
path: root/src/buildtool/execution_api/local/local_storage.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/buildtool/execution_api/local/local_storage.cpp')
-rw-r--r--src/buildtool/execution_api/local/local_storage.cpp202
1 files changed, 0 insertions, 202 deletions
diff --git a/src/buildtool/execution_api/local/local_storage.cpp b/src/buildtool/execution_api/local/local_storage.cpp
deleted file mode 100644
index eaeaa617..00000000
--- a/src/buildtool/execution_api/local/local_storage.cpp
+++ /dev/null
@@ -1,202 +0,0 @@
-// Copyright 2022 Huawei Cloud Computing Technology Co., Ltd.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#include "src/buildtool/execution_api/local/local_api.hpp"
-
-namespace {
-
-[[nodiscard]] auto ReadDirectory(
- gsl::not_null<LocalStorage const*> const& storage,
- bazel_re::Digest const& digest) noexcept
- -> std::optional<bazel_re::Directory> {
- if (auto const path = storage->BlobPath(digest, /*is_executable=*/false)) {
- if (auto const content = FileSystemManager::ReadFile(*path)) {
- return BazelMsgFactory::MessageFromString<bazel_re::Directory>(
- *content);
- }
- }
- Logger::Log(LogLevel::Error,
- "Directory {} not found in CAS",
- NativeSupport::Unprefix(digest.hash()));
- return std::nullopt;
-}
-
-[[nodiscard]] auto ReadGitTree(
- gsl::not_null<LocalStorage const*> const& storage,
- bazel_re::Digest const& digest) noexcept
- -> std::optional<GitRepo::tree_entries_t> {
- if (auto const path = storage->TreePath(digest)) {
- if (auto const content = FileSystemManager::ReadFile(*path)) {
- return GitRepo::ReadTreeData(
- *content,
- HashFunction::ComputeTreeHash(*content).Bytes(),
- /*is_hex_id=*/false);
- }
- }
- Logger::Log(LogLevel::Error,
- "Tree {} not found in CAS",
- NativeSupport::Unprefix(digest.hash()));
- return std::nullopt;
-}
-
-[[nodiscard]] auto DumpToStream(gsl::not_null<FILE*> const& stream,
- std::optional<std::string> const& data) noexcept
- -> bool {
- if (data) {
- std::fwrite(data->data(), 1, data->size(), stream);
- return true;
- }
- return false;
-}
-
-[[nodiscard]] auto TreeToStream(
- gsl::not_null<LocalStorage const*> const& storage,
- bazel_re::Digest const& tree_digest,
- gsl::not_null<FILE*> const& stream) noexcept -> bool {
- if (Compatibility::IsCompatible()) {
- if (auto dir = ReadDirectory(storage, tree_digest)) {
- return DumpToStream(stream,
- BazelMsgFactory::DirectoryToString(*dir));
- }
- }
- else {
- if (auto entries = ReadGitTree(storage, tree_digest)) {
- return DumpToStream(stream,
- BazelMsgFactory::GitTreeToString(*entries));
- }
- }
- return false;
-}
-
-[[nodiscard]] auto BlobToStream(
- gsl::not_null<LocalStorage const*> const& storage,
- Artifact::ObjectInfo const& blob_info,
- gsl::not_null<FILE*> const& stream) noexcept -> bool {
- constexpr std::size_t kChunkSize{512};
- auto path =
- storage->BlobPath(blob_info.digest, IsExecutableObject(blob_info.type));
- if (not path and not Compatibility::IsCompatible()) {
- // in native mode, lookup object in tree cas to dump tree as blob
- path = storage->TreePath(blob_info.digest);
- }
- if (path) {
- std::string data(kChunkSize, '\0');
- if (gsl::owner<FILE*> in = std::fopen(path->c_str(), "rb")) {
- while (auto size = std::fread(data.data(), 1, kChunkSize, in)) {
- std::fwrite(data.data(), 1, size, stream);
- }
- std::fclose(in);
- return true;
- }
- }
- return false;
-}
-
-} // namespace
-
-auto LocalStorage::RecursivelyReadTreeLeafs(
- bazel_re::Digest const& tree_digest,
- std::filesystem::path const& parent) const noexcept
- -> std::optional<std::pair<std::vector<std::filesystem::path>,
- std::vector<Artifact::ObjectInfo>>> {
- std::vector<std::filesystem::path> paths{};
- std::vector<Artifact::ObjectInfo> infos{};
-
- auto store_info = [&paths, &infos](auto path, auto info) {
- paths.emplace_back(path);
- infos.emplace_back(info);
- return true;
- };
-
- if (ReadObjectInfosRecursively(store_info, parent, tree_digest)) {
- return std::make_pair(std::move(paths), std::move(infos));
- }
- return std::nullopt;
-}
-
-auto LocalStorage::ReadDirectTreeEntries(
- bazel_re::Digest const& tree_digest,
- std::filesystem::path const& parent) const noexcept
- -> std::optional<std::pair<std::vector<std::filesystem::path>,
- std::vector<Artifact::ObjectInfo>>> {
- std::vector<std::filesystem::path> paths{};
- std::vector<Artifact::ObjectInfo> infos{};
-
- auto store_info = [&paths, &infos](auto path, auto info) {
- paths.emplace_back(path);
- infos.emplace_back(info);
- return true;
- };
-
- if (Compatibility::IsCompatible()) {
- if (auto dir = ReadDirectory(this, tree_digest)) {
- if (not BazelMsgFactory::ReadObjectInfosFromDirectory(
- *dir, [&store_info, &parent](auto path, auto info) {
- return store_info(parent / path, info);
- })) {
- return std::nullopt;
- }
- }
- }
- else {
- if (auto entries = ReadGitTree(this, tree_digest)) {
- if (not BazelMsgFactory::ReadObjectInfosFromGitTree(
- *entries, [&store_info, &parent](auto path, auto info) {
- return store_info(parent / path, info);
- })) {
- return std::nullopt;
- }
- }
- }
- return std::make_pair(std::move(paths), std::move(infos));
-}
-
-// NOLINTNEXTLINE(misc-no-recursion)
-auto LocalStorage::ReadObjectInfosRecursively(
- BazelMsgFactory::InfoStoreFunc const& store_info,
- std::filesystem::path const& parent,
- bazel_re::Digest const& digest) const noexcept -> bool {
- // read from CAS
- if (Compatibility::IsCompatible()) {
- if (auto dir = ReadDirectory(this, digest)) {
- return BazelMsgFactory::ReadObjectInfosFromDirectory(
- *dir, [this, &store_info, &parent](auto path, auto info) {
- return IsTreeObject(info.type)
- ? ReadObjectInfosRecursively(
- store_info, parent / path, info.digest)
- : store_info(parent / path, info);
- });
- }
- }
- else {
- if (auto entries = ReadGitTree(this, digest)) {
- return BazelMsgFactory::ReadObjectInfosFromGitTree(
- *entries, [this, &store_info, &parent](auto path, auto info) {
- return IsTreeObject(info.type)
- ? ReadObjectInfosRecursively(
- store_info, parent / path, info.digest)
- : store_info(parent / path, info);
- });
- }
- }
- return false;
-}
-
-auto LocalStorage::DumpToStream(Artifact::ObjectInfo const& info,
- gsl::not_null<FILE*> const& stream,
- bool raw_tree) const noexcept -> bool {
- return IsTreeObject(info.type) and not raw_tree
- ? TreeToStream(this, info.digest, stream)
- : BlobToStream(this, info, stream);
-}