summaryrefslogtreecommitdiff
path: root/src
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
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')
-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