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/buildtool/computed_roots/artifacts_root.cpp | |
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/buildtool/computed_roots/artifacts_root.cpp')
-rw-r--r-- | src/buildtool/computed_roots/artifacts_root.cpp | 31 |
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; } } |