summaryrefslogtreecommitdiff
path: root/src/buildtool/computed_roots/artifacts_root.cpp
diff options
context:
space:
mode:
authorKlaus Aehlig <klaus.aehlig@huawei.com>2024-12-03 10:17:46 +0100
committerKlaus Aehlig <klaus.aehlig@huawei.com>2024-12-04 18:03:44 +0100
commit240d3eb488947e57d690caf245e43eeef0cc7f1f (patch)
tree600eafaed2deb89f8aca70a75967001faa5a7f42 /src/buildtool/computed_roots/artifacts_root.cpp
parentf2c7776e00d6a0ed9f601fbfbf082cab0393d640 (diff)
downloadjustbuild-240d3eb488947e57d690caf245e43eeef0cc7f1f.tar.gz
ArtifactsRoot: support rehash-function
When constructing a git tree out of an artifact stage, support rehashing the artifact digests on the fly, so that artifact stages not based on GitSHA1 can be supported as well.
Diffstat (limited to 'src/buildtool/computed_roots/artifacts_root.cpp')
-rw-r--r--src/buildtool/computed_roots/artifacts_root.cpp31
1 files changed, 18 insertions, 13 deletions
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;
}
}