diff options
author | Klaus Aehlig <klaus.aehlig@huawei.com> | 2024-12-03 10:17:46 +0100 |
---|---|---|
committer | Klaus Aehlig <klaus.aehlig@huawei.com> | 2024-12-04 18:03:44 +0100 |
commit | 240d3eb488947e57d690caf245e43eeef0cc7f1f (patch) | |
tree | 600eafaed2deb89f8aca70a75967001faa5a7f42 /src | |
parent | f2c7776e00d6a0ed9f601fbfbf082cab0393d640 (diff) | |
download | justbuild-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/TARGETS | 2 | ||||
-rw-r--r-- | src/buildtool/computed_roots/artifacts_root.cpp | 31 | ||||
-rw-r--r-- | src/buildtool/computed_roots/artifacts_root.hpp | 6 |
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 |