summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/buildtool/computed_roots/TARGETS2
-rw-r--r--src/buildtool/computed_roots/artifacts_root.cpp31
-rw-r--r--src/buildtool/computed_roots/artifacts_root.hpp6
3 files changed, 24 insertions, 15 deletions
diff --git a/src/buildtool/computed_roots/TARGETS b/src/buildtool/computed_roots/TARGETS
index bb2bc0a4..e1d9bd79 100644
--- a/src/buildtool/computed_roots/TARGETS
+++ b/src/buildtool/computed_roots/TARGETS
@@ -29,7 +29,9 @@
, "stage": ["src", "buildtool", "computed_roots"]
, "deps":
[ ["src/buildtool/build_engine/expression", "expression_ptr_interface"]
+ , ["src/buildtool/execution_api/utils", "rehash_utils"]
, ["src/buildtool/multithreading", "async_map_consumer"]
+ , ["src/utils/cpp", "expected"]
]
, "private-deps":
[ ["@", "fmt", "", "fmt"]
diff --git a/src/buildtool/computed_roots/artifacts_root.cpp b/src/buildtool/computed_roots/artifacts_root.cpp
index 8124461b..1fa5ee7d 100644
--- a/src/buildtool/computed_roots/artifacts_root.cpp
+++ b/src/buildtool/computed_roots/artifacts_root.cpp
@@ -31,6 +31,7 @@
#include "src/buildtool/common/artifact_digest.hpp"
#include "src/buildtool/file_system/git_repo.hpp"
#include "src/buildtool/file_system/object_type.hpp"
+#include "src/utils/cpp/expected.hpp"
#include "src/utils/cpp/hex_string.hpp"
namespace {
@@ -138,7 +139,8 @@ struct PartialTree {
} // namespace
auto ArtifactsRoot(ExpressionPtr const& stage,
- AsyncMapConsumerLoggerPtr const& logger)
+ AsyncMapConsumerLoggerPtr const& logger,
+ std::optional<RehashUtils::Rehasher> const& rehash)
-> std::optional<std::string> {
if (not stage->IsMap()) {
(*logger)(fmt::format("Expected stage to be a map, but found {}",
@@ -167,23 +169,26 @@ auto ArtifactsRoot(ExpressionPtr const& stage,
true);
return std::nullopt;
}
- auto digest = val.ToArtifact().Digest();
- if (not digest) {
- (*logger)(
- fmt::format("Failed to determine digest of known artifact {}",
- entry->ToString()),
- true);
- return std::nullopt;
- }
- auto ot = val.ToArtifact().Type();
- if (not ot) {
- (*logger)(fmt::format("Failed to determine object typle of known "
+ auto info_opt = val.ToArtifact().Info();
+ if (not info_opt) {
+ (*logger)(fmt::format("Failed to determine artifact info of known "
"artifact {}",
entry->ToString()),
true);
return std::nullopt;
}
- if (not partial_tree.Add(ps, digest->hash(), *ot, logger)) {
+ auto info = *info_opt;
+ if (rehash) {
+ auto rehash_result = rehash->Rehash(info);
+ if (not rehash_result) {
+ (*logger)(
+ fmt::format("Rehashing failed: {}", rehash_result.error()),
+ true);
+ return std::nullopt;
+ }
+ info = *rehash_result;
+ }
+ if (not partial_tree.Add(ps, info.digest.hash(), info.type, logger)) {
return std::nullopt;
}
}
diff --git a/src/buildtool/computed_roots/artifacts_root.hpp b/src/buildtool/computed_roots/artifacts_root.hpp
index 6ed727fa..95b72877 100644
--- a/src/buildtool/computed_roots/artifacts_root.hpp
+++ b/src/buildtool/computed_roots/artifacts_root.hpp
@@ -19,6 +19,7 @@
#include <string>
#include "src/buildtool/build_engine/expression/expression_ptr.hpp"
+#include "src/buildtool/execution_api/utils/rehash_utils.hpp"
#include "src/buildtool/multithreading/async_map_consumer.hpp"
/// \brief Compute to the git tree identifier, as hex string, corresponding to
@@ -28,7 +29,8 @@
/// \param logger Logger to report problems; will be called with the fatal
/// property in case of error
auto ArtifactsRoot(ExpressionPtr const& stage,
- AsyncMapConsumerLoggerPtr const& logger)
- -> std::optional<std::string>;
+ AsyncMapConsumerLoggerPtr const& logger,
+ std::optional<RehashUtils::Rehasher> const& rehash =
+ std::nullopt) -> std::optional<std::string>;
#endif