summaryrefslogtreecommitdiff
path: root/src/buildtool/execution_api/local/local_action.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/buildtool/execution_api/local/local_action.cpp')
-rw-r--r--src/buildtool/execution_api/local/local_action.cpp71
1 files changed, 52 insertions, 19 deletions
diff --git a/src/buildtool/execution_api/local/local_action.cpp b/src/buildtool/execution_api/local/local_action.cpp
index 3ccc58eb..331aaaa5 100644
--- a/src/buildtool/execution_api/local/local_action.cpp
+++ b/src/buildtool/execution_api/local/local_action.cpp
@@ -235,26 +235,59 @@ auto LocalAction::CollectOutputDir(std::filesystem::path const& exec_path,
Logger::Log(LogLevel::Error, "expected directory at {}", local_path);
return std::nullopt;
}
- auto digest = BazelMsgFactory::CreateDirectoryDigestFromLocalTree(
- dir_path,
- [this](auto path, auto is_exec) {
- return storage_->StoreBlob</*kOwner=*/true>(path, is_exec);
- },
- [this](auto bytes, auto dir) -> std::optional<bazel_re::Digest> {
- auto digest = storage_->StoreBlob(bytes);
- if (digest and not tree_map_->HasTree(*digest)) {
- auto tree = tree_map_->CreateTree();
- if (not BazelMsgFactory::ReadObjectInfosFromDirectory(
- dir,
- [&tree](auto path, auto info) {
- return tree.AddInfo(path, info);
- }) or
- not tree_map_->AddTree(*digest, std::move(tree))) {
- return std::nullopt;
+ std::optional<bazel_re::Digest> digest{std::nullopt};
+ if (Compatibility::IsCompatible()) {
+ digest = BazelMsgFactory::CreateDirectoryDigestFromLocalTree(
+ dir_path,
+ [this](auto path, auto is_exec) {
+ return storage_->StoreBlob</*kOwner=*/true>(path, is_exec);
+ },
+ [this](auto bytes, auto dir) -> std::optional<bazel_re::Digest> {
+ auto digest = storage_->StoreBlob(bytes);
+ if (digest and not tree_map_->HasTree(*digest)) {
+ auto tree = tree_map_->CreateTree();
+ if (not BazelMsgFactory::ReadObjectInfosFromDirectory(
+ dir,
+ [&tree](auto path, auto info) {
+ return tree.AddInfo(path, info);
+ }) or
+ not tree_map_->AddTree(*digest, std::move(tree))) {
+ return std::nullopt;
+ }
}
- }
- return digest;
- });
+ return digest;
+ });
+ }
+ else {
+ digest = BazelMsgFactory::CreateGitTreeDigestFromLocalTree(
+ dir_path,
+ [this](auto path, auto is_exec) {
+ return storage_->StoreBlob</*kOwner=*/true>(path, is_exec);
+ },
+ [this](auto bytes,
+ auto entries) -> std::optional<bazel_re::Digest> {
+ auto digest = storage_->StoreTree(bytes);
+ if (digest and not tree_map_->HasTree(*digest)) {
+ auto tree = tree_map_->CreateTree();
+ for (auto const& [raw_id, es] : entries) {
+ auto id = ToHexString(raw_id);
+ for (auto const& entry : es) {
+ auto info = Artifact::ObjectInfo{
+ ArtifactDigest{
+ id, 0, entry.type == ObjectType::Tree},
+ entry.type};
+ if (not tree.AddInfo(entry.name, info)) {
+ return std::nullopt;
+ }
+ }
+ }
+ if (not tree_map_->AddTree(*digest, std::move(tree))) {
+ return std::nullopt;
+ }
+ }
+ return digest;
+ });
+ }
if (digest) {
auto out_dir = bazel_re::OutputDirectory{};
out_dir.set_path(local_path);