diff options
Diffstat (limited to 'src/other_tools/just_mr/utils.cpp')
-rw-r--r-- | src/other_tools/just_mr/utils.cpp | 31 |
1 files changed, 31 insertions, 0 deletions
diff --git a/src/other_tools/just_mr/utils.cpp b/src/other_tools/just_mr/utils.cpp index 4d668bc6..f0ca606c 100644 --- a/src/other_tools/just_mr/utils.cpp +++ b/src/other_tools/just_mr/utils.cpp @@ -100,4 +100,35 @@ void AddDistfileToCAS(std::filesystem::path const& distfile, } } +// NOLINTNEXTLINE(misc-no-recursion) +auto ResolveRepo(ExpressionPtr const& repo_desc, + ExpressionPtr const& repos, + gsl::not_null<std::unordered_set<std::string>*> const& seen) + -> std::optional<ExpressionPtr> { + if (not repo_desc->IsString()) { + return repo_desc; + } + auto desc_str = repo_desc->String(); + if (seen->contains(desc_str)) { + // cyclic dependency + return std::nullopt; + } + [[maybe_unused]] auto insert_res = seen->insert(desc_str); + return ResolveRepo(repos[desc_str]["repository"], repos, seen); +} + +auto ResolveRepo(ExpressionPtr const& repo_desc, + ExpressionPtr const& repos) noexcept + -> std::optional<ExpressionPtr> { + std::unordered_set<std::string> seen = {}; + try { + return ResolveRepo(repo_desc, repos, &seen); + } catch (std::exception const& e) { + Logger::Log(LogLevel::Error, + "Config: while resolving dependencies: {}", + e.what()); + return std::nullopt; + } +} + } // namespace JustMR::Utils |