diff options
Diffstat (limited to 'src/other_tools')
-rw-r--r-- | src/other_tools/just_mr/TARGETS | 3 | ||||
-rw-r--r-- | src/other_tools/just_mr/setup_utils.cpp | 16 | ||||
-rw-r--r-- | src/other_tools/repo_map/TARGETS | 2 | ||||
-rw-r--r-- | src/other_tools/repo_map/repos_to_setup_map.cpp | 60 | ||||
-rw-r--r-- | src/other_tools/utils/TARGETS | 11 | ||||
-rw-r--r-- | src/other_tools/utils/parse_computed_root.hpp | 48 | ||||
-rw-r--r-- | src/other_tools/utils/parse_precomputed_root.cpp (renamed from src/other_tools/utils/parse_computed_root.cpp) | 84 | ||||
-rw-r--r-- | src/other_tools/utils/parse_precomputed_root.hpp | 27 |
8 files changed, 114 insertions, 137 deletions
diff --git a/src/other_tools/just_mr/TARGETS b/src/other_tools/just_mr/TARGETS index b8792067..cca118f4 100644 --- a/src/other_tools/just_mr/TARGETS +++ b/src/other_tools/just_mr/TARGETS @@ -103,9 +103,10 @@ [ "exit_codes" , ["@", "json", "", "json"] , ["src/buildtool/file_system", "file_system_manager"] + , ["src/buildtool/file_system", "precomputed_root"] , ["src/buildtool/logging", "log_level"] , ["src/buildtool/logging", "logging"] - , ["src/other_tools/utils", "parse_computed_root"] + , ["src/other_tools/utils", "parse_precomputed_root"] , ["src/utils/cpp", "expected"] ] } diff --git a/src/other_tools/just_mr/setup_utils.cpp b/src/other_tools/just_mr/setup_utils.cpp index 2ab0ebfa..63f555d8 100644 --- a/src/other_tools/just_mr/setup_utils.cpp +++ b/src/other_tools/just_mr/setup_utils.cpp @@ -29,10 +29,11 @@ #include "src/buildtool/build_engine/expression/expression.hpp" #include "src/buildtool/execution_api/remote/config.hpp" #include "src/buildtool/file_system/file_system_manager.hpp" +#include "src/buildtool/file_system/precomputed_root.hpp" #include "src/buildtool/logging/log_level.hpp" #include "src/buildtool/logging/logger.hpp" #include "src/other_tools/just_mr/exit_codes.hpp" -#include "src/other_tools/utils/parse_computed_root.hpp" +#include "src/other_tools/utils/parse_precomputed_root.hpp" #include "src/utils/cpp/expected.hpp" namespace { @@ -58,16 +59,14 @@ void WarnUnknownKeys(std::string const& name, ExpressionPtr const& repo_def) { } } -[[nodiscard]] auto GetTargetRepoIfComputed(ExpressionPtr const& repo) +[[nodiscard]] auto GetTargetRepoIfPrecomputed(ExpressionPtr const& repo) -> std::optional<std::string> { if (not repo.IsNotNull() or not repo->IsMap()) { return std::nullopt; } auto const repository = repo->Get("repository", Expression::none_t{}); - if (auto const crparser = ComputedRootParser::Create(&repository)) { - if (auto target_repo = crparser->GetTargetRepository()) { - return std::move(target_repo).value(); - } + if (auto const precomputed = ParsePrecomputedRoot(repository)) { + return precomputed->GetReferencedRepository(); } return std::nullopt; } @@ -101,7 +100,8 @@ void ReachableRepositories( WarnUnknownKeys(repo_name, repos_repo_name); // If the current repo is a computed one, process its target repo - if (auto computed_target = GetTargetRepoIfComputed(repos_repo_name)) { + if (auto computed_target = + GetTargetRepoIfPrecomputed(repos_repo_name)) { to_process.push(*std::move(computed_target)); } @@ -125,7 +125,7 @@ void ReachableRepositories( // If the overlay repo is a computed one, process its target // repo - if (auto computed_target = GetTargetRepoIfComputed( + if (auto computed_target = GetTargetRepoIfPrecomputed( repos->Get(layer_repo_name, Expression::none_t{}))) { to_process.push(*std::move(computed_target)); } diff --git a/src/other_tools/repo_map/TARGETS b/src/other_tools/repo_map/TARGETS index af80fa2f..f6362327 100644 --- a/src/other_tools/repo_map/TARGETS +++ b/src/other_tools/repo_map/TARGETS @@ -30,8 +30,8 @@ , ["src/other_tools/ops_maps", "content_cas_map"] , ["src/other_tools/ops_maps", "git_tree_fetch_map"] , ["src/other_tools/utils", "parse_archive"] - , ["src/other_tools/utils", "parse_computed_root"] , ["src/other_tools/utils", "parse_git_tree"] + , ["src/other_tools/utils", "parse_precomputed_root"] , ["src/utils/cpp", "expected"] , ["src/utils/cpp", "path"] ] diff --git a/src/other_tools/repo_map/repos_to_setup_map.cpp b/src/other_tools/repo_map/repos_to_setup_map.cpp index 779406b4..4a8498c5 100644 --- a/src/other_tools/repo_map/repos_to_setup_map.cpp +++ b/src/other_tools/repo_map/repos_to_setup_map.cpp @@ -33,8 +33,8 @@ #include "src/other_tools/ops_maps/content_cas_map.hpp" #include "src/other_tools/ops_maps/git_tree_fetch_map.hpp" #include "src/other_tools/utils/parse_archive.hpp" -#include "src/other_tools/utils/parse_computed_root.hpp" #include "src/other_tools/utils/parse_git_tree.hpp" +#include "src/other_tools/utils/parse_precomputed_root.hpp" #include "src/utils/cpp/expected.hpp" #include "src/utils/cpp/path.hpp" @@ -637,45 +637,39 @@ void GitTreeCheckout(ExpressionPtr const& repo_desc, }); } -void ComputedRootCheckout(ExpressionPtr const& repo_desc, - ExpressionPtr&& repos, - std::string const& repo_name, - ReposToSetupMap::SetterPtr const& setter, - ReposToSetupMap::SubCallerPtr const& subcaller, - ReposToSetupMap::LoggerPtr const& logger) { - auto const parser = ComputedRootParser::Create(&repo_desc); - if (not parser) { - (*logger)( - fmt::format("ComputedRootCheckout: Not a computed repository: {}", - nlohmann::json(repo_name).dump()), - /*fatal=*/true); - return; - } - auto result_root = parser->GetResult(); - if (not result_root) { - (*logger)(fmt::format("ComputedRootCheckout: parsing repository {} " - "failed with:\n{}", +void PrecomputedRootCheckout(ExpressionPtr const& repo_desc, + ExpressionPtr&& repos, + std::string const& repo_name, + ReposToSetupMap::SetterPtr const& setter, + ReposToSetupMap::SubCallerPtr const& subcaller, + ReposToSetupMap::LoggerPtr const& logger) { + auto precomputed = ParsePrecomputedRoot(repo_desc); + if (not precomputed) { + (*logger)(fmt::format("Checkout of precomputed root {} failed:\n{}", nlohmann::json(repo_name).dump(), - std::move(result_root).error()), + std::move(precomputed).error()), /*fatal=*/true); return; } - std::string target_repo = result_root->repository; + + std::string target_repo = precomputed->GetReferencedRepository(); (*subcaller)( {std::move(target_repo)}, [setter, repos = std::move(repos), repo_name, - result = *std::move(result_root)](auto const& /*unused*/) { + result = *std::move(precomputed)](auto const& /*unused*/) { nlohmann::json cfg{}; auto& ws_root = cfg["workspace_root"]; SetReposTakeOver(&cfg, repos, repo_name); - ws_root.push_back("computed"); - ws_root.push_back(result.repository); - ws_root.push_back(result.target_module); - ws_root.push_back(result.target_name); - ws_root.push_back(result.config); + if (auto computed = result.AsComputed()) { + ws_root.push_back(ComputedRoot::kMarker); + ws_root.push_back(computed->repository); + ws_root.push_back(computed->target_module); + ws_root.push_back(computed->target_name); + ws_root.push_back(computed->config); + } std::invoke(*setter, std::move(cfg)); }, logger); @@ -867,12 +861,12 @@ auto CreateReposToSetupMap( break; } case CheckoutType::Computed: { - ComputedRootCheckout(*resolved_repo_desc, - std::move(repos), - key, - setter, - subcaller, - wrapped_logger); + PrecomputedRootCheckout(*resolved_repo_desc, + std::move(repos), + key, + setter, + subcaller, + wrapped_logger); break; } } diff --git a/src/other_tools/utils/TARGETS b/src/other_tools/utils/TARGETS index 8e1803b9..550de9f5 100644 --- a/src/other_tools/utils/TARGETS +++ b/src/other_tools/utils/TARGETS @@ -95,14 +95,13 @@ ] , "stage": ["src", "other_tools", "utils"] } -, "parse_computed_root": +, "parse_precomputed_root": { "type": ["@", "rules", "CC", "library"] - , "name": ["parse_computed_root"] - , "hdrs": ["parse_computed_root.hpp"] - , "srcs": ["parse_computed_root.cpp"] + , "name": ["parse_precomputed_root"] + , "hdrs": ["parse_precomputed_root.hpp"] + , "srcs": ["parse_precomputed_root.cpp"] , "deps": - [ ["@", "gsl", "", "gsl"] - , ["src/buildtool/build_engine/expression", "expression_ptr_interface"] + [ ["src/buildtool/build_engine/expression", "expression_ptr_interface"] , ["src/buildtool/file_system", "precomputed_root"] , ["src/utils/cpp", "expected"] ] diff --git a/src/other_tools/utils/parse_computed_root.hpp b/src/other_tools/utils/parse_computed_root.hpp deleted file mode 100644 index 2cc54c87..00000000 --- a/src/other_tools/utils/parse_computed_root.hpp +++ /dev/null @@ -1,48 +0,0 @@ -// Copyright 2024 Huawei Cloud Computing Technology Co., Ltd. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef INCLUDED_SRC_OTHER_TOOLS_UTILS_PARSE_COMPUTED_ROOT_HPP -#define INCLUDED_SRC_OTHER_TOOLS_UTILS_PARSE_COMPUTED_ROOT_HPP - -#include <optional> -#include <string> - -#include "gsl/gsl" -#include "src/buildtool/build_engine/expression/expression_ptr.hpp" -#include "src/buildtool/file_system/precomputed_root.hpp" -#include "src/utils/cpp/expected.hpp" - -class ComputedRootParser final { - public: - /// \brief Create a parser for computed roots - /// \param repository Repository to be parsed - /// \return Initialized parser on success, or std::nullopt if repository - /// isn't Map or type is not computed. - [[nodiscard]] static auto Create( - gsl::not_null<ExpressionPtr const*> const& repository) noexcept - -> std::optional<ComputedRootParser>; - - [[nodiscard]] auto GetTargetRepository() const - -> expected<std::string, std::string>; - - [[nodiscard]] auto GetResult() const -> expected<ComputedRoot, std::string>; - - private: - ExpressionPtr const& repository_; - explicit ComputedRootParser( - gsl::not_null<ExpressionPtr const*> const& repository) - : repository_{*repository} {} -}; - -#endif // INCLUDED_SRC_OTHER_TOOLS_UTILS_PARSE_COMPUTED_ROOT_HPP diff --git a/src/other_tools/utils/parse_computed_root.cpp b/src/other_tools/utils/parse_precomputed_root.cpp index 540f43c0..0b176450 100644 --- a/src/other_tools/utils/parse_computed_root.cpp +++ b/src/other_tools/utils/parse_precomputed_root.cpp @@ -12,75 +12,79 @@ // See the License for the specific language governing permissions and // limitations under the License. -#include "src/other_tools/utils/parse_computed_root.hpp" +#include "src/other_tools/utils/parse_precomputed_root.hpp" + +#include <utility> #include "fmt/core.h" #include "nlohmann/json.hpp" #include "src/buildtool/build_engine/expression/expression.hpp" -auto ComputedRootParser::Create( - gsl::not_null<ExpressionPtr const*> const& repository) noexcept - -> std::optional<ComputedRootParser> { - if (not repository->IsNotNull() or not(*repository)->IsMap()) { - return std::nullopt; - } - try { - auto const type = (*repository)->Get("type", Expression::none_t{}); - if (type.IsNotNull() and type->IsString() and - type->String() == "computed") { - return ComputedRootParser{repository}; - } - } catch (...) { - return std::nullopt; - } - return std::nullopt; -} - -auto ComputedRootParser::GetTargetRepository() const - -> expected<std::string, std::string> { - auto const repo = repository_->Get("repo", Expression::none_t{}); +namespace { +[[nodiscard]] auto ParseComputedRoot(ExpressionPtr const& repository) + -> expected<ComputedRoot, std::string> { + auto const repo = repository->Get("repo", Expression::none_t{}); if (not repo.IsNotNull()) { return unexpected<std::string>{"Mandatory key \"repo\" is missing"}; } if (not repo->IsString()) { - return unexpected{fmt::format("Unsupported value {} for key \"repo\".", + return unexpected{fmt::format("Unsupported value for key \"repo\":\n{}", repo->ToString())}; } - return repo->String(); -} - -auto ComputedRootParser::GetResult() const - -> expected<ComputedRoot, std::string> { - auto const repo = GetTargetRepository(); - if (not repo) { - return unexpected{repo.error()}; - } - auto const target = repository_->Get("target", Expression::none_t{}); + auto const target = repository->Get("target", Expression::none_t{}); if (not target.IsNotNull()) { return unexpected<std::string>{"Mandatory key \"target\" is missing"}; } if (not target->IsList() or target->List().size() != 2) { - return unexpected{fmt::format("Unsupported value {} for key \"target\"", - target->ToString())}; + return unexpected{fmt::format( + "Unsupported value for key \"target\":\n{}", target->ToString())}; } auto const& target_list = target->List(); auto const target_module = target_list.at(0); auto const target_name = target_list.at(1); if (not target_module->IsString() or not target_name->IsString()) { return unexpected{fmt::format( - "Unsupported format {} for key \"target\"", target->ToString())}; + "Unsupported format for key \"target\":\n{}", target->ToString())}; } - auto const config = repository_->Get("config", Expression::none_t{}); + auto const config = repository->Get("config", Expression::none_t{}); if (config.IsNotNull() and not config->IsMap()) { - return unexpected{fmt::format("Unsupported value {} for key \"config\"", - config->ToString())}; + return unexpected{fmt::format( + "Unsupported value for key \"config\":\n{}", config->ToString())}; } - return ComputedRoot{.repository = *repo, + return ComputedRoot{.repository = repo->String(), .target_module = target_module->String(), .target_name = target_module->String(), .config = config.IsNotNull() ? config->ToJson() : nlohmann::json::object()}; } +} // namespace + +auto ParsePrecomputedRoot(ExpressionPtr const& repository) + -> expected<PrecomputedRoot, std::string> { + if (not repository.IsNotNull() or not repository->IsMap()) { + return unexpected<std::string>{"Repository has an incorrect format"}; + } + + auto const type = repository->Get("type", Expression::none_t()); + if (not type.IsNotNull()) { + return unexpected<std::string>{"Mandatory key \"type\" is missing"}; + } + if (not type->IsString()) { + return unexpected{fmt::format("Unsupported value for key \"type\":\n{}", + type->ToString())}; + } + + auto const& type_marker = type->String(); + if (type_marker == ComputedRoot::kMarker) { + auto computed = ParseComputedRoot(repository); + if (not computed) { + return unexpected{std::move(computed).error()}; + } + return PrecomputedRoot{*std::move(computed)}; + } + return unexpected{ + fmt::format("Unknown type {} of precomputed repository", type_marker)}; +} diff --git a/src/other_tools/utils/parse_precomputed_root.hpp b/src/other_tools/utils/parse_precomputed_root.hpp new file mode 100644 index 00000000..be72dd9a --- /dev/null +++ b/src/other_tools/utils/parse_precomputed_root.hpp @@ -0,0 +1,27 @@ +// Copyright 2024 Huawei Cloud Computing Technology Co., Ltd. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#ifndef INCLUDED_SRC_OTHER_TOOLS_UTILS_PARSE_PRECOMPUTED_ROOT_HPP +#define INCLUDED_SRC_OTHER_TOOLS_UTILS_PARSE_PRECOMPUTED_ROOT_HPP + +#include <string> + +#include "src/buildtool/build_engine/expression/expression_ptr.hpp" +#include "src/buildtool/file_system/precomputed_root.hpp" +#include "src/utils/cpp/expected.hpp" + +[[nodiscard]] auto ParsePrecomputedRoot(ExpressionPtr const& repository) + -> expected<PrecomputedRoot, std::string>; + +#endif // INCLUDED_SRC_OTHER_TOOLS_UTILS_PARSE_PRECOMPUTED_ROOT_HPP |