diff options
57 files changed, 759 insertions, 411 deletions
diff --git a/src/buildtool/build_engine/base_maps/TARGETS b/src/buildtool/build_engine/base_maps/TARGETS index ddc03ab9..0b30a49b 100644 --- a/src/buildtool/build_engine/base_maps/TARGETS +++ b/src/buildtool/build_engine/base_maps/TARGETS @@ -14,10 +14,10 @@ [ ["src/buildtool/multithreading", "async_map_consumer"] , "module_name" , ["src/buildtool/file_system", "file_root"] + , ["src/buildtool/common", "config"] ] , "stage": ["src", "buildtool", "build_engine", "base_maps"] - , "private-deps": - [["src/buildtool/common", "config"], ["src/utils/cpp", "path"]] + , "private-deps": [["src/utils/cpp", "path"]] } , "json_file_map": { "type": ["@", "rules", "CC", "library"] @@ -84,6 +84,7 @@ , ["@", "gsl", "", "gsl"] , ["src/buildtool/build_engine/analysed_target", "target"] , ["src/buildtool/build_engine/expression", "expression"] + , ["src/buildtool/common", "config"] , ["src/buildtool/multithreading", "async_map_consumer"] , ["src/buildtool/multithreading", "task_system"] ] @@ -99,6 +100,7 @@ , ["@", "fmt", "", "fmt"] , ["@", "json", "", "json"] , ["@", "gsl", "", "gsl"] + , ["src/buildtool/common", "config"] , ["src/buildtool/multithreading", "async_map_consumer"] , ["src/buildtool/build_engine/expression", "expression"] ] @@ -129,6 +131,7 @@ , ["@", "gsl", "", "gsl"] , ["@", "fmt", "", "fmt"] , ["@", "json", "", "json"] + , ["src/buildtool/common", "config"] , ["src/buildtool/multithreading", "async_map_consumer"] , "module_name" ] @@ -164,6 +167,7 @@ , ["@", "gsl", "", "gsl"] , ["@", "fmt", "", "fmt"] , ["@", "json", "", "json"] + , ["src/buildtool/common", "config"] , ["src/buildtool/multithreading", "async_map_consumer"] , "module_name" ] diff --git a/src/buildtool/build_engine/base_maps/directory_map.cpp b/src/buildtool/build_engine/base_maps/directory_map.cpp index b37a62e7..da360e4e 100644 --- a/src/buildtool/build_engine/base_maps/directory_map.cpp +++ b/src/buildtool/build_engine/base_maps/directory_map.cpp @@ -17,19 +17,18 @@ #include <filesystem> #include <unordered_set> -#include "src/buildtool/common/repository_config.hpp" #include "src/buildtool/multithreading/async_map_consumer.hpp" #include "src/utils/cpp/path.hpp" -auto BuildMaps::Base::CreateDirectoryEntriesMap(std::size_t jobs) - -> DirectoryEntriesMap { - auto directory_reader = [](auto /* unused*/, - auto setter, - auto logger, - auto /* unused */, - auto const& key) { - auto const* ws_root = - RepositoryConfig::Instance().WorkspaceRoot(key.repository); +auto BuildMaps::Base::CreateDirectoryEntriesMap( + gsl::not_null<RepositoryConfig*> const& repo_config, + std::size_t jobs) -> DirectoryEntriesMap { + auto directory_reader = [repo_config](auto /* unused*/, + auto setter, + auto logger, + auto /* unused */, + auto const& key) { + auto const* ws_root = repo_config->WorkspaceRoot(key.repository); if (ws_root == nullptr) { (*logger)( fmt::format("Cannot determine workspace root for repository {}", diff --git a/src/buildtool/build_engine/base_maps/directory_map.hpp b/src/buildtool/build_engine/base_maps/directory_map.hpp index 1cf7f358..efce6510 100644 --- a/src/buildtool/build_engine/base_maps/directory_map.hpp +++ b/src/buildtool/build_engine/base_maps/directory_map.hpp @@ -21,6 +21,7 @@ #include "gsl/gsl" #include "src/buildtool/build_engine/base_maps/module_name.hpp" +#include "src/buildtool/common/repository_config.hpp" #include "src/buildtool/file_system/file_root.hpp" #include "src/buildtool/multithreading/async_map_consumer.hpp" @@ -29,7 +30,9 @@ namespace BuildMaps::Base { using DirectoryEntriesMap = AsyncMapConsumer<ModuleName, FileRoot::DirectoryEntries>; -auto CreateDirectoryEntriesMap(std::size_t jobs = 0) -> DirectoryEntriesMap; +auto CreateDirectoryEntriesMap( + gsl::not_null<RepositoryConfig*> const& repo_config, + std::size_t jobs = 0) -> DirectoryEntriesMap; } // namespace BuildMaps::Base diff --git a/src/buildtool/build_engine/base_maps/entity_name.hpp b/src/buildtool/build_engine/base_maps/entity_name.hpp index bec5b083..12d1ec95 100644 --- a/src/buildtool/build_engine/base_maps/entity_name.hpp +++ b/src/buildtool/build_engine/base_maps/entity_name.hpp @@ -182,6 +182,7 @@ template <typename T> T const& list, std::size_t const list_size, EntityName const& current, + gsl::not_null<RepositoryConfig*> const& repo_config, std::optional<std::function<void(std::string const&)>> logger = std::nullopt) noexcept -> std::optional<EntityName> { try { @@ -190,7 +191,7 @@ template <typename T> auto const& local_repo_name = GetString(list[1]); auto const& module = GetString(list[2]); auto const& target = GetString(list[3]); - auto const* repo_name = RepositoryConfig::Instance().GlobalName( + auto const* repo_name = repo_config->GlobalName( current.GetNamedTarget().repository, local_repo_name); if (repo_name != nullptr) { return EntityName{*repo_name, module, target}; @@ -212,6 +213,7 @@ template <typename T> T const& list, std::size_t const list_size, EntityName const& current, + gsl::not_null<RepositoryConfig*> const& repo_config, std::optional<std::function<void(std::string const&)>> logger = std::nullopt) noexcept -> std::optional<EntityName> { try { @@ -224,7 +226,7 @@ template <typename T> } if (s0 == EntityName::kLocationMarker) { return ParseEntityNameLocation( - list, list_size, current, logger); + list, list_size, current, repo_config, logger); } if (s0 == EntityName::kAnonymousMarker and logger) { (*logger)(fmt::format( @@ -249,6 +251,7 @@ template <typename T> [[nodiscard]] inline auto ParseEntityName( T const& source, EntityName const& current, + gsl::not_null<RepositoryConfig*> const& repo_config, std::optional<std::function<void(std::string const&)>> logger = std::nullopt) noexcept -> std::optional<EntityName> { try { @@ -264,7 +267,8 @@ template <typename T> res = ParseEntityName_2(list, current); } else if (list_size >= 3) { - res = ParseEntityName_3(list, list_size, current, logger); + res = ParseEntityName_3( + list, list_size, current, repo_config, logger); } } if (logger and (res == std::nullopt)) { @@ -280,17 +284,19 @@ template <typename T> [[nodiscard]] inline auto ParseEntityNameFromJson( nlohmann::json const& json, EntityName const& current, + gsl::not_null<RepositoryConfig*> const& repo_config, std::optional<std::function<void(std::string const&)>> logger = std::nullopt) noexcept -> std::optional<EntityName> { - return ParseEntityName(json, current, std::move(logger)); + return ParseEntityName(json, current, repo_config, std::move(logger)); } [[nodiscard]] inline auto ParseEntityNameFromExpression( ExpressionPtr const& expr, EntityName const& current, + gsl::not_null<RepositoryConfig*> const& repo_config, std::optional<std::function<void(std::string const&)>> logger = std::nullopt) noexcept -> std::optional<EntityName> { - return ParseEntityName(expr, current, std::move(logger)); + return ParseEntityName(expr, current, repo_config, std::move(logger)); } } // namespace BuildMaps::Base diff --git a/src/buildtool/build_engine/base_maps/expression_map.cpp b/src/buildtool/build_engine/base_maps/expression_map.cpp index e495fa6b..5b2c0655 100644 --- a/src/buildtool/build_engine/base_maps/expression_map.cpp +++ b/src/buildtool/build_engine/base_maps/expression_map.cpp @@ -23,12 +23,13 @@ namespace BuildMaps::Base { auto CreateExpressionMap(gsl::not_null<ExpressionFileMap*> const& expr_file_map, + gsl::not_null<RepositoryConfig*> const& repo_config, std::size_t jobs) -> ExpressionFunctionMap { - auto expr_func_creator = [expr_file_map](auto ts, - auto setter, - auto logger, - auto subcaller, - auto const& id) { + auto expr_func_creator = [expr_file_map, repo_config](auto ts, + auto setter, + auto logger, + auto subcaller, + auto const& id) { if (not id.IsDefinitionName()) { (*logger)( fmt::format("{} cannot name an expression", id.ToString()), @@ -38,7 +39,8 @@ auto CreateExpressionMap(gsl::not_null<ExpressionFileMap*> const& expr_file_map, expr_file_map->ConsumeAfterKeysReady( ts, {id.ToModule()}, - [setter = std::move(setter), + [repo_config, + setter = std::move(setter), logger, subcaller = std::move(subcaller), id](auto json_values) { @@ -68,7 +70,7 @@ auto CreateExpressionMap(gsl::not_null<ExpressionFileMap*> const& expr_file_map, } auto import_aliases = - reader->ReadEntityAliasesObject("imports"); + reader->ReadEntityAliasesObject("imports", repo_config); if (not import_aliases) { return; } diff --git a/src/buildtool/build_engine/base_maps/expression_map.hpp b/src/buildtool/build_engine/base_maps/expression_map.hpp index 4b2ebfb9..5d08b78b 100644 --- a/src/buildtool/build_engine/base_maps/expression_map.hpp +++ b/src/buildtool/build_engine/base_maps/expression_map.hpp @@ -24,6 +24,7 @@ #include "src/buildtool/build_engine/base_maps/expression_function.hpp" #include "src/buildtool/build_engine/base_maps/json_file_map.hpp" #include "src/buildtool/build_engine/base_maps/module_name.hpp" +#include "src/buildtool/common/repository_config.hpp" #include "src/buildtool/multithreading/async_map_consumer.hpp" namespace BuildMaps::Base { @@ -39,6 +40,7 @@ using ExpressionFunctionMap = AsyncMapConsumer<EntityName, ExpressionFunctionPtr>; auto CreateExpressionMap(gsl::not_null<ExpressionFileMap*> const& expr_file_map, + gsl::not_null<RepositoryConfig*> const& repo_config, std::size_t jobs = 0) -> ExpressionFunctionMap; } // namespace BuildMaps::Base diff --git a/src/buildtool/build_engine/base_maps/field_reader.hpp b/src/buildtool/build_engine/base_maps/field_reader.hpp index ba774e49..bc73a56c 100644 --- a/src/buildtool/build_engine/base_maps/field_reader.hpp +++ b/src/buildtool/build_engine/base_maps/field_reader.hpp @@ -25,6 +25,7 @@ #include "nlohmann/json.hpp" #include "src/buildtool/build_engine/base_maps/entity_name.hpp" #include "src/buildtool/build_engine/expression/expression.hpp" +#include "src/buildtool/common/repository_config.hpp" #include "src/buildtool/multithreading/async_map_consumer.hpp" namespace BuildMaps::Base { @@ -170,7 +171,9 @@ class FieldReader { } [[nodiscard]] auto ReadEntityAliasesObject( - std::string const& field_name) const -> std::optional<EntityAliases> { + std::string const& field_name, + gsl::not_null<RepositoryConfig*> const& repo_config) const + -> std::optional<EntityAliases> { auto const& map = GetOrDefault(json_, field_name, nlohmann::json::object()); if (not map.is_object()) { @@ -189,6 +192,7 @@ class FieldReader { auto expr_id = ParseEntityNameFromJson( val, id_, + repo_config, [this, &field_name, entry = val.dump()]( std::string const& parse_err) { (*logger_)(fmt::format("Parsing entry {} in field {} of {} " diff --git a/src/buildtool/build_engine/base_maps/json_file_map.hpp b/src/buildtool/build_engine/base_maps/json_file_map.hpp index f5fb190e..f24b3564 100644 --- a/src/buildtool/build_engine/base_maps/json_file_map.hpp +++ b/src/buildtool/build_engine/base_maps/json_file_map.hpp @@ -39,15 +39,15 @@ using FileNameGetter = auto (RepositoryConfig::*)(std::string const&) const -> std::string const*; template <RootGetter get_root, FileNameGetter get_name, bool kMandatory = true> -auto CreateJsonFileMap(std::size_t jobs) -> JsonFileMap { - auto json_file_reader = [](auto /* unused */, - auto setter, - auto logger, - auto /* unused */, - auto const& key) { - auto const& config = RepositoryConfig::Instance(); - auto const* root = (config.*get_root)(key.repository); - auto const* json_file_name = (config.*get_name)(key.repository); +auto CreateJsonFileMap(gsl::not_null<RepositoryConfig*> const& repo_config, + std::size_t jobs) -> JsonFileMap { + auto json_file_reader = [repo_config](auto /* unused */, + auto setter, + auto logger, + auto /* unused */, + auto const& key) { + auto const* root = ((*repo_config).*get_root)(key.repository); + auto const* json_file_name = ((*repo_config).*get_name)(key.repository); if (root == nullptr or json_file_name == nullptr) { (*logger)(fmt::format("Cannot determine root or JSON file name for " "repository {}.", diff --git a/src/buildtool/build_engine/base_maps/rule_map.cpp b/src/buildtool/build_engine/base_maps/rule_map.cpp index c8a3dc22..0a198490 100644 --- a/src/buildtool/build_engine/base_maps/rule_map.cpp +++ b/src/buildtool/build_engine/base_maps/rule_map.cpp @@ -42,9 +42,11 @@ auto const kRuleFields = std::unordered_set<std::string>{"anonymous", "tainted", "target_fields"}; -[[nodiscard]] auto ReadAnonymousObject(EntityName const& id, - nlohmann::json const& json, - AsyncMapConsumerLoggerPtr const& logger) +[[nodiscard]] auto ReadAnonymousObject( + EntityName const& id, + nlohmann::json const& json, + gsl::not_null<RepositoryConfig*> const& repo_config, + AsyncMapConsumerLoggerPtr const& logger) -> std::optional<UserRule::anonymous_defs_t> { auto obj = GetOrDefault(json, "anonymous", nlohmann::json::object()); if (not obj.is_object()) { @@ -123,7 +125,7 @@ auto const kRuleFields = std::unordered_set<std::string>{"anonymous", Expression::map_t::underlying_map_t rule_mapping{}; for (auto const& [key, val] : rule_map->items()) { auto rule_name = ParseEntityNameFromJson( - val, id, [&logger, &id, &name = name](auto msg) { + val, id, repo_config, [&logger, &id, &name = name](auto msg) { (*logger)( fmt::format("Parsing rule name for entry {} in field " "anonymous in rule {} failed with:\n{}", @@ -148,9 +150,11 @@ auto const kRuleFields = std::unordered_set<std::string>{"anonymous", return anon_defs; } -[[nodiscard]] auto ReadImplicitObject(EntityName const& id, - nlohmann::json const& json, - AsyncMapConsumerLoggerPtr const& logger) +[[nodiscard]] auto ReadImplicitObject( + EntityName const& id, + nlohmann::json const& json, + gsl::not_null<RepositoryConfig*> const& repo_config, + AsyncMapConsumerLoggerPtr const& logger) -> std::optional<UserRule::implicit_t> { auto map = GetOrDefault(json, "implicit", nlohmann::json::object()); if (not map.is_object()) { @@ -175,7 +179,10 @@ auto const kRuleFields = std::unordered_set<std::string>{"anonymous", targets.reserve(val.size()); for (auto const& item : val) { auto expr_id = ParseEntityNameFromJson( - item, id, [&logger, &item, &id](std::string const& parse_err) { + item, + id, + repo_config, + [&logger, &item, &id](std::string const& parse_err) { (*logger)(fmt::format("Parsing entry {} in implicit field " "of rule {} failed with:\n{}", item.dump(), @@ -234,12 +241,14 @@ auto const kRuleFields = std::unordered_set<std::string>{"anonymous", auto CreateRuleMap(gsl::not_null<RuleFileMap*> const& rule_file_map, gsl::not_null<ExpressionFunctionMap*> const& expr_map, + gsl::not_null<RepositoryConfig*> const& repo_config, std::size_t jobs) -> UserRuleMap { - auto user_rule_creator = [rule_file_map, expr_map](auto ts, - auto setter, - auto logger, - auto /*subcaller*/, - auto const& id) { + auto user_rule_creator = [rule_file_map, expr_map, repo_config]( + auto ts, + auto setter, + auto logger, + auto /*subcaller*/, + auto const& id) { if (not id.IsDefinitionName()) { (*logger)(fmt::format("{} cannot name a rule", id.ToString()), true); @@ -248,7 +257,7 @@ auto CreateRuleMap(gsl::not_null<RuleFileMap*> const& rule_file_map, rule_file_map->ConsumeAfterKeysReady( ts, {id.ToModule()}, - [ts, expr_map, setter = std::move(setter), logger, id]( + [ts, expr_map, repo_config, setter = std::move(setter), logger, id]( auto json_values) { const auto& target_ = id.GetNamedTarget(); auto rule_it = json_values[0]->find(target_.name); @@ -288,14 +297,14 @@ auto CreateRuleMap(gsl::not_null<RuleFileMap*> const& rule_file_map, return; } - auto implicit_targets = - ReadImplicitObject(id, rule_it.value(), logger); + auto implicit_targets = ReadImplicitObject( + id, rule_it.value(), repo_config, logger); if (not implicit_targets) { return; } - auto anonymous_defs = - ReadAnonymousObject(id, rule_it.value(), logger); + auto anonymous_defs = ReadAnonymousObject( + id, rule_it.value(), repo_config, logger); if (not anonymous_defs) { return; } @@ -311,7 +320,7 @@ auto CreateRuleMap(gsl::not_null<RuleFileMap*> const& rule_file_map, } auto import_aliases = - reader->ReadEntityAliasesObject("imports"); + reader->ReadEntityAliasesObject("imports", repo_config); if (not import_aliases) { return; } diff --git a/src/buildtool/build_engine/base_maps/rule_map.hpp b/src/buildtool/build_engine/base_maps/rule_map.hpp index ab9c0098..251065dc 100644 --- a/src/buildtool/build_engine/base_maps/rule_map.hpp +++ b/src/buildtool/build_engine/base_maps/rule_map.hpp @@ -25,6 +25,7 @@ #include "src/buildtool/build_engine/base_maps/json_file_map.hpp" #include "src/buildtool/build_engine/base_maps/module_name.hpp" #include "src/buildtool/build_engine/base_maps/user_rule.hpp" +#include "src/buildtool/common/repository_config.hpp" #include "src/buildtool/multithreading/async_map_consumer.hpp" namespace BuildMaps::Base { @@ -40,6 +41,7 @@ using UserRuleMap = AsyncMapConsumer<EntityName, UserRulePtr>; auto CreateRuleMap(gsl::not_null<RuleFileMap*> const& rule_file_map, gsl::not_null<ExpressionFunctionMap*> const& expr_map, + gsl::not_null<RepositoryConfig*> const& repo_config, std::size_t jobs = 0) -> UserRuleMap; } // namespace BuildMaps::Base diff --git a/src/buildtool/build_engine/base_maps/source_map.cpp b/src/buildtool/build_engine/base_maps/source_map.cpp index 1b39ec3e..0453657a 100644 --- a/src/buildtool/build_engine/base_maps/source_map.cpp +++ b/src/buildtool/build_engine/base_maps/source_map.cpp @@ -45,12 +45,13 @@ auto as_target(const BuildMaps::Base::EntityName& key, ExpressionPtr artifact) } // namespace auto CreateSourceTargetMap(const gsl::not_null<DirectoryEntriesMap*>& dirs, + gsl::not_null<RepositoryConfig*> const& repo_config, std::size_t jobs) -> SourceTargetMap { - auto src_target_reader = [dirs](auto ts, - auto setter, - auto logger, - auto /* unused */, - auto const& key) { + auto src_target_reader = [dirs, repo_config](auto ts, + auto setter, + auto logger, + auto /* unused */, + auto const& key) { using std::filesystem::path; const auto& target = key.GetNamedTarget(); auto name = path(target.name).lexically_normal(); @@ -62,8 +63,7 @@ auto CreateSourceTargetMap(const gsl::not_null<DirectoryEntriesMap*>& dirs, return; } auto dir = (path(target.module) / name).parent_path(); - auto const* ws_root = - RepositoryConfig::Instance().WorkspaceRoot(target.repository); + auto const* ws_root = repo_config->WorkspaceRoot(target.repository); auto src_file_reader = [key, name, setter, logger, dir, ws_root]( bool exists_in_ws_root) { diff --git a/src/buildtool/build_engine/base_maps/source_map.hpp b/src/buildtool/build_engine/base_maps/source_map.hpp index 899d9ce4..61c8ad6f 100644 --- a/src/buildtool/build_engine/base_maps/source_map.hpp +++ b/src/buildtool/build_engine/base_maps/source_map.hpp @@ -23,6 +23,7 @@ #include "src/buildtool/build_engine/base_maps/directory_map.hpp" #include "src/buildtool/build_engine/base_maps/entity_name.hpp" #include "src/buildtool/build_engine/expression/expression.hpp" +#include "src/buildtool/common/repository_config.hpp" #include "src/buildtool/multithreading/async_map_consumer.hpp" #include "src/buildtool/multithreading/task_system.hpp" @@ -31,6 +32,7 @@ namespace BuildMaps::Base { using SourceTargetMap = AsyncMapConsumer<EntityName, AnalysedTargetPtr>; auto CreateSourceTargetMap(const gsl::not_null<DirectoryEntriesMap*>& dirs, + gsl::not_null<RepositoryConfig*> const& repo_config, std::size_t jobs = 0) -> SourceTargetMap; } // namespace BuildMaps::Base diff --git a/src/buildtool/build_engine/target_map/TARGETS b/src/buildtool/build_engine/target_map/TARGETS index 0ddbdf27..d5af4dfe 100644 --- a/src/buildtool/build_engine/target_map/TARGETS +++ b/src/buildtool/build_engine/target_map/TARGETS @@ -45,6 +45,7 @@ , ["src/buildtool/build_engine/base_maps", "rule_map"] , ["src/buildtool/build_engine/base_maps", "source_map"] , ["src/buildtool/build_engine/base_maps", "targets_file_map"] + , ["src/buildtool/common", "config"] , ["src/buildtool/multithreading", "async_map_consumer"] , ["src/utils/cpp", "gsl"] , ["@", "fmt", "", "fmt"] @@ -81,6 +82,7 @@ , ["src/buildtool/build_engine/base_maps", "field_reader"] , ["src/buildtool/build_engine/expression", "expression"] , ["src/buildtool/build_engine/analysed_target", "target"] + , ["src/buildtool/common", "config"] ] , "stage": ["src", "buildtool", "build_engine", "target_map"] } @@ -94,13 +96,13 @@ [ "configured_target" , "result_map" , ["src/buildtool/build_engine/analysed_target", "target"] + , ["src/buildtool/common", "config"] , ["src/buildtool/multithreading", "async_map_consumer"] , ["@", "gsl", "", "gsl"] ] , "stage": ["src", "buildtool", "build_engine", "target_map"] , "private-deps": [ ["src/buildtool/common", "common"] - , ["src/buildtool/common", "config"] , ["src/buildtool/storage", "storage"] , ["src/buildtool/logging", "logging"] , ["src/buildtool/serve_api/remote", "serve_api"] diff --git a/src/buildtool/build_engine/target_map/absent_target_map.cpp b/src/buildtool/build_engine/target_map/absent_target_map.cpp index 38ab6cfa..3ceaa4d8 100644 --- a/src/buildtool/build_engine/target_map/absent_target_map.cpp +++ b/src/buildtool/build_engine/target_map/absent_target_map.cpp @@ -14,26 +14,26 @@ #include "src/buildtool/build_engine/target_map/absent_target_map.hpp" #ifndef BOOTSTRAP_BUILD_TOOL -#include "src/buildtool/common/repository_config.hpp" #include "src/buildtool/serve_api/remote/serve_api.hpp" #include "src/buildtool/storage/target_cache_key.hpp" #endif + auto BuildMaps::Target::CreateAbsentTargetMap( const gsl::not_null<ResultTargetMap*>& result_map, + gsl::not_null<RepositoryConfig*> const& repo_config, std::size_t jobs) -> AbsentTargetMap { #ifndef BOOTSTRAP_BUILD_TOOL - auto target_reader = [result_map](auto /*ts*/, - auto setter, - auto logger, - auto /*subcaller*/, - auto key) { + auto target_reader = [result_map, repo_config](auto /*ts*/, + auto setter, + auto logger, + auto /*subcaller*/, + auto key) { // assumptions: // - target with absent targets file requested // - ServeApi correctly configured auto const& repo_name = key.target.ToModule().repository; - auto target_root_id = RepositoryConfig::Instance() - .TargetRoot(repo_name) - ->GetAbsentTreeId(); + auto target_root_id = + repo_config->TargetRoot(repo_name)->GetAbsentTreeId(); if (!target_root_id) { (*logger)(fmt::format("Failed to get the target root id for " "repository \"{}\"", @@ -43,7 +43,7 @@ auto BuildMaps::Target::CreateAbsentTargetMap( } auto flexible_vars = ServeApi::ServeTargetVariables( *target_root_id, - *RepositoryConfig::Instance().TargetFileName(repo_name), + *(repo_config->TargetFileName(repo_name)), key.target.GetNamedTarget().name); if (!flexible_vars) { (*logger)(fmt::format("Failed to obtain flexible config variables " @@ -55,8 +55,7 @@ auto BuildMaps::Target::CreateAbsentTargetMap( // TODO(asartori): avoid code duplication in export.cpp auto effective_config = key.config.Prune(*flexible_vars); auto target_name = key.target.GetNamedTarget(); - auto repo_key = - RepositoryConfig::Instance().RepositoryKey(target_name.repository); + auto repo_key = repo_config->RepositoryKey(target_name.repository); if (!repo_key) { (*logger)( fmt::format("Failed to obtain repository key for repo \"{}\"", diff --git a/src/buildtool/build_engine/target_map/absent_target_map.hpp b/src/buildtool/build_engine/target_map/absent_target_map.hpp index 11959b2f..aa2b5b42 100644 --- a/src/buildtool/build_engine/target_map/absent_target_map.hpp +++ b/src/buildtool/build_engine/target_map/absent_target_map.hpp @@ -18,12 +18,14 @@ #include "src/buildtool/build_engine/analysed_target/analysed_target.hpp" #include "src/buildtool/build_engine/target_map/configured_target.hpp" #include "src/buildtool/build_engine/target_map/result_map.hpp" +#include "src/buildtool/common/repository_config.hpp" #include "src/buildtool/multithreading/async_map_consumer.hpp" namespace BuildMaps::Target { using AbsentTargetMap = AsyncMapConsumer<ConfiguredTarget, AnalysedTargetPtr>; auto CreateAbsentTargetMap(const gsl::not_null<ResultTargetMap*>&, + gsl::not_null<RepositoryConfig*> const& repo_config, std::size_t jobs = 0) -> AbsentTargetMap; } // namespace BuildMaps::Target diff --git a/src/buildtool/build_engine/target_map/built_in_rules.cpp b/src/buildtool/build_engine/target_map/built_in_rules.cpp index 70ecf1f2..fca1eaaa 100644 --- a/src/buildtool/build_engine/target_map/built_in_rules.cpp +++ b/src/buildtool/build_engine/target_map/built_in_rules.cpp @@ -84,6 +84,7 @@ void BlobGenRuleWithDeps( const std::vector<AnalysedTargetPtr const*>& dependency_values, const BuildMaps::Base::FieldReader::Ptr& desc, const BuildMaps::Target::ConfiguredTarget& key, + const gsl::not_null<RepositoryConfig*>& repo_config, const BuildMaps::Target::TargetMap::SetterPtr& setter, const BuildMaps::Target::TargetMap::LoggerPtr& logger, const gsl::not_null<BuildMaps::Target::ResultTargetMap*>& result_map, @@ -123,19 +124,29 @@ void BlobGenRuleWithDeps( auto string_fields_fcts = FunctionMap::MakePtr(FunctionMap::underlying_map_t{ {"outs", - [&deps_by_transition, &key]( + [&deps_by_transition, &key, repo_config]( auto&& eval, auto const& expr, auto const& env) { return BuildMaps::Target::Utils::keys_expr( BuildMaps::Target::Utils::obtainTargetByName( - eval, expr, env, key.target, deps_by_transition) + eval, + expr, + env, + key.target, + repo_config, + deps_by_transition) ->Artifacts()); }}, {"runfiles", - [&deps_by_transition, &key]( + [&deps_by_transition, &key, repo_config]( auto&& eval, auto const& expr, auto const& env) { return BuildMaps::Target::Utils::keys_expr( BuildMaps::Target::Utils::obtainTargetByName( - eval, expr, env, key.target, deps_by_transition) + eval, + expr, + env, + key.target, + repo_config, + deps_by_transition) ->RunFiles()); }}}); @@ -232,6 +243,7 @@ void BlobGenRuleWithDeps( void BlobGenRule( const nlohmann::json& desc_json, const BuildMaps::Target::ConfiguredTarget& key, + const gsl::not_null<RepositoryConfig*>& repo_config, const BuildMaps::Target::TargetMap::SubCallerPtr& subcaller, const BuildMaps::Target::TargetMap::SetterPtr& setter, const BuildMaps::Target::TargetMap::LoggerPtr& logger, @@ -279,6 +291,7 @@ void BlobGenRule( auto dep_target = BuildMaps::Base::ParseEntityNameFromExpression( dep_name, key.target, + repo_config, [&logger, &dep_name](std::string const& parse_err) { (*logger)(fmt::format("Parsing dep entry {} failed with:\n{}", dep_name->ToString(), @@ -300,12 +313,14 @@ void BlobGenRule( setter, logger, key, + repo_config, result_map, blob_type](auto const& values) { BlobGenRuleWithDeps(transition_keys, values, desc, key, + repo_config, setter, logger, result_map, @@ -317,12 +332,14 @@ void BlobGenRule( void FileGenRule( const nlohmann::json& desc_json, const BuildMaps::Target::ConfiguredTarget& key, + const gsl::not_null<RepositoryConfig*>& repo_config, const BuildMaps::Target::TargetMap::SubCallerPtr& subcaller, const BuildMaps::Target::TargetMap::SetterPtr& setter, const BuildMaps::Target::TargetMap::LoggerPtr& logger, const gsl::not_null<BuildMaps::Target::ResultTargetMap*>& result_map) { BlobGenRule(desc_json, key, + repo_config, subcaller, setter, logger, @@ -333,12 +350,14 @@ void FileGenRule( void SymlinkRule( const nlohmann::json& desc_json, const BuildMaps::Target::ConfiguredTarget& key, + const gsl::not_null<RepositoryConfig*>& repo_config, const BuildMaps::Target::TargetMap::SubCallerPtr& subcaller, const BuildMaps::Target::TargetMap::SetterPtr& setter, const BuildMaps::Target::TargetMap::LoggerPtr& logger, const gsl::not_null<BuildMaps::Target::ResultTargetMap*>& result_map) { BlobGenRule(desc_json, key, + repo_config, subcaller, setter, logger, @@ -451,6 +470,7 @@ void TreeRuleWithDeps( void TreeRule( const nlohmann::json& desc_json, const BuildMaps::Target::ConfiguredTarget& key, + const gsl::not_null<RepositoryConfig*>& repo_config, const BuildMaps::Target::TargetMap::SubCallerPtr& subcaller, const BuildMaps::Target::TargetMap::SetterPtr& setter, const BuildMaps::Target::TargetMap::LoggerPtr& logger, @@ -489,6 +509,7 @@ void TreeRule( auto dep_target = BuildMaps::Base::ParseEntityNameFromExpression( dep_name, key.target, + repo_config, [&logger, &dep_name](std::string const& parse_err) { (*logger)(fmt::format("Parsing dep entry {} failed with:\n{}", dep_name->ToString(), @@ -689,6 +710,7 @@ void InstallRuleWithDeps( void InstallRule( const nlohmann::json& desc_json, const BuildMaps::Target::ConfiguredTarget& key, + const gsl::not_null<RepositoryConfig*>& repo_config, const BuildMaps::Target::TargetMap::SubCallerPtr& subcaller, const BuildMaps::Target::TargetMap::SetterPtr& setter, const BuildMaps::Target::TargetMap::LoggerPtr& logger, @@ -729,6 +751,7 @@ void InstallRule( auto dep_target = BuildMaps::Base::ParseEntityNameFromExpression( dep_name, key.target, + repo_config, [&logger, &dep_name](std::string const& parse_err) { (*logger)(fmt::format("Parsing dep entry {} failed with:\n{}", dep_name->ToString(), @@ -773,6 +796,7 @@ void InstallRule( auto dep_target = BuildMaps::Base::ParseEntityNameFromExpression( dep_name, key.target, + repo_config, [&logger, &dep_name, &path = path](std::string const& parse_err) { (*logger)(fmt::format("Parsing file entry {} for key {} failed " "with:\n{}", @@ -823,6 +847,7 @@ void InstallRule( auto dep_target = BuildMaps::Base::ParseEntityNameFromExpression( entry->List()[0], key.target, + repo_config, [&logger, &entry](std::string const& parse_err) { (*logger)(fmt::format("Parsing dir entry {} for path {} failed " "with:\n{}", @@ -870,6 +895,7 @@ void GenericRuleWithDeps( const std::vector<AnalysedTargetPtr const*>& dependency_values, const BuildMaps::Base::FieldReader::Ptr& desc, const BuildMaps::Target::ConfiguredTarget& key, + const gsl::not_null<RepositoryConfig*>& repo_config, const BuildMaps::Target::TargetMap::SetterPtr& setter, const BuildMaps::Target::TargetMap::LoggerPtr& logger, const gsl::not_null<BuildMaps::Target::ResultTargetMap*>& result_map) { @@ -930,19 +956,29 @@ void GenericRuleWithDeps( auto string_fields_fcts = FunctionMap::MakePtr(FunctionMap::underlying_map_t{ {"outs", - [&deps_by_transition, &key]( + [&deps_by_transition, &key, repo_config]( auto&& eval, auto const& expr, auto const& env) { return BuildMaps::Target::Utils::keys_expr( BuildMaps::Target::Utils::obtainTargetByName( - eval, expr, env, key.target, deps_by_transition) + eval, + expr, + env, + key.target, + repo_config, + deps_by_transition) ->Artifacts()); }}, {"runfiles", - [&deps_by_transition, &key]( + [&deps_by_transition, &key, repo_config]( auto&& eval, auto const& expr, auto const& env) { return BuildMaps::Target::Utils::keys_expr( BuildMaps::Target::Utils::obtainTargetByName( - eval, expr, env, key.target, deps_by_transition) + eval, + expr, + env, + key.target, + repo_config, + deps_by_transition) ->RunFiles()); }}}); auto const& empty_list = Expression::kEmptyList; @@ -1251,6 +1287,7 @@ void GenericRuleWithDeps( void GenericRule( const nlohmann::json& desc_json, const BuildMaps::Target::ConfiguredTarget& key, + const gsl::not_null<RepositoryConfig*>& repo_config, const BuildMaps::Target::TargetMap::SubCallerPtr& subcaller, const BuildMaps::Target::TargetMap::SetterPtr& setter, const BuildMaps::Target::TargetMap::LoggerPtr& logger, @@ -1288,6 +1325,7 @@ void GenericRule( auto dep_target = BuildMaps::Base::ParseEntityNameFromExpression( dep_name, key.target, + repo_config, [&logger, &dep_name](std::string const& parse_err) { (*logger)(fmt::format("Parsing dep entry {} failed with:\n{}", dep_name->ToString(), @@ -1309,9 +1347,16 @@ void GenericRule( setter, logger, key, + repo_config, result_map](auto const& values) { - GenericRuleWithDeps( - transition_keys, values, desc, key, setter, logger, result_map); + GenericRuleWithDeps(transition_keys, + values, + desc, + key, + repo_config, + setter, + logger, + result_map); }, logger); } @@ -1319,6 +1364,7 @@ void GenericRule( void ConfigureRule( const nlohmann::json& desc_json, const BuildMaps::Target::ConfiguredTarget& key, + const gsl::not_null<RepositoryConfig*>& repo_config, const BuildMaps::Target::TargetMap::SubCallerPtr& subcaller, const BuildMaps::Target::TargetMap::SetterPtr& setter, const BuildMaps::Target::TargetMap::LoggerPtr& logger, @@ -1348,6 +1394,7 @@ void ConfigureRule( auto configured_target = BuildMaps::Base::ParseEntityNameFromExpression( configured_target_name, key.target, + repo_config, [&logger, &configured_target_name](std::string const& parse_err) { (*logger)(fmt::format("Parsing target name {} failed with:\n{}", configured_target_name->ToString(), @@ -1456,6 +1503,7 @@ auto const kBuiltIns = std::unordered_map< std::function<void( const nlohmann::json&, const BuildMaps::Target::ConfiguredTarget&, + [[maybe_unused]] const gsl::not_null<RepositoryConfig*>&, const BuildMaps::Target::TargetMap::SubCallerPtr&, const BuildMaps::Target::TargetMap::SetterPtr&, const BuildMaps::Target::TargetMap::LoggerPtr&, @@ -1485,6 +1533,7 @@ auto HandleBuiltin( const nlohmann::json& rule_type, const nlohmann::json& desc, const BuildMaps::Target::ConfiguredTarget& key, + const gsl::not_null<RepositoryConfig*>& repo_config, const BuildMaps::Target::TargetMap::SubCallerPtr& subcaller, const BuildMaps::Target::TargetMap::SetterPtr& setter, const BuildMaps::Target::TargetMap::LoggerPtr& logger, @@ -1507,7 +1556,8 @@ auto HandleBuiltin( msg), fatal); }); - (it->second)(desc, key, subcaller, setter, target_logger, result_map); + (it->second)( + desc, key, repo_config, subcaller, setter, target_logger, result_map); return true; } } // namespace BuildMaps::Target diff --git a/src/buildtool/build_engine/target_map/built_in_rules.hpp b/src/buildtool/build_engine/target_map/built_in_rules.hpp index 9eadfcb1..5f815130 100644 --- a/src/buildtool/build_engine/target_map/built_in_rules.hpp +++ b/src/buildtool/build_engine/target_map/built_in_rules.hpp @@ -20,12 +20,14 @@ #include "src/buildtool/build_engine/target_map/configured_target.hpp" #include "src/buildtool/build_engine/target_map/result_map.hpp" #include "src/buildtool/build_engine/target_map/target_map.hpp" +#include "src/buildtool/common/repository_config.hpp" namespace BuildMaps::Target { auto HandleBuiltin( const nlohmann::json& rule_type, const nlohmann::json& desc, const BuildMaps::Target::ConfiguredTarget& key, + const gsl::not_null<RepositoryConfig*>& repo_config, const BuildMaps::Target::TargetMap::SubCallerPtr& subcaller, const BuildMaps::Target::TargetMap::SetterPtr& setter, const BuildMaps::Target::TargetMap::LoggerPtr& logger, diff --git a/src/buildtool/build_engine/target_map/export.cpp b/src/buildtool/build_engine/target_map/export.cpp index d832b2ee..06b80c26 100644 --- a/src/buildtool/build_engine/target_map/export.cpp +++ b/src/buildtool/build_engine/target_map/export.cpp @@ -81,10 +81,10 @@ void FinalizeExport( [[nodiscard]] auto ComputeTargetCacheKey( BuildMaps::Base::EntityName const& export_target, + gsl::not_null<RepositoryConfig*> const& repo_config, Configuration const& target_config) -> std::optional<TargetCacheKey> { - static auto const& repos = RepositoryConfig::Instance(); auto const& target_name = export_target.GetNamedTarget(); - if (auto repo_key = repos.RepositoryKey(target_name.repository)) { + if (auto repo_key = repo_config->RepositoryKey(target_name.repository)) { return TargetCacheKey::Create(*repo_key, target_name, target_config); } return std::nullopt; @@ -95,6 +95,7 @@ void FinalizeExport( void ExportRule( const nlohmann::json& desc_json, const BuildMaps::Target::ConfiguredTarget& key, + const gsl::not_null<RepositoryConfig*>& repo_config, const BuildMaps::Target::TargetMap::SubCallerPtr& subcaller, const BuildMaps::Target::TargetMap::SetterPtr& setter, const BuildMaps::Target::TargetMap::LoggerPtr& logger, @@ -106,7 +107,8 @@ void ExportRule( return; } auto effective_config = key.config.Prune(*flexible_vars); - auto target_cache_key = ComputeTargetCacheKey(key.target, effective_config); + auto target_cache_key = + ComputeTargetCacheKey(key.target, repo_config, effective_config); if (target_cache_key) { if (auto target_cache_value = @@ -174,6 +176,7 @@ void ExportRule( auto exported_target = BuildMaps::Base::ParseEntityNameFromExpression( exported_target_name, key.target, + repo_config, [&logger, &exported_target_name](std::string const& parse_err) { (*logger)(fmt::format("Parsing target name {} failed with:\n{}", exported_target_name->ToString(), diff --git a/src/buildtool/build_engine/target_map/export.hpp b/src/buildtool/build_engine/target_map/export.hpp index 495b5ace..aa84f0b4 100644 --- a/src/buildtool/build_engine/target_map/export.hpp +++ b/src/buildtool/build_engine/target_map/export.hpp @@ -20,9 +20,11 @@ #include "src/buildtool/build_engine/target_map/configured_target.hpp" #include "src/buildtool/build_engine/target_map/result_map.hpp" #include "src/buildtool/build_engine/target_map/target_map.hpp" +#include "src/buildtool/common/repository_config.hpp" void ExportRule(const nlohmann::json& desc_json, const BuildMaps::Target::ConfiguredTarget& key, + const gsl::not_null<RepositoryConfig*>& repo_config, const BuildMaps::Target::TargetMap::SubCallerPtr& subcaller, const BuildMaps::Target::TargetMap::SetterPtr& setter, const BuildMaps::Target::TargetMap::LoggerPtr& logger, diff --git a/src/buildtool/build_engine/target_map/target_map.cpp b/src/buildtool/build_engine/target_map/target_map.cpp index ca8fdddd..805a0d50 100644 --- a/src/buildtool/build_engine/target_map/target_map.cpp +++ b/src/buildtool/build_engine/target_map/target_map.cpp @@ -221,6 +221,7 @@ void withDependencies( const BuildMaps::Base::UserRulePtr& rule, const TargetData::Ptr& data, const BuildMaps::Target::ConfiguredTarget& key, + const gsl::not_null<RepositoryConfig*>& repo_config, std::unordered_map<std::string, ExpressionPtr> params, const BuildMaps::Target::TargetMap::SetterPtr& setter, const BuildMaps::Target::TargetMap::LoggerPtr& logger, @@ -300,19 +301,29 @@ void withDependencies( auto string_fields_fcts = FunctionMap::MakePtr(FunctionMap::underlying_map_t{ {"outs", - [&deps_by_transition, &key]( + [&deps_by_transition, &key, repo_config]( auto&& eval, auto const& expr, auto const& env) { return BuildMaps::Target::Utils::keys_expr( BuildMaps::Target::Utils::obtainTargetByName( - eval, expr, env, key.target, deps_by_transition) + eval, + expr, + env, + key.target, + repo_config, + deps_by_transition) ->Artifacts()); }}, {"runfiles", - [&deps_by_transition, &key]( + [&deps_by_transition, &key, repo_config]( auto&& eval, auto const& expr, auto const& env) { return BuildMaps::Target::Utils::keys_expr( BuildMaps::Target::Utils::obtainTargetByName( - eval, expr, env, key.target, deps_by_transition) + eval, + expr, + env, + key.target, + repo_config, + deps_by_transition) ->RunFiles()); }}}); auto param_config = key.config.Prune(param_vars); @@ -866,6 +877,7 @@ void withRuleDefinition( const BuildMaps::Base::UserRulePtr& rule, const TargetData::Ptr& data, const BuildMaps::Target::ConfiguredTarget& key, + const gsl::not_null<RepositoryConfig*>& repo_config, const BuildMaps::Target::TargetMap::SubCallerPtr& subcaller, const BuildMaps::Target::TargetMap::SetterPtr& setter, const BuildMaps::Target::TargetMap::LoggerPtr& logger, @@ -1033,6 +1045,7 @@ void withRuleDefinition( auto target = BuildMaps::Base::ParseEntityNameFromExpression( dep_name, key.target, + repo_config, [&logger, &target_field_name, &dep_name]( std::string const& parse_err) { (*logger)(fmt::format("Parsing entry {} in target " @@ -1105,6 +1118,7 @@ void withRuleDefinition( rule, data, key, + repo_config, params = std::move(params), setter, logger, @@ -1188,6 +1202,7 @@ void withRuleDefinition( rule, data, key, + repo_config, params = std::move(params), setter, logger, @@ -1202,6 +1217,7 @@ void withRuleDefinition( rule, data, key, + repo_config, params, setter, logger, @@ -1214,6 +1230,7 @@ void withRuleDefinition( void withTargetsFile( const BuildMaps::Target::ConfiguredTarget& key, + const gsl::not_null<RepositoryConfig*>& repo_config, const nlohmann::json& targets_file, const gsl::not_null<BuildMaps::Base::SourceTargetMap*>& source_target, const gsl::not_null<BuildMaps::Base::UserRuleMap*>& rule_map, @@ -1248,8 +1265,14 @@ void withTargetsFile( return; } // Handle built-in rule, if it is - auto handled_as_builtin = BuildMaps::Target::HandleBuiltin( - *rule_it, desc, key, subcaller, setter, logger, result_map); + auto handled_as_builtin = BuildMaps::Target::HandleBuiltin(*rule_it, + desc, + key, + repo_config, + subcaller, + setter, + logger, + result_map); if (handled_as_builtin) { return; } @@ -1258,6 +1281,7 @@ void withTargetsFile( auto rule_name = BuildMaps::Base::ParseEntityNameFromJson( *rule_it, key.target, + repo_config, [&logger, &rule_it, &key](std::string const& parse_err) { (*logger)(fmt::format("Parsing rule name {} for target {} " "failed with:\n{}", @@ -1285,6 +1309,7 @@ void withTargetsFile( setter, logger, key, + repo_config, result_map, rn = *rule_name](auto values) { auto data = TargetData::FromFieldReader(*values[0], desc); @@ -1300,6 +1325,7 @@ void withTargetsFile( *values[0], data, key, + repo_config, subcaller, setter, std::make_shared<AsyncMapConsumerLogger>( @@ -1325,6 +1351,7 @@ void withTargetsFile( void withTargetNode( const BuildMaps::Target::ConfiguredTarget& key, + const gsl::not_null<RepositoryConfig*>& repo_config, const gsl::not_null<BuildMaps::Base::UserRuleMap*>& rule_map, const gsl::not_null<TaskSystem*>& ts, const BuildMaps::Target::TargetMap::SubCallerPtr& subcaller, @@ -1362,8 +1389,14 @@ void withTargetNode( rule_map->ConsumeAfterKeysReady( ts, {(**rule_name)->Name()}, - [abs, subcaller, setter, logger, key, result_map, rn = **rule_name]( - auto values) { + [abs, + subcaller, + setter, + logger, + key, + repo_config, + result_map, + rn = **rule_name](auto values) { auto data = TargetData::FromTargetNode( *values[0], abs, @@ -1380,6 +1413,7 @@ void withTargetNode( withRuleDefinition(*values[0], data, key, + repo_config, subcaller, setter, std::make_shared<AsyncMapConsumerLogger>( @@ -1625,20 +1659,28 @@ auto CreateTargetMap( directory_entries_map, const gsl::not_null<AbsentTargetMap*>& absent_target_map, const gsl::not_null<ResultTargetMap*>& result_map, + const gsl::not_null<RepositoryConfig*>& repo_config, std::size_t jobs) -> TargetMap { auto target_reader = [source_target_map, targets_file_map, rule_map, - result_map, + directory_entries_map, absent_target_map, - directory_entries_map](auto ts, - auto setter, - auto logger, - auto subcaller, - auto key) { + result_map, + repo_config](auto ts, + auto setter, + auto logger, + auto subcaller, + auto key) { if (key.target.IsAnonymousTarget()) { - withTargetNode( - key, rule_map, ts, subcaller, setter, logger, result_map); + withTargetNode(key, + repo_config, + rule_map, + ts, + subcaller, + setter, + logger, + result_map); } else if (key.target.GetNamedTarget().reference_t == BuildMaps::Base::ReferenceType::kTree) { @@ -1725,8 +1767,7 @@ auto CreateTargetMap( ); } #ifndef BOOTSTRAP_BUILD_TOOL - else if (RepositoryConfig::Instance() - .TargetRoot(key.target.ToModule().repository) + else if (repo_config->TargetRoot(key.target.ToModule().repository) ->IsAbsent()) { static auto consistent_serve_and_remote_execution = CheckServeAndExecutionEndpoints(); @@ -1757,6 +1798,7 @@ auto CreateTargetMap( ts, {key.target.ToModule()}, [key, + repo_config, source_target_map, rule_map, ts, @@ -1765,6 +1807,7 @@ auto CreateTargetMap( logger, result_map](auto values) { withTargetsFile(key, + repo_config, *values[0], source_target_map, rule_map, diff --git a/src/buildtool/build_engine/target_map/target_map.hpp b/src/buildtool/build_engine/target_map/target_map.hpp index d86c8ab1..e1cb0a94 100644 --- a/src/buildtool/build_engine/target_map/target_map.hpp +++ b/src/buildtool/build_engine/target_map/target_map.hpp @@ -23,6 +23,7 @@ #include "src/buildtool/build_engine/target_map/absent_target_map.hpp" #include "src/buildtool/build_engine/target_map/configured_target.hpp" #include "src/buildtool/build_engine/target_map/result_map.hpp" +#include "src/buildtool/common/repository_config.hpp" #include "src/buildtool/multithreading/async_map_consumer.hpp" namespace BuildMaps::Target { @@ -36,6 +37,7 @@ auto CreateTargetMap( const gsl::not_null<BuildMaps::Base::DirectoryEntriesMap*>&, [[maybe_unused]] const gsl::not_null<AbsentTargetMap*>&, const gsl::not_null<ResultTargetMap*>&, + [[maybe_unused]] const gsl::not_null<RepositoryConfig*>&, std::size_t jobs = 0) -> TargetMap; auto IsBuiltInRule(nlohmann::json const& rule_type) -> bool; diff --git a/src/buildtool/build_engine/target_map/utils.cpp b/src/buildtool/build_engine/target_map/utils.cpp index 55543e30..aa733521 100644 --- a/src/buildtool/build_engine/target_map/utils.cpp +++ b/src/buildtool/build_engine/target_map/utils.cpp @@ -27,6 +27,7 @@ auto BuildMaps::Target::Utils::obtainTargetByName( const ExpressionPtr& expr, const Configuration& env, const Base::EntityName& current, + const gsl::not_null<RepositoryConfig*>& repo_config, std::unordered_map<BuildMaps::Target::ConfiguredTarget, AnalysedTargetPtr> const& deps_by_transition) -> AnalysedTargetPtr { @@ -34,9 +35,10 @@ auto BuildMaps::Target::Utils::obtainTargetByName( auto reference = eval(expr["dep"], env); std::string error{}; auto target = BuildMaps::Base::ParseEntityNameFromExpression( - reference, current, [&error](std::string const& parse_err) { - error = parse_err; - }); + reference, + current, + repo_config, + [&error](std::string const& parse_err) { error = parse_err; }); if (not target) { throw Evaluator::EvaluationError{ fmt::format("Parsing target name {} failed with:\n{}", diff --git a/src/buildtool/build_engine/target_map/utils.hpp b/src/buildtool/build_engine/target_map/utils.hpp index 2b48fb04..b3fb5a7c 100644 --- a/src/buildtool/build_engine/target_map/utils.hpp +++ b/src/buildtool/build_engine/target_map/utils.hpp @@ -28,6 +28,7 @@ #include "src/buildtool/build_engine/expression/function_map.hpp" #include "src/buildtool/build_engine/target_map/configured_target.hpp" #include "src/buildtool/build_engine/target_map/target_map.hpp" +#include "src/buildtool/common/repository_config.hpp" namespace BuildMaps::Target::Utils { @@ -35,6 +36,7 @@ auto obtainTargetByName(const SubExprEvaluator&, const ExpressionPtr&, const Configuration&, const Base::EntityName&, + const gsl::not_null<RepositoryConfig*>&, std::unordered_map<BuildMaps::Target::ConfiguredTarget, AnalysedTargetPtr> const&) -> AnalysedTargetPtr; diff --git a/src/buildtool/common/repository_config.hpp b/src/buildtool/common/repository_config.hpp index d4152467..de5d4225 100644 --- a/src/buildtool/common/repository_config.hpp +++ b/src/buildtool/common/repository_config.hpp @@ -17,6 +17,7 @@ #include <filesystem> #include <map> +#include <memory> #include <string> #include <unordered_map> @@ -43,11 +44,6 @@ class RepositoryConfig { -> std::optional<nlohmann::json>; }; - [[nodiscard]] static auto Instance() noexcept -> RepositoryConfig& { - static RepositoryConfig instance{}; - return instance; - } - void SetInfo(std::string const& repo, RepositoryInfo&& info) { repos_[repo].base_desc = info.BaseContentDescription(); repos_[repo].info = std::move(info); diff --git a/src/buildtool/execution_api/common/TARGETS b/src/buildtool/execution_api/common/TARGETS index 3c580d4d..4a9c60e1 100644 --- a/src/buildtool/execution_api/common/TARGETS +++ b/src/buildtool/execution_api/common/TARGETS @@ -32,7 +32,8 @@ , "hdrs": ["create_execution_api.hpp"] , "stage": ["src", "buildtool", "execution_api", "common"] , "deps": - [ ["src/buildtool/common/remote", "remote_common"] + [ ["src/buildtool/common", "config"] + , ["src/buildtool/common/remote", "remote_common"] , ["src/buildtool/execution_api/local", "local"] , ["src/buildtool/execution_api/remote", "bazel"] ] diff --git a/src/buildtool/execution_api/common/create_execution_api.hpp b/src/buildtool/execution_api/common/create_execution_api.hpp index 02fcee4b..c62d0f17 100644 --- a/src/buildtool/execution_api/common/create_execution_api.hpp +++ b/src/buildtool/execution_api/common/create_execution_api.hpp @@ -20,15 +20,19 @@ #include "gsl/gsl" #include "src/buildtool/common/remote/remote_common.hpp" +#include "src/buildtool/common/repository_config.hpp" #include "src/buildtool/execution_api/local/local_api.hpp" #include "src/buildtool/execution_api/remote/bazel/bazel_api.hpp" /// \brief Utility function to instantiate either a Local or Bazel Execution /// API. /// \param address if provided, a BazelApi is instantiated +/// \param repo_config repository configuration to be used by GitApi calls /// \param instance_name only used in the construction of the BazelApi object [[nodiscard]] static inline auto CreateExecutionApi( std::optional<ServerAddress> const& address, + std::optional<gsl::not_null<RepositoryConfig*>> const& repo_config = + std::nullopt, std::string const& instance_name = "remote-execution") -> gsl::not_null<IExecutionApi::Ptr> { if (address) { @@ -38,7 +42,7 @@ return std::make_unique<BazelApi>( instance_name, address->host, address->port, config); } - return std::make_unique<LocalApi>(); + return std::make_unique<LocalApi>(repo_config); } #endif diff --git a/src/buildtool/execution_api/git/git_api.hpp b/src/buildtool/execution_api/git/git_api.hpp index 7542c296..52c21627 100644 --- a/src/buildtool/execution_api/git/git_api.hpp +++ b/src/buildtool/execution_api/git/git_api.hpp @@ -26,7 +26,7 @@ /// \brief API for local execution. class GitApi final : public IExecutionApi { public: - GitApi() : repo_config_{&RepositoryConfig::Instance()} {} + GitApi() = delete; explicit GitApi(gsl::not_null<RepositoryConfig*> const& repo_config) : repo_config_{repo_config} {} auto CreateAction( diff --git a/src/buildtool/execution_api/local/TARGETS b/src/buildtool/execution_api/local/TARGETS index f2c0e1b4..c8895c20 100644 --- a/src/buildtool/execution_api/local/TARGETS +++ b/src/buildtool/execution_api/local/TARGETS @@ -26,6 +26,7 @@ , "deps": [ ["@", "fmt", "", "fmt"] , ["@", "gsl", "", "gsl"] + , ["src/buildtool/common", "config"] , ["src/buildtool/storage", "storage"] , ["src/buildtool/execution_api/common", "common"] , ["src/buildtool/execution_api/bazel_msg", "bazel_msg_factory"] diff --git a/src/buildtool/execution_api/local/local_api.hpp b/src/buildtool/execution_api/local/local_api.hpp index c04e82f4..f919e9c9 100644 --- a/src/buildtool/execution_api/local/local_api.hpp +++ b/src/buildtool/execution_api/local/local_api.hpp @@ -24,6 +24,7 @@ #include "fmt/core.h" #include "gsl/gsl" +#include "src/buildtool/common/repository_config.hpp" #include "src/buildtool/compatibility/compatibility.hpp" #include "src/buildtool/compatibility/native_support.hpp" #include "src/buildtool/execution_api/bazel_msg/bazel_blob.hpp" @@ -38,6 +39,10 @@ /// \brief API for local execution. class LocalApi final : public IExecutionApi { public: + explicit LocalApi(std::optional<gsl::not_null<RepositoryConfig*>> + repo_config = std::nullopt) + : repo_config_{std::move(repo_config)} {} + auto CreateAction( ArtifactDigest const& root_digest, std::vector<std::string> const& command, @@ -74,12 +79,13 @@ class LocalApi final : public IExecutionApi { info.digest, output_paths[i]); if (not infos) { if (Compatibility::IsCompatible()) { - // infos not availablble, and in compatible mode cannot + // infos not available, and in compatible mode cannot // fall back to git return false; } - if (not GitApi().RetrieveToPaths({info}, - {output_paths[i]})) { + if (repo_config_ and + not GitApi(repo_config_.value()) + .RetrieveToPaths({info}, {output_paths[i]})) { return false; } } @@ -92,12 +98,13 @@ class LocalApi final : public IExecutionApi { info.digest, IsExecutableObject(info.type)); if (not blob_path) { if (Compatibility::IsCompatible()) { - // infos not availablble, and in compatible mode cannot + // infos not available, and in compatible mode cannot // fall back to git return false; } - if (not GitApi().RetrieveToPaths({info}, - {output_paths[i]})) { + if (repo_config_ and + not GitApi(repo_config_.value()) + .RetrieveToPaths({info}, {output_paths[i]})) { return false; } } @@ -140,11 +147,13 @@ class LocalApi final : public IExecutionApi { info.ToString(), fd); if (Compatibility::IsCompatible()) { - // infos not availablble, and in compatible mode cannot + // infos not available, and in compatible mode cannot // fall back to git return false; } - if (not GitApi().RetrieveToFds({info}, {fd}, raw_tree)) { + if (repo_config_ and + not GitApi(repo_config_.value()) + .RetrieveToFds({info}, {fd}, raw_tree)) { return false; } } @@ -413,6 +422,7 @@ class LocalApi final : public IExecutionApi { } private: + std::optional<gsl::not_null<RepositoryConfig*>> repo_config_{}; gsl::not_null<Storage const*> storage_ = &Storage::Instance(); }; diff --git a/src/buildtool/execution_engine/executor/executor.hpp b/src/buildtool/execution_engine/executor/executor.hpp index 7d38d91c..986d17f8 100644 --- a/src/buildtool/execution_engine/executor/executor.hpp +++ b/src/buildtool/execution_engine/executor/executor.hpp @@ -196,6 +196,7 @@ class ExecutorImpl { [[nodiscard]] static auto VerifyOrUploadArtifact( Logger const& logger, gsl::not_null<DependencyGraph::ArtifactNode const*> const& artifact, + gsl::not_null<RepositoryConfig*> const& repo_config, gsl::not_null<IExecutionApi*> const& remote_api, gsl::not_null<IExecutionApi*> const& local_api) noexcept -> bool { auto const object_info_opt = artifact->Content().Info(); @@ -230,6 +231,7 @@ class ExecutorImpl { if (not VerifyOrUploadKnownArtifact( remote_api, artifact->Content().Repository(), + repo_config, *object_info_opt)) { Logger::Log( LogLevel::Error, @@ -254,7 +256,8 @@ class ExecutorImpl { return oss.str(); }); auto repo = artifact->Content().Repository(); - auto new_info = UploadFile(remote_api, repo, *file_path_opt); + auto new_info = + UploadFile(remote_api, repo, repo_config, *file_path_opt); if (not new_info) { Logger::Log(LogLevel::Error, "artifact in {} could not be uploaded to CAS.", @@ -356,13 +359,14 @@ class ExecutorImpl { [[nodiscard]] static auto VerifyOrUploadGitArtifact( gsl::not_null<IExecutionApi*> const& api, std::string const& repo, + gsl::not_null<RepositoryConfig*> const& repo_config, Artifact::ObjectInfo const& info, std::string const& hash) noexcept -> bool { std::optional<std::string> content; if (NativeSupport::IsTree( static_cast<bazel_re::Digest>(info.digest).hash())) { // if known tree is not available, recursively upload its content - auto tree = ReadGitTree(repo, hash); + auto tree = ReadGitTree(repo, repo_config, hash); if (not tree) { return false; } @@ -373,7 +377,7 @@ class ExecutorImpl { } else { // if known blob is not available, read and upload it - content = ReadGitBlob(repo, hash); + content = ReadGitBlob(repo, repo_config, hash); } if (not content) { return false; @@ -385,34 +389,34 @@ class ExecutorImpl { return api->Upload(container, /*skip_find_missing=*/true); } - [[nodiscard]] static auto ReadGitBlob(std::string const& repo, - std::string const& hash) noexcept - -> std::optional<std::string> { - auto const& repo_config = RepositoryConfig::Instance(); + [[nodiscard]] static auto ReadGitBlob( + std::string const& repo, + gsl::not_null<RepositoryConfig*> const& repo_config, + std::string const& hash) noexcept -> std::optional<std::string> { std::optional<std::string> blob{}; - if (auto const* ws_root = repo_config.WorkspaceRoot(repo)) { + if (auto const* ws_root = repo_config->WorkspaceRoot(repo)) { // try to obtain blob from local workspace's Git CAS, if any blob = ws_root->ReadBlob(hash); } if (not blob) { // try to obtain blob from global Git CAS, if any - blob = repo_config.ReadBlobFromGitCAS(hash); + blob = repo_config->ReadBlobFromGitCAS(hash); } return blob; } - [[nodiscard]] static auto ReadGitTree(std::string const& repo, - std::string const& hash) noexcept - -> std::optional<GitTree> { - auto const& repo_config = RepositoryConfig::Instance(); + [[nodiscard]] static auto ReadGitTree( + std::string const& repo, + gsl::not_null<RepositoryConfig*> const& repo_config, + std::string const& hash) noexcept -> std::optional<GitTree> { std::optional<GitTree> tree{}; - if (auto const* ws_root = repo_config.WorkspaceRoot(repo)) { + if (auto const* ws_root = repo_config->WorkspaceRoot(repo)) { // try to obtain tree from local workspace's Git CAS, if any tree = ws_root->ReadTree(hash); } if (not tree) { // try to obtain tree from global Git CAS, if any - tree = repo_config.ReadTreeFromGitCAS(hash); + tree = repo_config->ReadTreeFromGitCAS(hash); } return tree; } @@ -420,35 +424,40 @@ class ExecutorImpl { /// \brief Lookup blob via digest in local git repositories and upload. /// \param api The endpoint used for uploading /// \param repo The global repository name, the artifact belongs to + /// \param repo_config Configuration specifying the workspace root /// \param info The info of the object /// \returns true on success [[nodiscard]] static auto VerifyOrUploadKnownArtifact( gsl::not_null<IExecutionApi*> const& api, std::string const& repo, + gsl::not_null<RepositoryConfig*> const& repo_config, Artifact::ObjectInfo const& info) noexcept -> bool { if (Compatibility::IsCompatible()) { auto opt = Compatibility::GetGitEntry(info.digest.hash()); if (opt) { auto const& [git_sha1_hash, comp_repo] = *opt; return VerifyOrUploadGitArtifact( - api, comp_repo, info, git_sha1_hash); + api, comp_repo, repo_config, info, git_sha1_hash); } return false; } - return VerifyOrUploadGitArtifact(api, repo, info, info.digest.hash()); + return VerifyOrUploadGitArtifact( + api, repo, repo_config, info, info.digest.hash()); } /// \brief Lookup file via path in local workspace root and upload. /// \param api The endpoint used for uploading /// \param repo The global repository name, the artifact belongs to + /// \param repo_config Configuration specifying the workspace root /// \param file_path The path of the file to be read /// \returns The computed object info on success [[nodiscard]] static auto UploadFile( gsl::not_null<IExecutionApi*> const& api, std::string const& repo, + gsl::not_null<RepositoryConfig*> const& repo_config, std::filesystem::path const& file_path) noexcept -> std::optional<Artifact::ObjectInfo> { - auto const* ws_root = RepositoryConfig::Instance().WorkspaceRoot(repo); + auto const* ws_root = repo_config->WorkspaceRoot(repo); if (ws_root == nullptr) { return std::nullopt; } @@ -633,11 +642,13 @@ class Executor { public: explicit Executor( + gsl::not_null<RepositoryConfig*> repo_config, IExecutionApi* local_api, IExecutionApi* remote_api, std::map<std::string, std::string> properties, std::chrono::milliseconds timeout = IExecutionAction::kDefaultTimeout) - : local_api_{local_api}, + : repo_config_{repo_config}, + local_api_{local_api}, remote_api_{remote_api}, properties_{std::move(properties)}, timeout_{timeout} {} @@ -666,16 +677,18 @@ class Executor { /// \brief Check artifact is available to the CAS or upload it. /// \param[in] artifact The artifact to process. + /// \param[in] repo_config The repository configuration to use /// \returns True if artifact is available or uploaded, false otherwise [[nodiscard]] auto Process( gsl::not_null<DependencyGraph::ArtifactNode const*> const& artifact) const noexcept -> bool { Logger logger("artifact:" + ToHexString(artifact->Content().Id())); return Impl::VerifyOrUploadArtifact( - logger, artifact, remote_api_, local_api_); + logger, artifact, repo_config_, remote_api_, local_api_); } private: + gsl::not_null<RepositoryConfig*> repo_config_; gsl::not_null<IExecutionApi*> local_api_; gsl::not_null<IExecutionApi*> remote_api_; std::map<std::string, std::string> properties_; @@ -694,12 +707,14 @@ class Rebuilder { /// \param properties Platform properties for execution. /// \param timeout Timeout for action execution. Rebuilder( + gsl::not_null<RepositoryConfig*> repo_config, IExecutionApi* local_api, IExecutionApi* remote_api, IExecutionApi* api_cached, std::map<std::string, std::string> properties, std::chrono::milliseconds timeout = IExecutionAction::kDefaultTimeout) - : local_api_{local_api}, + : repo_config_{repo_config}, + local_api_{local_api}, remote_api_{remote_api}, api_cached_{api_cached}, properties_{std::move(properties)}, @@ -749,7 +764,7 @@ class Rebuilder { const noexcept -> bool { Logger logger("artifact:" + ToHexString(artifact->Content().Id())); return Impl::VerifyOrUploadArtifact( - logger, artifact, remote_api_, local_api_); + logger, artifact, repo_config_, remote_api_, local_api_); } [[nodiscard]] auto DumpFlakyActions() const noexcept -> nlohmann::json { @@ -765,6 +780,7 @@ class Rebuilder { } private: + gsl::not_null<RepositoryConfig*> repo_config_; gsl::not_null<IExecutionApi*> local_api_; gsl::not_null<IExecutionApi*> remote_api_; gsl::not_null<IExecutionApi*> api_cached_; diff --git a/src/buildtool/graph_traverser/TARGETS b/src/buildtool/graph_traverser/TARGETS index 43238956..76fab72b 100644 --- a/src/buildtool/graph_traverser/TARGETS +++ b/src/buildtool/graph_traverser/TARGETS @@ -4,6 +4,7 @@ , "hdrs": ["graph_traverser.hpp"] , "deps": [ ["src/buildtool/common", "cli"] + , ["src/buildtool/common", "config"] , ["src/buildtool/common", "tree"] , ["src/buildtool/common/remote", "remote_common"] , ["src/buildtool/execution_engine/dag", "dag"] diff --git a/src/buildtool/graph_traverser/graph_traverser.hpp b/src/buildtool/graph_traverser/graph_traverser.hpp index 5eec6bd8..82e9f17a 100644 --- a/src/buildtool/graph_traverser/graph_traverser.hpp +++ b/src/buildtool/graph_traverser/graph_traverser.hpp @@ -31,6 +31,7 @@ #include "gsl/gsl" #include "src/buildtool/common/cli.hpp" #include "src/buildtool/common/remote/remote_common.hpp" +#include "src/buildtool/common/repository_config.hpp" #include "src/buildtool/common/statistics.hpp" #include "src/buildtool/common/tree.hpp" #include "src/buildtool/execution_api/bazel_msg/bazel_blob_container.hpp" @@ -68,19 +69,23 @@ class GraphTraverser { bool failed_artifacts; }; - explicit GraphTraverser(CommandLineArguments clargs) + explicit GraphTraverser(CommandLineArguments clargs, + gsl::not_null<RepositoryConfig*> const& repo_config) : clargs_{std::move(clargs)}, - local_api_{CreateExecutionApi(std::nullopt)}, - remote_api_{ - CreateExecutionApi(RemoteExecutionConfig::RemoteAddress())}, + repo_config_{repo_config}, + local_api_{CreateExecutionApi(std::nullopt, repo_config)}, + remote_api_{CreateExecutionApi(RemoteExecutionConfig::RemoteAddress(), + repo_config)}, reporter_{[](auto done, auto cv) {}} {} explicit GraphTraverser(CommandLineArguments clargs, + gsl::not_null<RepositoryConfig*> const& repo_config, progress_reporter_t reporter) : clargs_{std::move(clargs)}, - local_api_{CreateExecutionApi(std::nullopt)}, - remote_api_{ - CreateExecutionApi(RemoteExecutionConfig::RemoteAddress())}, + repo_config_{repo_config}, + local_api_{CreateExecutionApi(std::nullopt, repo_config)}, + remote_api_{CreateExecutionApi(RemoteExecutionConfig::RemoteAddress(), + repo_config)}, reporter_{std::move(reporter)} {} /// \brief Parses actions and blobs into graph, traverses it and retrieves @@ -222,6 +227,7 @@ class GraphTraverser { private: CommandLineArguments const clargs_; + gsl::not_null<RepositoryConfig*> repo_config_; gsl::not_null<IExecutionApi::Ptr> const local_api_; gsl::not_null<IExecutionApi::Ptr> const remote_api_; progress_reporter_t reporter_; @@ -339,7 +345,8 @@ class GraphTraverser { [[nodiscard]] auto Traverse( DependencyGraph const& g, std::vector<ArtifactIdentifier> const& artifact_ids) const -> bool { - Executor executor{&(*local_api_), + Executor executor{repo_config_, + &(*local_api_), &(*remote_api_), RemoteExecutionConfig::PlatformProperties(), clargs_.build.timeout}; @@ -364,9 +371,10 @@ class GraphTraverser { DependencyGraph const& g, std::vector<ArtifactIdentifier> const& artifact_ids) const -> bool { // setup rebuilder with api for cache endpoint - auto api_cached = - CreateExecutionApi(RemoteExecutionConfig::CacheAddress()); - Rebuilder executor{&(*local_api_), + auto api_cached = CreateExecutionApi( + RemoteExecutionConfig::CacheAddress(), repo_config_); + Rebuilder executor{repo_config_, + &(*local_api_), &(*remote_api_), &(*api_cached), RemoteExecutionConfig::PlatformProperties(), diff --git a/src/buildtool/main/TARGETS b/src/buildtool/main/TARGETS index 40d19095..d8eedaf2 100644 --- a/src/buildtool/main/TARGETS +++ b/src/buildtool/main/TARGETS @@ -55,11 +55,12 @@ , "deps": [ ["src/buildtool/build_engine/base_maps", "entity_name"] , ["src/buildtool/build_engine/target_map", "configured_target"] - , ["@", "json", "", "json"] + , ["src/buildtool/common", "config"] ] , "stage": ["src", "buildtool", "main"] , "private-deps": - [ ["src/buildtool/build_engine/base_maps", "rule_map"] + [ ["@", "json", "", "json"] + , ["src/buildtool/build_engine/base_maps", "rule_map"] , ["src/buildtool/build_engine/base_maps", "targets_file_map"] , ["src/buildtool/build_engine/target_map", "target_map"] , ["src/buildtool/logging", "logging"] @@ -111,6 +112,7 @@ , ["src/buildtool/build_engine/target_map", "configured_target"] , ["src/buildtool/build_engine/target_map", "result_map"] , ["src/buildtool/build_engine/analysed_target", "target"] + , ["src/buildtool/common", "config"] ] , "stage": ["src", "buildtool", "main"] , "private-deps": diff --git a/src/buildtool/main/analyse.cpp b/src/buildtool/main/analyse.cpp index 6cccd1c3..54b77e4f 100644 --- a/src/buildtool/main/analyse.cpp +++ b/src/buildtool/main/analyse.cpp @@ -125,22 +125,29 @@ void DetectAndReportPending(std::string const& name, [[nodiscard]] auto AnalyseTarget( const Target::ConfiguredTarget& id, gsl::not_null<Target::ResultTargetMap*> const& result_map, + gsl::not_null<RepositoryConfig*> const& repo_config, std::size_t jobs, AnalysisArguments const& clargs) -> std::optional<AnalysisResult> { - auto directory_entries = Base::CreateDirectoryEntriesMap(jobs); - auto expressions_file_map = Base::CreateExpressionFileMap(jobs); - auto rule_file_map = Base::CreateRuleFileMap(jobs); - auto targets_file_map = Base::CreateTargetsFileMap(jobs); - auto expr_map = Base::CreateExpressionMap(&expressions_file_map, jobs); - auto rule_map = Base::CreateRuleMap(&rule_file_map, &expr_map, jobs); - auto source_targets = Base::CreateSourceTargetMap(&directory_entries, jobs); - auto absent_target_map = Target::CreateAbsentTargetMap(result_map, jobs); + auto directory_entries = Base::CreateDirectoryEntriesMap(repo_config, jobs); + auto expressions_file_map = + Base::CreateExpressionFileMap(repo_config, jobs); + auto rule_file_map = Base::CreateRuleFileMap(repo_config, jobs); + auto targets_file_map = Base::CreateTargetsFileMap(repo_config, jobs); + auto expr_map = + Base::CreateExpressionMap(&expressions_file_map, repo_config, jobs); + auto rule_map = + Base::CreateRuleMap(&rule_file_map, &expr_map, repo_config, jobs); + auto source_targets = + Base::CreateSourceTargetMap(&directory_entries, repo_config, jobs); + auto absent_target_map = + Target::CreateAbsentTargetMap(result_map, repo_config, jobs); auto target_map = Target::CreateTargetMap(&source_targets, &targets_file_map, &rule_map, &directory_entries, &absent_target_map, result_map, + repo_config, jobs); Logger::Log(LogLevel::Info, "Requested target is {}", id.ToString()); AnalysedTargetPtr target{}; diff --git a/src/buildtool/main/analyse.hpp b/src/buildtool/main/analyse.hpp index 40b13ec1..f4d96229 100644 --- a/src/buildtool/main/analyse.hpp +++ b/src/buildtool/main/analyse.hpp @@ -19,6 +19,7 @@ #include "src/buildtool/build_engine/target_map/configured_target.hpp" #include "src/buildtool/build_engine/target_map/result_map.hpp" #include "src/buildtool/common/cli.hpp" +#include "src/buildtool/common/repository_config.hpp" struct AnalysisResult { BuildMaps::Target::ConfiguredTarget id; @@ -29,6 +30,7 @@ struct AnalysisResult { [[nodiscard]] auto AnalyseTarget( const BuildMaps::Target::ConfiguredTarget& id, gsl::not_null<BuildMaps::Target::ResultTargetMap*> const& result_map, + gsl::not_null<RepositoryConfig*> const& repo_config, std::size_t jobs, AnalysisArguments const& clargs) -> std::optional<AnalysisResult>; #endif diff --git a/src/buildtool/main/describe.cpp b/src/buildtool/main/describe.cpp index 1fcdf44e..fcec015b 100644 --- a/src/buildtool/main/describe.cpp +++ b/src/buildtool/main/describe.cpp @@ -53,7 +53,8 @@ void PrintFields(nlohmann::json const& fields, } void PrettyPrintRule(nlohmann::json const& rdesc, - BuildMaps::Base::EntityName const& rule_name) { + BuildMaps::Base::EntityName const& rule_name, + gsl::not_null<RepositoryConfig*> const& repo_config) { auto doc = rdesc.find("doc"); if (doc != rdesc.end()) { PrintDoc(*doc, " | "); @@ -85,6 +86,7 @@ void PrettyPrintRule(nlohmann::json const& rdesc, auto resolved_entry = BuildMaps::Base::ParseEntityNameFromJson( entry, rule_name, + repo_config, [&entry, &rule_name](std::string const& parse_err) { Logger::Log(LogLevel::Warning, "Failed to resolve {} relative to {}:\n{}", @@ -217,11 +219,13 @@ void PrintRuleAsOrderedJson(nlohmann::json const& rdesc, } // namespace -auto DescribeUserDefinedRule(BuildMaps::Base::EntityName const& rule_name, - std::size_t jobs, - bool print_json) -> int { +auto DescribeUserDefinedRule( + BuildMaps::Base::EntityName const& rule_name, + gsl::not_null<RepositoryConfig*> const& repo_config, + std::size_t jobs, + bool print_json) -> int { bool failed{}; - auto rule_file_map = Base::CreateRuleFileMap(jobs); + auto rule_file_map = Base::CreateRuleFileMap(repo_config, jobs); nlohmann::json rules_file; { TaskSystem ts{jobs}; @@ -250,14 +254,15 @@ auto DescribeUserDefinedRule(BuildMaps::Base::EntityName const& rule_name, PrintRuleAsOrderedJson(*ruledesc_it, rule_name.ToJson()); return kExitSuccess; } - PrettyPrintRule(*ruledesc_it, rule_name); + PrettyPrintRule(*ruledesc_it, rule_name, repo_config); return kExitSuccess; } auto DescribeTarget(BuildMaps::Target::ConfiguredTarget const& id, + gsl::not_null<RepositoryConfig*> const& repo_config, std::size_t jobs, bool print_json) -> int { - auto targets_file_map = Base::CreateTargetsFileMap(jobs); + auto targets_file_map = Base::CreateTargetsFileMap(repo_config, jobs); nlohmann::json targets_file{}; bool failed{false}; { @@ -319,7 +324,10 @@ auto DescribeTarget(BuildMaps::Target::ConfiguredTarget const& id, return kExitSuccess; } auto rule_name = BuildMaps::Base::ParseEntityNameFromJson( - *rule_it, id.target, [&rule_it, &id](std::string const& parse_err) { + *rule_it, + id.target, + repo_config, + [&rule_it, &id](std::string const& parse_err) { Logger::Log(LogLevel::Error, "Parsing rule name {} for target {} failed with:\n{}.", rule_it->dump(), @@ -333,5 +341,5 @@ auto DescribeTarget(BuildMaps::Target::ConfiguredTarget const& id, std::cout << id.ToString() << " is defined by user-defined rule " << rule_name->ToString() << ".\n\n"; } - return DescribeUserDefinedRule(*rule_name, jobs, print_json); + return DescribeUserDefinedRule(*rule_name, repo_config, jobs, print_json); } diff --git a/src/buildtool/main/describe.hpp b/src/buildtool/main/describe.hpp index 168d4693..f2c9614b 100644 --- a/src/buildtool/main/describe.hpp +++ b/src/buildtool/main/describe.hpp @@ -17,13 +17,17 @@ #include "src/buildtool/build_engine/base_maps/entity_name.hpp" #include "src/buildtool/build_engine/target_map/configured_target.hpp" +#include "src/buildtool/common/repository_config.hpp" -[[nodiscard]] auto DescribeTarget(BuildMaps::Target::ConfiguredTarget const& id, - std::size_t jobs, - bool print_json) -> int; +[[nodiscard]] auto DescribeTarget( + BuildMaps::Target::ConfiguredTarget const& id, + gsl::not_null<RepositoryConfig*> const& repo_config, + std::size_t jobs, + bool print_json) -> int; [[nodiscard]] auto DescribeUserDefinedRule( BuildMaps::Base::EntityName const& rule_name, + gsl::not_null<RepositoryConfig*> const& repo_config, std::size_t jobs, bool print_json) -> int; diff --git a/src/buildtool/main/main.cpp b/src/buildtool/main/main.cpp index 401854ee..022ba916 100644 --- a/src/buildtool/main/main.cpp +++ b/src/buildtool/main/main.cpp @@ -402,12 +402,11 @@ void SetupHashFunction() { } [[nodiscard]] auto ReadConfiguredTarget( - AnalysisArguments const& clargs, std::string const& main_repo, - std::optional<std::filesystem::path> const& main_ws_root) - -> Target::ConfiguredTarget { - auto const* target_root = - RepositoryConfig::Instance().TargetRoot(main_repo); + std::optional<std::filesystem::path> const& main_ws_root, + gsl::not_null<RepositoryConfig*> const& repo_config, + AnalysisArguments const& clargs) -> Target::ConfiguredTarget { + auto const* target_root = repo_config->TargetRoot(main_repo); if (target_root == nullptr) { Logger::Log(LogLevel::Error, "Cannot obtain target root for main repo {}.", @@ -415,8 +414,7 @@ void SetupHashFunction() { std::exit(kExitFailure); } auto current_module = std::string{"."}; - std::string target_file_name = - *RepositoryConfig::Instance().TargetFileName(main_repo); + std::string target_file_name = *repo_config->TargetFileName(main_repo); if (main_ws_root) { // module detection only works if main workspace is on the file system current_module = DetermineCurrentModule( @@ -427,6 +425,7 @@ void SetupHashFunction() { auto entity = Base::ParseEntityNameFromJson( *clargs.target, Base::EntityName{Base::NamedTarget{main_repo, current_module, ""}}, + repo_config, [&clargs](std::string const& parse_err) { Logger::Log(LogLevel::Error, "Parsing target name {} failed with:\n{}", @@ -456,6 +455,7 @@ void SetupHashFunction() { auto entity = Base::ParseEntityNameFromJson( target, Base::EntityName{Base::NamedTarget{main_repo, current_module, ""}}, + repo_config, [&target](std::string const& parse_err) { Logger::Log(LogLevel::Error, "Parsing target name {} failed with:\n{}", @@ -639,7 +639,8 @@ auto ParseRoot(std::string const& repo, // Set all roots and name mappings from the command-line arguments and // return the name of the main repository and main workspace path if local. -auto DetermineRoots(CommonArguments const& cargs, +auto DetermineRoots(gsl::not_null<RepositoryConfig*> const& repository_config, + CommonArguments const& cargs, AnalysisArguments const& aargs) -> std::pair<std::string, std::optional<std::filesystem::path>> { std::optional<std::filesystem::path> main_ws_root; @@ -800,7 +801,7 @@ auto DetermineRoots(CommonArguments const& cargs, "expression_file_name", aargs.expression_file_name); - RepositoryConfig::Instance().SetInfo(repo, std::move(info)); + repository_config->SetInfo(repo, std::move(info)); } return {main_repo, main_ws_root}; @@ -840,9 +841,11 @@ void ReportTaintedness(const AnalysisResult& result) { auto DetermineNonExplicitTarget( std::string const& main_repo, std::optional<std::filesystem::path> const& main_ws_root, + gsl::not_null<RepositoryConfig*> const& repo_config, AnalysisArguments const& clargs) -> std::optional<BuildMaps::Target::ConfiguredTarget> { - auto id = ReadConfiguredTarget(clargs, main_repo, main_ws_root); + auto id = + ReadConfiguredTarget(main_repo, main_ws_root, repo_config, clargs); switch (id.target.GetNamedTarget().reference_t) { case Base::ReferenceType::kFile: std::cout << id.ToString() << " is a source file." << std::endl; @@ -954,6 +957,9 @@ auto main(int argc, char* argv[]) -> int { *arguments.analysis.expression_log_limit); } + // global repository configuration + RepositoryConfig repo_config{}; + #ifndef BOOTSTRAP_BUILD_TOOL /** * The current implementation of libgit2 uses pthread_key_t incorrectly @@ -1013,11 +1019,11 @@ auto main(int argc, char* argv[]) -> int { std::move(arguments.build), std::move(stage_args), std::move(rebuild_args)}, + &repo_config, ProgressReporter::Reporter()}; if (arguments.cmd == SubCommand::kInstallCas) { - if (not RepositoryConfig::Instance().SetGitCAS( - StorageConfig::GitRoot())) { + if (not repo_config.SetGitCAS(StorageConfig::GitRoot())) { Logger::Log(LogLevel::Debug, "Failed set Git CAS {}.", StorageConfig::GitRoot().string()); @@ -1031,7 +1037,7 @@ auto main(int argc, char* argv[]) -> int { #endif // BOOTSTRAP_BUILD_TOOL auto [main_repo, main_ws_root] = - DetermineRoots(arguments.common, arguments.analysis); + DetermineRoots(&repo_config, arguments.common, arguments.analysis); #ifndef BOOTSTRAP_BUILD_TOOL auto lock = GarbageCollector::SharedLock(); @@ -1049,8 +1055,7 @@ auto main(int argc, char* argv[]) -> int { "--compatible"); std::exit(EXIT_FAILURE); } - if (not RepositoryConfig::Instance().SetGitCAS( - *arguments.graph.git_cas)) { + if (not repo_config.SetGitCAS(*arguments.graph.git_cas)) { Logger::Log(LogLevel::Warning, "Failed set Git CAS {}.", arguments.graph.git_cas->string()); @@ -1062,14 +1067,18 @@ auto main(int argc, char* argv[]) -> int { } } else if (arguments.cmd == SubCommand::kDescribe) { - if (auto id = DetermineNonExplicitTarget( - main_repo, main_ws_root, arguments.analysis)) { + if (auto id = DetermineNonExplicitTarget(main_repo, + main_ws_root, + &repo_config, + arguments.analysis)) { return arguments.describe.describe_rule ? DescribeUserDefinedRule( id->target, + &repo_config, arguments.common.jobs, arguments.describe.print_json) : DescribeTarget(*id, + &repo_config, arguments.common.jobs, arguments.describe.print_json); } @@ -1081,9 +1090,12 @@ auto main(int argc, char* argv[]) -> int { BuildMaps::Target::ResultTargetMap result_map{ arguments.common.jobs}; auto id = ReadConfiguredTarget( - arguments.analysis, main_repo, main_ws_root); - auto result = AnalyseTarget( - id, &result_map, arguments.common.jobs, arguments.analysis); + main_repo, main_ws_root, &repo_config, arguments.analysis); + auto result = AnalyseTarget(id, + &result_map, + &repo_config, + arguments.common.jobs, + arguments.analysis); if (result) { if (arguments.analysis.graph_file) { result_map.ToFile(*arguments.analysis.graph_file); diff --git a/src/buildtool/serve_api/remote/target_client.hpp b/src/buildtool/serve_api/remote/target_client.hpp index ac52a468..72b8d82c 100644 --- a/src/buildtool/serve_api/remote/target_client.hpp +++ b/src/buildtool/serve_api/remote/target_client.hpp @@ -57,6 +57,7 @@ class TargetClient { Logger logger_{"RemoteTargetClient"}; gsl::not_null<IExecutionApi::Ptr> const remote_api_{ CreateExecutionApi(RemoteExecutionConfig::RemoteAddress(), + std::nullopt, "remote-execution")}; gsl::not_null<IExecutionApi::Ptr> const local_api_{ CreateExecutionApi(std::nullopt)}; diff --git a/src/buildtool/serve_api/serve_service/source_tree.hpp b/src/buildtool/serve_api/serve_service/source_tree.hpp index db64d693..03687df4 100644 --- a/src/buildtool/serve_api/serve_service/source_tree.hpp +++ b/src/buildtool/serve_api/serve_service/source_tree.hpp @@ -75,7 +75,9 @@ class SourceTreeService final // remote execution endpoint gsl::not_null<IExecutionApi::Ptr> const remote_api_{ - CreateExecutionApi(RemoteExecutionConfig::RemoteAddress())}; + CreateExecutionApi(RemoteExecutionConfig::RemoteAddress(), + std::nullopt, + "serve-remote-execution")}; // local api gsl::not_null<IExecutionApi::Ptr> const local_api_{ CreateExecutionApi(std::nullopt)}; diff --git a/src/buildtool/serve_api/serve_service/target.hpp b/src/buildtool/serve_api/serve_service/target.hpp index 0f3f4ae2..e1176b86 100644 --- a/src/buildtool/serve_api/serve_service/target.hpp +++ b/src/buildtool/serve_api/serve_service/target.hpp @@ -72,6 +72,7 @@ class TargetService final : public justbuild::just_serve::Target::Service { // remote execution endpoint used for remote building gsl::not_null<IExecutionApi::Ptr> const remote_api_{ CreateExecutionApi(RemoteExecutionConfig::RemoteAddress(), + std::nullopt, "serve-remote-execution")}; // used for storing and retrieving target-level cache entries gsl::not_null<IExecutionApi::Ptr> const local_api_{ diff --git a/test/buildtool/build_engine/base_maps/TARGETS b/test/buildtool/build_engine/base_maps/TARGETS index 862aa3dc..9a71957d 100644 --- a/test/buildtool/build_engine/base_maps/TARGETS +++ b/test/buildtool/build_engine/base_maps/TARGETS @@ -43,6 +43,7 @@ [ "test_repo" , ["@", "catch2", "", "catch2"] , ["", "catch-main"] + , ["@", "src", "src/buildtool/common", "config"] , ["@", "src", "src/buildtool/build_engine/base_maps", "json_file_map"] ] , "stage": ["test", "buildtool", "build_engine", "base_maps"] @@ -56,6 +57,7 @@ [ "test_repo" , ["@", "catch2", "", "catch2"] , ["", "catch-main"] + , ["@", "src", "src/buildtool/common", "config"] , ["@", "src", "src/buildtool/build_engine/base_maps", "directory_map"] , ["@", "src", "src/buildtool/build_engine/base_maps", "source_map"] ] @@ -83,6 +85,7 @@ [ "test_repo" , ["@", "catch2", "", "catch2"] , ["", "catch-main"] + , ["@", "src", "src/buildtool/common", "config"] , ["@", "src", "src/buildtool/build_engine/base_maps", "rule_map"] ] , "stage": ["test", "buildtool", "build_engine", "base_maps"] diff --git a/test/buildtool/build_engine/base_maps/directory_map.test.cpp b/test/buildtool/build_engine/base_maps/directory_map.test.cpp index e05e5269..b2674c2b 100644 --- a/test/buildtool/build_engine/base_maps/directory_map.test.cpp +++ b/test/buildtool/build_engine/base_maps/directory_map.test.cpp @@ -13,6 +13,7 @@ // limitations under the License. #include <filesystem> +#include <memory> #include "catch2/catch_test_macros.hpp" #include "src/buildtool/build_engine/base_maps/directory_map.hpp" @@ -24,7 +25,7 @@ namespace { using namespace BuildMaps::Base; // NOLINT -void SetupConfig(bool use_git) { +auto SetupConfig(bool use_git) -> RepositoryConfig { auto root = FileRoot{kBasePath / "data_src"}; if (use_git) { auto repo_path = CreateTestRepo(); @@ -33,16 +34,16 @@ void SetupConfig(bool use_git) { REQUIRE(git_root); root = std::move(*git_root); } - RepositoryConfig::Instance().Reset(); - RepositoryConfig::Instance().SetInfo( - "", RepositoryConfig::RepositoryInfo{root}); + RepositoryConfig repo_config{}; + repo_config.SetInfo("", RepositoryConfig::RepositoryInfo{root}); + return repo_config; } auto ReadDirectory(ModuleName const& id, DirectoryEntriesMap::Consumer value_checker, bool use_git = false) -> bool { - SetupConfig(use_git); - auto data_direntries = CreateDirectoryEntriesMap(); + auto repo_config = SetupConfig(use_git); + auto data_direntries = CreateDirectoryEntriesMap(&repo_config); bool success{true}; { TaskSystem ts; diff --git a/test/buildtool/build_engine/base_maps/expression_map.test.cpp b/test/buildtool/build_engine/base_maps/expression_map.test.cpp index 89b73d33..392d81ba 100644 --- a/test/buildtool/build_engine/base_maps/expression_map.test.cpp +++ b/test/buildtool/build_engine/base_maps/expression_map.test.cpp @@ -14,6 +14,7 @@ #include <filesystem> #include <functional> +#include <memory> #include "catch2/catch_test_macros.hpp" #include "src/buildtool/build_engine/base_maps/expression_map.hpp" @@ -26,7 +27,7 @@ namespace { using namespace BuildMaps::Base; // NOLINT -void SetupConfig(bool use_git) { +auto SetupConfig(bool use_git) -> RepositoryConfig { auto root = FileRoot{kBasePath / "data_expr"}; if (use_git) { auto repo_path = CreateTestRepo(); @@ -35,17 +36,17 @@ void SetupConfig(bool use_git) { REQUIRE(git_root); root = std::move(*git_root); } - RepositoryConfig::Instance().Reset(); - RepositoryConfig::Instance().SetInfo( - "", RepositoryConfig::RepositoryInfo{root}); + RepositoryConfig repo_config{}; + repo_config.SetInfo("", RepositoryConfig::RepositoryInfo{root}); + return repo_config; } auto ReadExpressionFunction(EntityName const& id, ExpressionFunctionMap::Consumer value_checker, bool use_git = false) -> bool { - SetupConfig(use_git); - auto expr_file_map = CreateExpressionFileMap(0); - auto expr_func_map = CreateExpressionMap(&expr_file_map); + auto repo_config = SetupConfig(use_git); + auto expr_file_map = CreateExpressionFileMap(&repo_config, 0); + auto expr_func_map = CreateExpressionMap(&expr_file_map, &repo_config); bool success{true}; { diff --git a/test/buildtool/build_engine/base_maps/json_file_map.test.cpp b/test/buildtool/build_engine/base_maps/json_file_map.test.cpp index 15ff87cd..e0177864 100644 --- a/test/buildtool/build_engine/base_maps/json_file_map.test.cpp +++ b/test/buildtool/build_engine/base_maps/json_file_map.test.cpp @@ -13,10 +13,12 @@ // limitations under the License. #include <filesystem> +#include <memory> #include <utility> #include "catch2/catch_test_macros.hpp" #include "src/buildtool/build_engine/base_maps/json_file_map.hpp" +#include "src/buildtool/common/repository_config.hpp" #include "src/buildtool/multithreading/task_system.hpp" #include "test/buildtool/build_engine/base_maps/test_repo.hpp" @@ -24,7 +26,8 @@ namespace { using namespace BuildMaps::Base; // NOLINT -void SetupConfig(std::string target_file_name, bool use_git) { +auto SetupConfig(std::string target_file_name, bool use_git) + -> RepositoryConfig { auto root = FileRoot{kBasePath}; if (use_git) { auto repo_path = CreateTestRepo(); @@ -35,8 +38,9 @@ void SetupConfig(std::string target_file_name, bool use_git) { } auto info = RepositoryConfig::RepositoryInfo{root}; info.target_file_name = std::move(target_file_name); - RepositoryConfig::Instance().Reset(); - RepositoryConfig::Instance().SetInfo("", std::move(info)); + RepositoryConfig repo_config{}; + repo_config.SetInfo("", std::move(info)); + return repo_config; } template <bool kMandatory = true> @@ -46,10 +50,10 @@ auto ReadJsonFile(std::string const& target_file_name, bool use_git = false, std::optional<JsonFileMap::FailureFunction> fail_func = std::nullopt) -> bool { - SetupConfig(target_file_name, use_git); + auto repo_config = SetupConfig(target_file_name, use_git); auto json_files = CreateJsonFileMap<&RepositoryConfig::WorkspaceRoot, &RepositoryConfig::TargetFileName, - kMandatory>(0); + kMandatory>(&repo_config, 0); bool success{true}; { TaskSystem ts; diff --git a/test/buildtool/build_engine/base_maps/rule_map.test.cpp b/test/buildtool/build_engine/base_maps/rule_map.test.cpp index 4235d1f1..7a3a021f 100644 --- a/test/buildtool/build_engine/base_maps/rule_map.test.cpp +++ b/test/buildtool/build_engine/base_maps/rule_map.test.cpp @@ -14,11 +14,13 @@ #include <filesystem> #include <functional> +#include <memory> #include "catch2/catch_test_macros.hpp" #include "src/buildtool/build_engine/base_maps/expression_map.hpp" #include "src/buildtool/build_engine/base_maps/json_file_map.hpp" #include "src/buildtool/build_engine/base_maps/rule_map.hpp" +#include "src/buildtool/common/repository_config.hpp" #include "src/buildtool/multithreading/task_system.hpp" #include "test/buildtool/build_engine/base_maps/test_repo.hpp" @@ -26,7 +28,7 @@ namespace { using namespace BuildMaps::Base; // NOLINT -void SetupConfig(bool use_git) { +auto SetupConfig(bool use_git) -> RepositoryConfig { auto root = FileRoot{kBasePath / "data_rule"}; if (use_git) { auto repo_path = CreateTestRepo(); @@ -35,19 +37,20 @@ void SetupConfig(bool use_git) { REQUIRE(git_root); root = std::move(*git_root); } - RepositoryConfig::Instance().Reset(); - RepositoryConfig::Instance().SetInfo( - "", RepositoryConfig::RepositoryInfo{root}); + RepositoryConfig repo_config{}; + repo_config.SetInfo("", RepositoryConfig::RepositoryInfo{root}); + return repo_config; } auto ReadUserRule(EntityName const& id, UserRuleMap::Consumer value_checker, bool use_git = false) -> bool { - SetupConfig(use_git); - auto expr_file_map = CreateExpressionFileMap(0); - auto expr_func_map = CreateExpressionMap(&expr_file_map); - auto rule_file_map = CreateRuleFileMap(0); - auto user_rule_map = CreateRuleMap(&rule_file_map, &expr_func_map); + auto repo_config = SetupConfig(use_git); + auto expr_file_map = CreateExpressionFileMap(&repo_config, 0); + auto expr_func_map = CreateExpressionMap(&expr_file_map, &repo_config); + auto rule_file_map = CreateRuleFileMap(&repo_config, 0); + auto user_rule_map = + CreateRuleMap(&rule_file_map, &expr_func_map, &repo_config); bool success{true}; { diff --git a/test/buildtool/build_engine/base_maps/source_map.test.cpp b/test/buildtool/build_engine/base_maps/source_map.test.cpp index 05157870..b61bcbd4 100644 --- a/test/buildtool/build_engine/base_maps/source_map.test.cpp +++ b/test/buildtool/build_engine/base_maps/source_map.test.cpp @@ -13,12 +13,14 @@ // limitations under the License. #include <filesystem> +#include <memory> #include <utility> #include "catch2/catch_test_macros.hpp" #include "src/buildtool/build_engine/base_maps/directory_map.hpp" #include "src/buildtool/build_engine/base_maps/entity_name.hpp" #include "src/buildtool/build_engine/base_maps/source_map.hpp" +#include "src/buildtool/common/repository_config.hpp" #include "src/buildtool/multithreading/async_map_consumer.hpp" #include "src/buildtool/multithreading/task_system.hpp" #include "test/buildtool/build_engine/base_maps/test_repo.hpp" @@ -27,7 +29,7 @@ namespace { using namespace BuildMaps::Base; // NOLINT -void SetupConfig(bool use_git) { +auto SetupConfig(bool use_git) -> RepositoryConfig { // manually create locally a test symlink in data_src; should match the // git test_repo structure if (not use_git) { @@ -44,9 +46,9 @@ void SetupConfig(bool use_git) { REQUIRE(git_root); root = std::move(*git_root); } - RepositoryConfig::Instance().Reset(); - RepositoryConfig::Instance().SetInfo( - "", RepositoryConfig::RepositoryInfo{root}); + RepositoryConfig repo_config{}; + repo_config.SetInfo("", RepositoryConfig::RepositoryInfo{root}); + return repo_config; } auto ReadSourceTarget( @@ -55,9 +57,10 @@ auto ReadSourceTarget( bool use_git = false, std::optional<SourceTargetMap::FailureFunction> fail_func = std::nullopt) -> bool { - SetupConfig(use_git); - auto directory_entries = CreateDirectoryEntriesMap(); - auto source_artifacts = CreateSourceTargetMap(&directory_entries); + auto repo_config = SetupConfig(use_git); + auto directory_entries = CreateDirectoryEntriesMap(&repo_config); + auto source_artifacts = + CreateSourceTargetMap(&directory_entries, &repo_config); std::string error_msg; bool success{true}; { diff --git a/test/buildtool/build_engine/target_map/target_map.test.cpp b/test/buildtool/build_engine/target_map/target_map.test.cpp index d9144dfb..14701f6c 100644 --- a/test/buildtool/build_engine/target_map/target_map.test.cpp +++ b/test/buildtool/build_engine/target_map/target_map.test.cpp @@ -44,7 +44,7 @@ auto CreateSymlinks() -> bool { return true; } -void SetupConfig() { +auto SetupConfig() -> RepositoryConfig { // manually create locally test symlinks in data_src, but only once [[maybe_unused]] static auto done = CreateSymlinks(); // create the file roots @@ -57,31 +57,38 @@ void SetupConfig() { "data_rules"}}, FileRoot{std::filesystem::path{"test/buildtool/build_engine/target_map/" "data_expr"}}}; - RepositoryConfig::Instance().Reset(); - RepositoryConfig::Instance().SetInfo("", std::move(info)); + RepositoryConfig repo_config{}; + repo_config.SetInfo("", std::move(info)); + return repo_config; } } // namespace TEST_CASE("simple targets") { - SetupConfig(); - auto directory_entries = BuildMaps::Base::CreateDirectoryEntriesMap(); - auto source = BuildMaps::Base::CreateSourceTargetMap(&directory_entries); - auto targets_file_map = BuildMaps::Base::CreateTargetsFileMap(0); - auto rule_file_map = BuildMaps::Base::CreateRuleFileMap(0); + auto repo_config = SetupConfig(); + auto directory_entries = + BuildMaps::Base::CreateDirectoryEntriesMap(&repo_config); + auto source = BuildMaps::Base::CreateSourceTargetMap(&directory_entries, + &repo_config); + auto targets_file_map = + BuildMaps::Base::CreateTargetsFileMap(&repo_config, 0); + auto rule_file_map = BuildMaps::Base::CreateRuleFileMap(&repo_config, 0); static auto expressions_file_map = - BuildMaps::Base::CreateExpressionFileMap(0); - auto expr_map = BuildMaps::Base::CreateExpressionMap(&expressions_file_map); - auto rule_map = BuildMaps::Base::CreateRuleMap(&rule_file_map, &expr_map); + BuildMaps::Base::CreateExpressionFileMap(&repo_config, 0); + auto expr_map = BuildMaps::Base::CreateExpressionMap(&expressions_file_map, + &repo_config); + auto rule_map = + BuildMaps::Base::CreateRuleMap(&rule_file_map, &expr_map, &repo_config); BuildMaps::Target::ResultTargetMap result_map{0}; auto absent_target_map = - BuildMaps::Target::CreateAbsentTargetMap(&result_map, 0); + BuildMaps::Target::CreateAbsentTargetMap(&result_map, &repo_config, 0); auto target_map = BuildMaps::Target::CreateTargetMap(&source, &targets_file_map, &rule_map, &directory_entries, &absent_target_map, - &result_map); + &result_map, + &repo_config); AnalysedTargetPtr result; bool error{false}; @@ -403,24 +410,30 @@ TEST_CASE("simple targets") { } TEST_CASE("configuration deduplication") { - SetupConfig(); - auto directory_entries = BuildMaps::Base::CreateDirectoryEntriesMap(); - auto source = BuildMaps::Base::CreateSourceTargetMap(&directory_entries); - auto targets_file_map = BuildMaps::Base::CreateTargetsFileMap(0); - auto rule_file_map = BuildMaps::Base::CreateRuleFileMap(0); + auto repo_config = SetupConfig(); + auto directory_entries = + BuildMaps::Base::CreateDirectoryEntriesMap(&repo_config); + auto source = BuildMaps::Base::CreateSourceTargetMap(&directory_entries, + &repo_config); + auto targets_file_map = + BuildMaps::Base::CreateTargetsFileMap(&repo_config, 0); + auto rule_file_map = BuildMaps::Base::CreateRuleFileMap(&repo_config, 0); static auto expressions_file_map = - BuildMaps::Base::CreateExpressionFileMap(0); - auto expr_map = BuildMaps::Base::CreateExpressionMap(&expressions_file_map); - auto rule_map = BuildMaps::Base::CreateRuleMap(&rule_file_map, &expr_map); + BuildMaps::Base::CreateExpressionFileMap(&repo_config, 0); + auto expr_map = BuildMaps::Base::CreateExpressionMap(&expressions_file_map, + &repo_config); + auto rule_map = + BuildMaps::Base::CreateRuleMap(&rule_file_map, &expr_map, &repo_config); BuildMaps::Target::ResultTargetMap result_map{0}; auto absent_target_map = - BuildMaps::Target::CreateAbsentTargetMap(&result_map, 0); + BuildMaps::Target::CreateAbsentTargetMap(&result_map, &repo_config, 0); auto target_map = BuildMaps::Target::CreateTargetMap(&source, &targets_file_map, &rule_map, &directory_entries, &absent_target_map, - &result_map); + &result_map, + &repo_config); std::vector<AnalysedTargetPtr> result; bool error{false}; @@ -464,24 +477,30 @@ TEST_CASE("configuration deduplication") { } TEST_CASE("generator functions in string arguments") { - SetupConfig(); - auto directory_entries = BuildMaps::Base::CreateDirectoryEntriesMap(); - auto source = BuildMaps::Base::CreateSourceTargetMap(&directory_entries); - auto targets_file_map = BuildMaps::Base::CreateTargetsFileMap(0); - auto rule_file_map = BuildMaps::Base::CreateRuleFileMap(0); + auto repo_config = SetupConfig(); + auto directory_entries = + BuildMaps::Base::CreateDirectoryEntriesMap(&repo_config); + auto source = BuildMaps::Base::CreateSourceTargetMap(&directory_entries, + &repo_config); + auto targets_file_map = + BuildMaps::Base::CreateTargetsFileMap(&repo_config, 0); + auto rule_file_map = BuildMaps::Base::CreateRuleFileMap(&repo_config, 0); static auto expressions_file_map = - BuildMaps::Base::CreateExpressionFileMap(0); - auto expr_map = BuildMaps::Base::CreateExpressionMap(&expressions_file_map); - auto rule_map = BuildMaps::Base::CreateRuleMap(&rule_file_map, &expr_map); + BuildMaps::Base::CreateExpressionFileMap(&repo_config, 0); + auto expr_map = BuildMaps::Base::CreateExpressionMap(&expressions_file_map, + &repo_config); + auto rule_map = + BuildMaps::Base::CreateRuleMap(&rule_file_map, &expr_map, &repo_config); BuildMaps::Target::ResultTargetMap result_map{0}; auto absent_target_map = - BuildMaps::Target::CreateAbsentTargetMap(&result_map, 0); + BuildMaps::Target::CreateAbsentTargetMap(&result_map, &repo_config, 0); auto target_map = BuildMaps::Target::CreateTargetMap(&source, &targets_file_map, &rule_map, &directory_entries, &absent_target_map, - &result_map); + &result_map, + &repo_config); AnalysedTargetPtr result; bool error{false}; @@ -538,24 +557,30 @@ TEST_CASE("generator functions in string arguments") { } TEST_CASE("built-in rules") { - SetupConfig(); - auto directory_entries = BuildMaps::Base::CreateDirectoryEntriesMap(); - auto source = BuildMaps::Base::CreateSourceTargetMap(&directory_entries); - auto targets_file_map = BuildMaps::Base::CreateTargetsFileMap(0); - auto rule_file_map = BuildMaps::Base::CreateRuleFileMap(0); + auto repo_config = SetupConfig(); + auto directory_entries = + BuildMaps::Base::CreateDirectoryEntriesMap(&repo_config); + auto source = BuildMaps::Base::CreateSourceTargetMap(&directory_entries, + &repo_config); + auto targets_file_map = + BuildMaps::Base::CreateTargetsFileMap(&repo_config, 0); + auto rule_file_map = BuildMaps::Base::CreateRuleFileMap(&repo_config, 0); static auto expressions_file_map = - BuildMaps::Base::CreateExpressionFileMap(0); - auto expr_map = BuildMaps::Base::CreateExpressionMap(&expressions_file_map); - auto rule_map = BuildMaps::Base::CreateRuleMap(&rule_file_map, &expr_map); + BuildMaps::Base::CreateExpressionFileMap(&repo_config, 0); + auto expr_map = BuildMaps::Base::CreateExpressionMap(&expressions_file_map, + &repo_config); + auto rule_map = + BuildMaps::Base::CreateRuleMap(&rule_file_map, &expr_map, &repo_config); BuildMaps::Target::ResultTargetMap result_map{0}; auto absent_target_map = - BuildMaps::Target::CreateAbsentTargetMap(&result_map, 0); + BuildMaps::Target::CreateAbsentTargetMap(&result_map, &repo_config, 0); auto target_map = BuildMaps::Target::CreateTargetMap(&source, &targets_file_map, &rule_map, &directory_entries, &absent_target_map, - &result_map); + &result_map, + &repo_config); AnalysedTargetPtr result; bool error{false}; std::string error_msg; @@ -722,24 +747,30 @@ TEST_CASE("built-in rules") { } TEST_CASE("target reference") { - SetupConfig(); - auto directory_entries = BuildMaps::Base::CreateDirectoryEntriesMap(); - auto source = BuildMaps::Base::CreateSourceTargetMap(&directory_entries); - auto targets_file_map = BuildMaps::Base::CreateTargetsFileMap(0); - auto rule_file_map = BuildMaps::Base::CreateRuleFileMap(0); + auto repo_config = SetupConfig(); + auto directory_entries = + BuildMaps::Base::CreateDirectoryEntriesMap(&repo_config); + auto source = BuildMaps::Base::CreateSourceTargetMap(&directory_entries, + &repo_config); + auto targets_file_map = + BuildMaps::Base::CreateTargetsFileMap(&repo_config, 0); + auto rule_file_map = BuildMaps::Base::CreateRuleFileMap(&repo_config, 0); static auto expressions_file_map = - BuildMaps::Base::CreateExpressionFileMap(0); - auto expr_map = BuildMaps::Base::CreateExpressionMap(&expressions_file_map); - auto rule_map = BuildMaps::Base::CreateRuleMap(&rule_file_map, &expr_map); + BuildMaps::Base::CreateExpressionFileMap(&repo_config, 0); + auto expr_map = BuildMaps::Base::CreateExpressionMap(&expressions_file_map, + &repo_config); + auto rule_map = + BuildMaps::Base::CreateRuleMap(&rule_file_map, &expr_map, &repo_config); BuildMaps::Target::ResultTargetMap result_map{0}; auto absent_target_map = - BuildMaps::Target::CreateAbsentTargetMap(&result_map, 0); + BuildMaps::Target::CreateAbsentTargetMap(&result_map, &repo_config, 0); auto target_map = BuildMaps::Target::CreateTargetMap(&source, &targets_file_map, &rule_map, &directory_entries, &absent_target_map, - &result_map); + &result_map, + &repo_config); AnalysedTargetPtr result; bool error{false}; @@ -839,24 +870,30 @@ TEST_CASE("target reference") { } TEST_CASE("trees") { - SetupConfig(); - auto directory_entries = BuildMaps::Base::CreateDirectoryEntriesMap(); - auto source = BuildMaps::Base::CreateSourceTargetMap(&directory_entries); - auto targets_file_map = BuildMaps::Base::CreateTargetsFileMap(0); - auto rule_file_map = BuildMaps::Base::CreateRuleFileMap(0); + auto repo_config = SetupConfig(); + auto directory_entries = + BuildMaps::Base::CreateDirectoryEntriesMap(&repo_config); + auto source = BuildMaps::Base::CreateSourceTargetMap(&directory_entries, + &repo_config); + auto targets_file_map = + BuildMaps::Base::CreateTargetsFileMap(&repo_config, 0); + auto rule_file_map = BuildMaps::Base::CreateRuleFileMap(&repo_config, 0); static auto expressions_file_map = - BuildMaps::Base::CreateExpressionFileMap(0); - auto expr_map = BuildMaps::Base::CreateExpressionMap(&expressions_file_map); - auto rule_map = BuildMaps::Base::CreateRuleMap(&rule_file_map, &expr_map); + BuildMaps::Base::CreateExpressionFileMap(&repo_config, 0); + auto expr_map = BuildMaps::Base::CreateExpressionMap(&expressions_file_map, + &repo_config); + auto rule_map = + BuildMaps::Base::CreateRuleMap(&rule_file_map, &expr_map, &repo_config); BuildMaps::Target::ResultTargetMap result_map{0}; auto absent_target_map = - BuildMaps::Target::CreateAbsentTargetMap(&result_map, 0); + BuildMaps::Target::CreateAbsentTargetMap(&result_map, &repo_config, 0); auto target_map = BuildMaps::Target::CreateTargetMap(&source, &targets_file_map, &rule_map, &directory_entries, &absent_target_map, - &result_map); + &result_map, + &repo_config); AnalysedTargetPtr result; bool error{false}; @@ -920,24 +957,30 @@ TEST_CASE("trees") { } TEST_CASE("RESULT error reporting") { - SetupConfig(); - auto directory_entries = BuildMaps::Base::CreateDirectoryEntriesMap(); - auto source = BuildMaps::Base::CreateSourceTargetMap(&directory_entries); - auto targets_file_map = BuildMaps::Base::CreateTargetsFileMap(0); - auto rule_file_map = BuildMaps::Base::CreateRuleFileMap(0); + auto repo_config = SetupConfig(); + auto directory_entries = + BuildMaps::Base::CreateDirectoryEntriesMap(&repo_config); + auto source = BuildMaps::Base::CreateSourceTargetMap(&directory_entries, + &repo_config); + auto targets_file_map = + BuildMaps::Base::CreateTargetsFileMap(&repo_config, 0); + auto rule_file_map = BuildMaps::Base::CreateRuleFileMap(&repo_config, 0); static auto expressions_file_map = - BuildMaps::Base::CreateExpressionFileMap(0); - auto expr_map = BuildMaps::Base::CreateExpressionMap(&expressions_file_map); - auto rule_map = BuildMaps::Base::CreateRuleMap(&rule_file_map, &expr_map); + BuildMaps::Base::CreateExpressionFileMap(&repo_config, 0); + auto expr_map = BuildMaps::Base::CreateExpressionMap(&expressions_file_map, + &repo_config); + auto rule_map = + BuildMaps::Base::CreateRuleMap(&rule_file_map, &expr_map, &repo_config); BuildMaps::Target::ResultTargetMap result_map{0}; auto absent_target_map = - BuildMaps::Target::CreateAbsentTargetMap(&result_map, 0); + BuildMaps::Target::CreateAbsentTargetMap(&result_map, &repo_config, 0); auto target_map = BuildMaps::Target::CreateTargetMap(&source, &targets_file_map, &rule_map, &directory_entries, &absent_target_map, - &result_map); + &result_map, + &repo_config); AnalysedTargetPtr result; bool error{false}; @@ -1060,24 +1103,30 @@ TEST_CASE("RESULT error reporting") { } TEST_CASE("wrong arguments") { - SetupConfig(); - auto directory_entries = BuildMaps::Base::CreateDirectoryEntriesMap(); - auto source = BuildMaps::Base::CreateSourceTargetMap(&directory_entries); - auto targets_file_map = BuildMaps::Base::CreateTargetsFileMap(0); - auto rule_file_map = BuildMaps::Base::CreateRuleFileMap(0); + auto repo_config = SetupConfig(); + auto directory_entries = + BuildMaps::Base::CreateDirectoryEntriesMap(&repo_config); + auto source = BuildMaps::Base::CreateSourceTargetMap(&directory_entries, + &repo_config); + auto targets_file_map = + BuildMaps::Base::CreateTargetsFileMap(&repo_config, 0); + auto rule_file_map = BuildMaps::Base::CreateRuleFileMap(&repo_config, 0); static auto expressions_file_map = - BuildMaps::Base::CreateExpressionFileMap(0); - auto expr_map = BuildMaps::Base::CreateExpressionMap(&expressions_file_map); - auto rule_map = BuildMaps::Base::CreateRuleMap(&rule_file_map, &expr_map); + BuildMaps::Base::CreateExpressionFileMap(&repo_config, 0); + auto expr_map = BuildMaps::Base::CreateExpressionMap(&expressions_file_map, + &repo_config); + auto rule_map = + BuildMaps::Base::CreateRuleMap(&rule_file_map, &expr_map, &repo_config); BuildMaps::Target::ResultTargetMap result_map{0}; auto absent_target_map = - BuildMaps::Target::CreateAbsentTargetMap(&result_map, 0); + BuildMaps::Target::CreateAbsentTargetMap(&result_map, &repo_config, 0); auto target_map = BuildMaps::Target::CreateTargetMap(&source, &targets_file_map, &rule_map, &directory_entries, &absent_target_map, - &result_map); + &result_map, + &repo_config); AnalysedTargetPtr result; bool error{false}; diff --git a/test/buildtool/common/repository_config.test.cpp b/test/buildtool/common/repository_config.test.cpp index cfde95ed..6eaec044 100644 --- a/test/buildtool/common/repository_config.test.cpp +++ b/test/buildtool/common/repository_config.test.cpp @@ -104,8 +104,7 @@ template <class T> TEST_CASE_METHOD(HermeticLocalTestFixture, "Test missing repository", "[repository_config]") { - auto& config = RepositoryConfig::Instance(); - config.Reset(); + RepositoryConfig config{}; CHECK(config.Info("missing") == nullptr); CHECK_FALSE(config.RepositoryKey("missing")); @@ -114,8 +113,7 @@ TEST_CASE_METHOD(HermeticLocalTestFixture, TEST_CASE_METHOD(HermeticLocalTestFixture, "Compute key of fixed repository", "[repository_config]") { - auto& config = RepositoryConfig::Instance(); - config.Reset(); + RepositoryConfig config{}; SECTION("for single fixed repository") { config.SetInfo("foo", CreateFixedRepoInfo()); @@ -144,8 +142,7 @@ TEST_CASE_METHOD(HermeticLocalTestFixture, TEST_CASE_METHOD(HermeticLocalTestFixture, "Compute key of file repository", "[repository_config]") { - auto& config = RepositoryConfig::Instance(); - config.Reset(); + RepositoryConfig config{}; SECTION("for single file repository") { config.SetInfo("foo", CreateFileRepoInfo()); @@ -163,8 +160,7 @@ TEST_CASE_METHOD(HermeticLocalTestFixture, TEST_CASE_METHOD(HermeticLocalTestFixture, "Compare key of two repos with same content", "[repository_config]") { - auto& config = RepositoryConfig::Instance(); - config.Reset(); + RepositoryConfig config{}; // create two different repo infos with same content (baz should be same) config.SetInfo("foo", CreateFixedRepoInfo({{"dep", "baz0"}})); diff --git a/test/buildtool/execution_api/local/TARGETS b/test/buildtool/execution_api/local/TARGETS index 11e92a45..a4b2821a 100644 --- a/test/buildtool/execution_api/local/TARGETS +++ b/test/buildtool/execution_api/local/TARGETS @@ -6,6 +6,7 @@ [ ["@", "catch2", "", "catch2"] , ["", "catch-main"] , ["@", "src", "src/buildtool/common", "artifact_factory"] + , ["@", "src", "src/buildtool/common", "config"] , ["@", "src", "src/buildtool/execution_api/local", "local"] , ["utils", "local_hermeticity"] ] diff --git a/test/buildtool/execution_api/local/local_execution.test.cpp b/test/buildtool/execution_api/local/local_execution.test.cpp index 9dbed876..36615d89 100755 --- a/test/buildtool/execution_api/local/local_execution.test.cpp +++ b/test/buildtool/execution_api/local/local_execution.test.cpp @@ -18,6 +18,7 @@ #include "catch2/catch_test_macros.hpp" #include "src/buildtool/common/artifact_factory.hpp" +#include "src/buildtool/common/repository_config.hpp" #include "src/buildtool/execution_api/local/local_api.hpp" #include "test/utils/hermeticity/local.hpp" @@ -37,7 +38,8 @@ namespace { TEST_CASE_METHOD(HermeticLocalTestFixture, "LocalExecution: No input, no output", "[execution_api]") { - auto api = LocalApi{}; + RepositoryConfig repo_config{}; + auto api = LocalApi(&repo_config); std::string test_content("test"); std::vector<std::string> const cmdline = {"echo", "-n", test_content}; @@ -80,7 +82,8 @@ TEST_CASE_METHOD(HermeticLocalTestFixture, TEST_CASE_METHOD(HermeticLocalTestFixture, "LocalExecution: No input, no output, env variables used", "[execution_api]") { - auto api = LocalApi{}; + RepositoryConfig repo_config{}; + auto api = LocalApi(&repo_config); std::string test_content("test from env var"); std::vector<std::string> const cmdline = { @@ -129,7 +132,8 @@ TEST_CASE_METHOD(HermeticLocalTestFixture, TEST_CASE_METHOD(HermeticLocalTestFixture, "LocalExecution: No input, create output", "[execution_api]") { - auto api = LocalApi{}; + RepositoryConfig repo_config{}; + auto api = LocalApi(&repo_config); std::string test_content("test"); auto test_digest = ArtifactDigest::Create<ObjectType::File>(test_content); @@ -184,7 +188,8 @@ TEST_CASE_METHOD(HermeticLocalTestFixture, TEST_CASE_METHOD(HermeticLocalTestFixture, "LocalExecution: One input copied to output", "[execution_api]") { - auto api = LocalApi{}; + RepositoryConfig repo_config{}; + auto api = LocalApi(&repo_config); std::string test_content("test"); auto test_digest = ArtifactDigest::Create<ObjectType::File>(test_content); @@ -253,7 +258,8 @@ TEST_CASE_METHOD(HermeticLocalTestFixture, TEST_CASE_METHOD(HermeticLocalTestFixture, "LocalExecution: Cache failed action's result", "[execution_api]") { - auto api = LocalApi{}; + RepositoryConfig repo_config{}; + auto api = LocalApi(&repo_config); auto flag = GetTestDir() / "flag"; std::vector<std::string> const cmdline = { diff --git a/test/buildtool/execution_engine/executor/TARGETS b/test/buildtool/execution_engine/executor/TARGETS index a3e97d89..991cecc3 100644 --- a/test/buildtool/execution_engine/executor/TARGETS +++ b/test/buildtool/execution_engine/executor/TARGETS @@ -10,6 +10,7 @@ , "srcs": ["executor.test.cpp"] , "private-deps": [ ["@", "src", "src/buildtool/common", "artifact_factory"] + , ["@", "src", "src/buildtool/common", "config"] , ["@", "src", "src/buildtool/execution_api/common", "common"] , ["@", "src", "src/buildtool/execution_engine/dag", "dag"] , ["@", "src", "src/buildtool/execution_engine/executor", "executor"] @@ -26,6 +27,7 @@ , "private-deps": [ "executor_api_tests" , ["@", "src", "src/buildtool/common", "artifact_factory"] + , ["@", "src", "src/buildtool/common", "config"] , ["@", "src", "src/buildtool/execution_api/local", "local"] , ["@", "src", "src/buildtool/execution_api/remote", "config"] , ["@", "src", "src/buildtool/execution_engine/dag", "dag"] @@ -44,6 +46,7 @@ , "private-deps": [ "executor_api_tests" , ["@", "src", "src/buildtool/common", "artifact_factory"] + , ["@", "src", "src/buildtool/common", "config"] , ["@", "src", "src/buildtool/execution_api/remote", "bazel"] , ["@", "src", "src/buildtool/execution_api/remote", "config"] , ["@", "src", "src/buildtool/execution_engine/executor", "executor"] diff --git a/test/buildtool/execution_engine/executor/executor.test.cpp b/test/buildtool/execution_engine/executor/executor.test.cpp index 0df8bd0f..55417016 100644 --- a/test/buildtool/execution_engine/executor/executor.test.cpp +++ b/test/buildtool/execution_engine/executor/executor.test.cpp @@ -18,6 +18,7 @@ #include "catch2/catch_test_macros.hpp" #include "src/buildtool/common/artifact_factory.hpp" +#include "src/buildtool/common/repository_config.hpp" #include "src/buildtool/execution_api/common/execution_api.hpp" #include "src/buildtool/execution_engine/executor/executor.hpp" #include "src/buildtool/file_system/file_system_manager.hpp" @@ -205,17 +206,18 @@ class TestApi : public IExecutionApi { TestApiConfig config_{}; }; -static void SetupConfig(std::filesystem::path const& ws) { +[[nodiscard]] auto SetupConfig(std::filesystem::path const& ws) + -> RepositoryConfig { auto info = RepositoryConfig::RepositoryInfo{FileRoot{ws}}; - RepositoryConfig::Instance().Reset(); - RepositoryConfig::Instance().SetInfo("", std::move(info)); + RepositoryConfig repo_config{}; + repo_config.SetInfo("", std::move(info)); + return repo_config; } [[nodiscard]] static auto CreateTest(gsl::not_null<DependencyGraph*> const& g, std::filesystem::path const& ws) - -> TestApiConfig { + -> std::pair<TestApiConfig, RepositoryConfig> { using path = std::filesystem::path; - SetupConfig(ws); auto const local_cpp_desc = ArtifactDescription{path{"local.cpp"}, ""}; auto const known_cpp_desc = ArtifactDescription{ @@ -243,14 +245,14 @@ static void SetupConfig(std::filesystem::path const& ws) { config.response.cached = true; config.response.exit_code = 0; - return config; + return std::make_pair(config, SetupConfig(ws)); } TEST_CASE("Executor: Process artifact", "[executor]") { std::filesystem::path workspace_path{ "test/buildtool/execution_engine/executor"}; DependencyGraph g; - auto config = CreateTest(&g, workspace_path); + auto [config, repo_config] = CreateTest(&g, workspace_path); auto const local_cpp_desc = ArtifactFactory::DescribeLocalArtifact("local.cpp", ""); @@ -262,7 +264,7 @@ TEST_CASE("Executor: Process artifact", "[executor]") { SECTION("Processing succeeds for valid config") { auto api = TestApi::Ptr{new TestApi{config}}; - Executor runner{api.get(), api.get(), {}}; + Executor runner{&repo_config, api.get(), api.get(), {}}; CHECK(runner.Process(g.ArtifactNodeWithId(local_cpp_id))); CHECK(runner.Process(g.ArtifactNodeWithId(known_cpp_id))); @@ -272,7 +274,7 @@ TEST_CASE("Executor: Process artifact", "[executor]") { config.artifacts["local.cpp"].uploads = false; auto api = TestApi::Ptr{new TestApi{config}}; - Executor runner{api.get(), api.get(), {}}; + Executor runner{&repo_config, api.get(), api.get(), {}}; CHECK(not runner.Process(g.ArtifactNodeWithId(local_cpp_id))); CHECK(runner.Process(g.ArtifactNodeWithId(known_cpp_id))); @@ -282,7 +284,7 @@ TEST_CASE("Executor: Process artifact", "[executor]") { config.artifacts["known.cpp"].available = false; auto api = TestApi::Ptr{new TestApi{config}}; - Executor runner{api.get(), api.get(), {}}; + Executor runner{&repo_config, api.get(), api.get(), {}}; CHECK(runner.Process(g.ArtifactNodeWithId(local_cpp_id))); CHECK(not runner.Process(g.ArtifactNodeWithId(known_cpp_id))); @@ -294,7 +296,7 @@ TEST_CASE("Executor: Process action", "[executor]") { "test/buildtool/execution_engine/executor"}; DependencyGraph g; - auto config = CreateTest(&g, workspace_path); + auto [config, repo_config] = CreateTest(&g, workspace_path); auto const local_cpp_desc = ArtifactFactory::DescribeLocalArtifact("local.cpp", ""); @@ -315,7 +317,7 @@ TEST_CASE("Executor: Process action", "[executor]") { SECTION("Processing succeeds for valid config") { auto api = TestApi::Ptr{new TestApi{config}}; - Executor runner{api.get(), api.get(), {}}; + Executor runner{&repo_config, api.get(), api.get(), {}}; CHECK(runner.Process(g.ArtifactNodeWithId(local_cpp_id))); CHECK(runner.Process(g.ArtifactNodeWithId(known_cpp_id))); @@ -328,7 +330,7 @@ TEST_CASE("Executor: Process action", "[executor]") { config.response.cached = false; auto api = TestApi::Ptr{new TestApi{config}}; - Executor runner{api.get(), api.get(), {}}; + Executor runner{&repo_config, api.get(), api.get(), {}}; CHECK(runner.Process(g.ArtifactNodeWithId(local_cpp_id))); CHECK(runner.Process(g.ArtifactNodeWithId(known_cpp_id))); @@ -341,7 +343,7 @@ TEST_CASE("Executor: Process action", "[executor]") { config.artifacts["output2.exe"].available = false; auto api = TestApi::Ptr{new TestApi{config}}; - Executor runner{api.get(), api.get(), {}}; + Executor runner{&repo_config, api.get(), api.get(), {}}; CHECK(runner.Process(g.ArtifactNodeWithId(local_cpp_id))); CHECK(runner.Process(g.ArtifactNodeWithId(known_cpp_id))); @@ -357,7 +359,7 @@ TEST_CASE("Executor: Process action", "[executor]") { config.execution.failed = true; auto api = TestApi::Ptr{new TestApi{config}}; - Executor runner{api.get(), api.get(), {}}; + Executor runner{&repo_config, api.get(), api.get(), {}}; CHECK(runner.Process(g.ArtifactNodeWithId(local_cpp_id))); CHECK(runner.Process(g.ArtifactNodeWithId(known_cpp_id))); @@ -370,7 +372,7 @@ TEST_CASE("Executor: Process action", "[executor]") { config.response.exit_code = 1; auto api = TestApi::Ptr{new TestApi{config}}; - Executor runner{api.get(), api.get(), {}}; + Executor runner{&repo_config, api.get(), api.get(), {}}; CHECK(runner.Process(g.ArtifactNodeWithId(local_cpp_id))); CHECK(runner.Process(g.ArtifactNodeWithId(known_cpp_id))); @@ -386,7 +388,7 @@ TEST_CASE("Executor: Process action", "[executor]") { config.execution.outputs = {"output1.exe" /*, "output2.exe"*/}; auto api = TestApi::Ptr{new TestApi{config}}; - Executor runner{api.get(), api.get(), {}}; + Executor runner{&repo_config, api.get(), api.get(), {}}; CHECK(runner.Process(g.ArtifactNodeWithId(local_cpp_id))); CHECK(runner.Process(g.ArtifactNodeWithId(known_cpp_id))); diff --git a/test/buildtool/execution_engine/executor/executor_api.test.hpp b/test/buildtool/execution_engine/executor/executor_api.test.hpp index bd02e0fb..85b19911 100755 --- a/test/buildtool/execution_engine/executor/executor_api.test.hpp +++ b/test/buildtool/execution_engine/executor/executor_api.test.hpp @@ -21,6 +21,7 @@ #include "src/buildtool/common/artifact.hpp" #include "src/buildtool/common/artifact_description.hpp" #include "src/buildtool/common/artifact_factory.hpp" +#include "src/buildtool/common/repository_config.hpp" #include "src/buildtool/execution_api/common/execution_api.hpp" #include "src/buildtool/execution_api/remote/config.hpp" #include "src/buildtool/execution_engine/dag/dag.hpp" @@ -30,14 +31,16 @@ using ApiFactory = std::function<IExecutionApi::Ptr()>; -static inline void SetupConfig() { +static inline void SetupConfig(RepositoryConfig* repo_config) { auto info = RepositoryConfig::RepositoryInfo{FileRoot{ std::filesystem::path{"test/buildtool/execution_engine/executor"}}}; - RepositoryConfig::Instance().SetInfo("", std::move(info)); + repo_config->Reset(); + repo_config->SetInfo("", std::move(info)); } -static inline void RunBlobUpload(ApiFactory const& factory) { - SetupConfig(); +static inline void RunBlobUpload(RepositoryConfig* repo_config, + ApiFactory const& factory) { + SetupConfig(repo_config); auto api = factory(); std::string const blob = "test"; CHECK(api->Upload(BlobContainer{{BazelBlob{ @@ -77,12 +80,13 @@ template <class Executor> return tree_artifact->Content().Info(); } -static inline void RunHelloWorldCompilation(ApiFactory const& factory, +static inline void RunHelloWorldCompilation(RepositoryConfig* repo_config, + ApiFactory const& factory, bool is_hermetic = true, int expected_queued = 0, int expected_cached = 0) { using path = std::filesystem::path; - SetupConfig(); + SetupConfig(repo_config); auto const main_cpp_desc = ArtifactDescription{path{"data/hello_world/main.cpp"}, ""}; auto const& main_cpp_id = main_cpp_desc.Id(); @@ -103,8 +107,10 @@ static inline void RunHelloWorldCompilation(ApiFactory const& factory, CHECK(g.ArtifactNodeWithId(exec_id)->HasBuilderAction()); auto api = factory(); - Executor runner{ - api.get(), api.get(), RemoteExecutionConfig::PlatformProperties()}; + Executor runner{repo_config, + api.get(), + api.get(), + RemoteExecutionConfig::PlatformProperties()}; // upload local artifacts auto const* main_cpp_node = g.ArtifactNodeWithId(main_cpp_id); @@ -132,13 +138,14 @@ static inline void RunHelloWorldCompilation(ApiFactory const& factory, } } -static inline void RunGreeterCompilation(ApiFactory const& factory, +static inline void RunGreeterCompilation(RepositoryConfig* repo_config, + ApiFactory const& factory, std::string const& greetcpp, bool is_hermetic = true, int expected_queued = 0, int expected_cached = 0) { using path = std::filesystem::path; - SetupConfig(); + SetupConfig(repo_config); auto const greet_hpp_desc = ArtifactDescription{path{"data/greeter/greet.hpp"}, ""}; auto const& greet_hpp_id = greet_hpp_desc.Id(); @@ -206,8 +213,10 @@ static inline void RunGreeterCompilation(ApiFactory const& factory, CHECK(g.Add({compile_greet_desc, make_lib_desc, make_exe_desc})); auto api = factory(); - Executor runner{ - api.get(), api.get(), RemoteExecutionConfig::PlatformProperties()}; + Executor runner{repo_config, + api.get(), + api.get(), + RemoteExecutionConfig::PlatformProperties()}; // upload local artifacts for (auto const& id : {greet_hpp_id, greet_cpp_id, main_cpp_id}) { @@ -241,52 +250,65 @@ static inline void RunGreeterCompilation(ApiFactory const& factory, } } -[[maybe_unused]] static void TestBlobUpload(ApiFactory const& factory) { - SetupConfig(); +[[maybe_unused]] static void TestBlobUpload(RepositoryConfig* repo_config, + ApiFactory const& factory) { + SetupConfig(repo_config); // NOLINTNEXTLINE - RunBlobUpload(factory); + RunBlobUpload(repo_config, factory); } [[maybe_unused]] static void TestHelloWorldCompilation( + RepositoryConfig* repo_config, ApiFactory const& factory, bool is_hermetic = true) { - SetupConfig(); + SetupConfig(repo_config); // expecting 1 action queued, 0 results from cache // NOLINTNEXTLINE - RunHelloWorldCompilation(factory, is_hermetic, 1, 0); + RunHelloWorldCompilation(repo_config, factory, is_hermetic, 1, 0); SECTION("Running same compilation again") { // expecting 2 actions queued, 1 result from cache // NOLINTNEXTLINE - RunHelloWorldCompilation(factory, is_hermetic, 2, 1); + RunHelloWorldCompilation(repo_config, factory, is_hermetic, 2, 1); } } -[[maybe_unused]] static void TestGreeterCompilation(ApiFactory const& factory, - bool is_hermetic = true) { - SetupConfig(); +[[maybe_unused]] static void TestGreeterCompilation( + RepositoryConfig* repo_config, + ApiFactory const& factory, + bool is_hermetic = true) { + SetupConfig(repo_config); // expecting 3 action queued, 0 results from cache // NOLINTNEXTLINE - RunGreeterCompilation(factory, "greet.cpp", is_hermetic, 3, 0); + RunGreeterCompilation(repo_config, factory, "greet.cpp", is_hermetic, 3, 0); SECTION("Running same compilation again") { // expecting 6 actions queued, 3 results from cache - // NOLINTNEXTLINE - RunGreeterCompilation(factory, "greet.cpp", is_hermetic, 6, 3); + RunGreeterCompilation(repo_config, + factory, + "greet.cpp", + is_hermetic, + 6, // NOLINT + 3); } SECTION("Running modified compilation") { // expecting 6 actions queued, 2 results from cache - // NOLINTNEXTLINE - RunGreeterCompilation(factory, "greet_mod.cpp", is_hermetic, 6, 2); + RunGreeterCompilation(repo_config, + factory, + "greet_mod.cpp", + is_hermetic, + 6, // NOLINT + 2); } } -static inline void TestUploadAndDownloadTrees(ApiFactory const& factory, +static inline void TestUploadAndDownloadTrees(RepositoryConfig* repo_config, + ApiFactory const& factory, bool /*is_hermetic*/ = true, int /*expected_queued*/ = 0, int /*expected_cached*/ = 0) { - SetupConfig(); + SetupConfig(repo_config); auto tmpdir = GetTestDir(); auto foo = std::string{"foo"}; @@ -314,8 +336,10 @@ static inline void TestUploadAndDownloadTrees(ApiFactory const& factory, auto foo_id = g.AddArtifact(foo_desc); auto bar_id = g.AddArtifact(bar_desc); - Executor runner{ - api.get(), api.get(), RemoteExecutionConfig::PlatformProperties()}; + Executor runner{repo_config, + api.get(), + api.get(), + RemoteExecutionConfig::PlatformProperties()}; REQUIRE(runner.Process(g.ArtifactNodeWithId(foo_id))); REQUIRE(runner.Process(g.ArtifactNodeWithId(bar_id))); @@ -415,11 +439,12 @@ static inline void TestUploadAndDownloadTrees(ApiFactory const& factory, } } -static inline void TestRetrieveOutputDirectories(ApiFactory const& factory, +static inline void TestRetrieveOutputDirectories(RepositoryConfig* repo_config, + ApiFactory const& factory, bool /*is_hermetic*/ = true, int /*expected_queued*/ = 0, int /*expected_cached*/ = 0) { - SetupConfig(); + SetupConfig(repo_config); auto tmpdir = GetTestDir(); auto const make_tree_id = std::string{"make_tree"}; @@ -457,8 +482,10 @@ static inline void TestRetrieveOutputDirectories(ApiFactory const& factory, // run action auto api = factory(); - Executor runner{ - api.get(), api.get(), RemoteExecutionConfig::PlatformProperties()}; + Executor runner{repo_config, + api.get(), + api.get(), + RemoteExecutionConfig::PlatformProperties()}; REQUIRE(runner.Process(action)); // read output @@ -502,8 +529,10 @@ static inline void TestRetrieveOutputDirectories(ApiFactory const& factory, // run action auto api = factory(); - Executor runner{ - api.get(), api.get(), RemoteExecutionConfig::PlatformProperties()}; + Executor runner{repo_config, + api.get(), + api.get(), + RemoteExecutionConfig::PlatformProperties()}; REQUIRE(runner.Process(action)); // read output @@ -563,8 +592,10 @@ static inline void TestRetrieveOutputDirectories(ApiFactory const& factory, // run action auto api = factory(); - Executor runner{ - api.get(), api.get(), RemoteExecutionConfig::PlatformProperties()}; + Executor runner{repo_config, + api.get(), + api.get(), + RemoteExecutionConfig::PlatformProperties()}; REQUIRE(runner.Process(action)); // read output @@ -629,7 +660,8 @@ static inline void TestRetrieveOutputDirectories(ApiFactory const& factory, // run action auto api = factory(); - Executor runner{api.get(), + Executor runner{repo_config, + api.get(), api.get(), RemoteExecutionConfig::PlatformProperties()}; CHECK_FALSE(runner.Process(action)); @@ -649,7 +681,8 @@ static inline void TestRetrieveOutputDirectories(ApiFactory const& factory, // run action auto api = factory(); - Executor runner{api.get(), + Executor runner{repo_config, + api.get(), api.get(), RemoteExecutionConfig::PlatformProperties()}; CHECK_FALSE(runner.Process(action)); diff --git a/test/buildtool/execution_engine/executor/executor_api_local.test.cpp b/test/buildtool/execution_engine/executor/executor_api_local.test.cpp index 3f5f2ac9..f196e98b 100755 --- a/test/buildtool/execution_engine/executor/executor_api_local.test.cpp +++ b/test/buildtool/execution_engine/executor/executor_api_local.test.cpp @@ -13,6 +13,7 @@ // limitations under the License. #include "catch2/catch_test_macros.hpp" +#include "src/buildtool/common/repository_config.hpp" #include "src/buildtool/execution_api/local/local_api.hpp" #include "src/buildtool/execution_api/remote/config.hpp" #include "src/buildtool/execution_engine/executor/executor.hpp" @@ -22,29 +23,39 @@ TEST_CASE_METHOD(HermeticLocalTestFixture, "Executor<LocalApi>: Upload blob", "[executor]") { - TestBlobUpload([&] { return std::make_unique<LocalApi>(); }); + RepositoryConfig repo_config{}; + TestBlobUpload(&repo_config, + [&] { return std::make_unique<LocalApi>(&repo_config); }); } TEST_CASE_METHOD(HermeticLocalTestFixture, "Executor<LocalApi>: Compile hello world", "[executor]") { - TestHelloWorldCompilation([&] { return std::make_unique<LocalApi>(); }); + RepositoryConfig repo_config{}; + TestHelloWorldCompilation( + &repo_config, [&] { return std::make_unique<LocalApi>(&repo_config); }); } TEST_CASE_METHOD(HermeticLocalTestFixture, "Executor<LocalApi>: Compile greeter", "[executor]") { - TestGreeterCompilation([&] { return std::make_unique<LocalApi>(); }); + RepositoryConfig repo_config{}; + TestGreeterCompilation( + &repo_config, [&] { return std::make_unique<LocalApi>(&repo_config); }); } TEST_CASE_METHOD(HermeticLocalTestFixture, "Executor<LocalApi>: Upload and download trees", "[executor]") { - TestUploadAndDownloadTrees([&] { return std::make_unique<LocalApi>(); }); + RepositoryConfig repo_config{}; + TestUploadAndDownloadTrees( + &repo_config, [&] { return std::make_unique<LocalApi>(&repo_config); }); } TEST_CASE_METHOD(HermeticLocalTestFixture, "Executor<LocalApi>: Retrieve output directories", "[executor]") { - TestRetrieveOutputDirectories([&] { return std::make_unique<LocalApi>(); }); + RepositoryConfig repo_config{}; + TestRetrieveOutputDirectories( + &repo_config, [&] { return std::make_unique<LocalApi>(&repo_config); }); } diff --git a/test/buildtool/execution_engine/executor/executor_api_remote_bazel.test.cpp b/test/buildtool/execution_engine/executor/executor_api_remote_bazel.test.cpp index fb34749f..4df56ec2 100755 --- a/test/buildtool/execution_engine/executor/executor_api_remote_bazel.test.cpp +++ b/test/buildtool/execution_engine/executor/executor_api_remote_bazel.test.cpp @@ -13,28 +13,32 @@ // limitations under the License. #include "catch2/catch_test_macros.hpp" +#include "src/buildtool/common/repository_config.hpp" #include "src/buildtool/execution_api/remote/bazel/bazel_api.hpp" #include "src/buildtool/execution_api/remote/config.hpp" #include "src/buildtool/execution_engine/executor/executor.hpp" #include "test/buildtool/execution_engine/executor/executor_api.test.hpp" TEST_CASE("Executor<BazelApi>: Upload blob", "[executor]") { + RepositoryConfig repo_config{}; ExecutionConfiguration config; auto const& info = RemoteExecutionConfig::RemoteAddress(); - TestBlobUpload([&] { + TestBlobUpload(&repo_config, [&] { return BazelApi::Ptr{ new BazelApi{"remote-execution", info->host, info->port, config}}; }); } TEST_CASE("Executor<BazelApi>: Compile hello world", "[executor]") { + RepositoryConfig repo_config{}; ExecutionConfiguration config; config.skip_cache_lookup = false; auto const& info = RemoteExecutionConfig::RemoteAddress(); TestHelloWorldCompilation( + &repo_config, [&] { return BazelApi::Ptr{new BazelApi{ "remote-execution", info->host, info->port, config}}; @@ -43,12 +47,14 @@ TEST_CASE("Executor<BazelApi>: Compile hello world", "[executor]") { } TEST_CASE("Executor<BazelApi>: Compile greeter", "[executor]") { + RepositoryConfig repo_config{}; ExecutionConfiguration config; config.skip_cache_lookup = false; auto const& info = RemoteExecutionConfig::RemoteAddress(); TestGreeterCompilation( + &repo_config, [&] { return BazelApi::Ptr{new BazelApi{ "remote-execution", info->host, info->port, config}}; @@ -57,12 +63,14 @@ TEST_CASE("Executor<BazelApi>: Compile greeter", "[executor]") { } TEST_CASE("Executor<BazelApi>: Upload and download trees", "[executor]") { + RepositoryConfig repo_config{}; ExecutionConfiguration config; config.skip_cache_lookup = false; auto const& info = RemoteExecutionConfig::RemoteAddress(); TestUploadAndDownloadTrees( + &repo_config, [&] { return BazelApi::Ptr{new BazelApi{ "remote-execution", info->host, info->port, config}}; @@ -71,12 +79,14 @@ TEST_CASE("Executor<BazelApi>: Upload and download trees", "[executor]") { } TEST_CASE("Executor<BazelApi>: Retrieve output directories", "[executor]") { + RepositoryConfig repo_config{}; ExecutionConfiguration config; config.skip_cache_lookup = false; auto const& info = RemoteExecutionConfig::RemoteAddress(); TestRetrieveOutputDirectories( + &repo_config, [&] { return BazelApi::Ptr{new BazelApi{ "remote-execution", info->host, info->port, config}}; diff --git a/test/buildtool/graph_traverser/graph_traverser.test.hpp b/test/buildtool/graph_traverser/graph_traverser.test.hpp index 84b348e4..a7eeb1e0 100644 --- a/test/buildtool/graph_traverser/graph_traverser.test.hpp +++ b/test/buildtool/graph_traverser/graph_traverser.test.hpp @@ -80,6 +80,8 @@ class TestProject { return GenerateFromEntryPoints(*entry_points_json); } + auto GetRepoConfig() -> RepositoryConfig* { return &repo_config_; } + private: static inline std::filesystem::path const kOutputDirPrefix = FileSystemManager::GetCurrentDirectory() / "./tmp-"; @@ -90,11 +92,11 @@ class TestProject { "_entry_points"; std::string example_name_{}; std::filesystem::path root_dir_{}; + RepositoryConfig repo_config_{}; void SetupConfig() { auto info = RepositoryConfig::RepositoryInfo{FileRoot{root_dir_}}; - RepositoryConfig::Instance().Reset(); - RepositoryConfig::Instance().SetInfo("", std::move(info)); + repo_config_.SetInfo("", std::move(info)); } auto GenerateFromEntryPoints(nlohmann::json const& entry_points) @@ -127,7 +129,7 @@ class TestProject { TestProject p("hello_world_copy_message"); auto const clargs = p.CmdLineArgs(); - GraphTraverser const gt{clargs.gtargs}; + GraphTraverser const gt{clargs.gtargs, p.GetRepoConfig()}; auto const result = gt.BuildAndStage(clargs.graph_description, clargs.artifacts); @@ -146,7 +148,7 @@ class TestProject { SECTION("Executable is retrieved as executable") { auto const clargs_exec = p.CmdLineArgs("_entry_points_get_executable"); - GraphTraverser const gt_get_exec{clargs_exec.gtargs}; + GraphTraverser const gt_get_exec{clargs_exec.gtargs, p.GetRepoConfig()}; auto const exec_result = gt_get_exec.BuildAndStage( clargs_exec.graph_description, clargs_exec.artifacts); @@ -170,7 +172,7 @@ class TestProject { TestProject p("copy_local_file"); auto const clargs = p.CmdLineArgs(); - GraphTraverser const gt{clargs.gtargs}; + GraphTraverser const gt{clargs.gtargs, p.GetRepoConfig()}; auto const result = gt.BuildAndStage(clargs.graph_description, clargs.artifacts); @@ -189,7 +191,7 @@ class TestProject { TestProject p("sequence_printer_build_library_only"); auto const clargs = p.CmdLineArgs(); - GraphTraverser const gt{clargs.gtargs}; + GraphTraverser const gt{clargs.gtargs, p.GetRepoConfig()}; auto const result = gt.BuildAndStage(clargs.graph_description, clargs.artifacts); @@ -198,7 +200,8 @@ class TestProject { CHECK(FileSystemManager::IsFile(result->output_paths.at(0))); auto const clargs_full_build = p.CmdLineArgs("_entry_points_full_build"); - GraphTraverser const gt_full_build{clargs_full_build.gtargs}; + GraphTraverser const gt_full_build{clargs_full_build.gtargs, + p.GetRepoConfig()}; auto const full_build_result = gt_full_build.BuildAndStage( clargs_full_build.graph_description, clargs_full_build.artifacts); @@ -221,7 +224,8 @@ class TestProject { auto const clargs_update_cpp = full_hello_world.CmdLineArgs("_entry_points_upload_source"); - GraphTraverser const gt_upload{clargs_update_cpp.gtargs}; + GraphTraverser const gt_upload{clargs_update_cpp.gtargs, + full_hello_world.GetRepoConfig()}; auto const cpp_result = gt_upload.BuildAndStage( clargs_update_cpp.graph_description, clargs_update_cpp.artifacts); @@ -237,7 +241,7 @@ class TestProject { TestProject hello_world_known_cpp("hello_world_known_source"); auto const clargs = hello_world_known_cpp.CmdLineArgs(); - GraphTraverser const gt{clargs.gtargs}; + GraphTraverser const gt{clargs.gtargs, full_hello_world.GetRepoConfig()}; auto const result = gt.BuildAndStage(clargs.graph_description, clargs.artifacts); @@ -258,7 +262,7 @@ static void TestBlobsUploadedAndUsed(bool is_hermetic = true) { TestProject p("use_uploaded_blobs"); auto const clargs = p.CmdLineArgs(); - GraphTraverser gt{clargs.gtargs}; + GraphTraverser gt{clargs.gtargs, p.GetRepoConfig()}; auto const result = gt.BuildAndStage(clargs.graph_description, clargs.artifacts); @@ -284,7 +288,7 @@ static void TestEnvironmentVariablesSetAndUsed(bool is_hermetic = true) { TestProject p("use_env_variables"); auto const clargs = p.CmdLineArgs(); - GraphTraverser gt{clargs.gtargs}; + GraphTraverser gt{clargs.gtargs, p.GetRepoConfig()}; auto const result = gt.BuildAndStage(clargs.graph_description, clargs.artifacts); @@ -310,7 +314,7 @@ static void TestTreesUsed(bool is_hermetic = true) { TestProject p("use_trees"); auto const clargs = p.CmdLineArgs(); - GraphTraverser gt{clargs.gtargs}; + GraphTraverser gt{clargs.gtargs, p.GetRepoConfig()}; auto const result = gt.BuildAndStage(clargs.graph_description, clargs.artifacts); @@ -336,7 +340,7 @@ static void TestNestedTreesUsed(bool is_hermetic = true) { TestProject p("use_nested_trees"); auto const clargs = p.CmdLineArgs(); - GraphTraverser gt{clargs.gtargs}; + GraphTraverser gt{clargs.gtargs, p.GetRepoConfig()}; auto const result = gt.BuildAndStage(clargs.graph_description, clargs.artifacts); @@ -363,7 +367,7 @@ static void TestFlakyHelloWorldDetected(bool /*is_hermetic*/ = true) { { auto clargs = p.CmdLineArgs("_entry_points_ctimes"); - GraphTraverser const gt{clargs.gtargs}; + GraphTraverser const gt{clargs.gtargs, p.GetRepoConfig()}; auto const result = gt.BuildAndStage(clargs.graph_description, clargs.artifacts); @@ -377,7 +381,7 @@ static void TestFlakyHelloWorldDetected(bool /*is_hermetic*/ = true) { // make_exe[flaky]->make_output[miss] auto clargs_output = p.CmdLineArgs(); clargs_output.gtargs.rebuild = RebuildArguments{}; - GraphTraverser const gt_output{clargs_output.gtargs}; + GraphTraverser const gt_output{clargs_output.gtargs, p.GetRepoConfig()}; REQUIRE(gt_output.BuildAndStage(clargs_output.graph_description, clargs_output.artifacts)); CHECK(Statistics::Instance().ActionsFlakyCounter() == 1); @@ -388,7 +392,7 @@ static void TestFlakyHelloWorldDetected(bool /*is_hermetic*/ = true) { // make_exe[flaky]->make_output[miss]->strip_time [miss] auto clargs_stripped = p.CmdLineArgs("_entry_points_stripped"); clargs_stripped.gtargs.rebuild = RebuildArguments{}; - GraphTraverser const gt_stripped{clargs_stripped.gtargs}; + GraphTraverser const gt_stripped{clargs_stripped.gtargs, p.GetRepoConfig()}; REQUIRE(gt_stripped.BuildAndStage(clargs_stripped.graph_description, clargs_stripped.artifacts)); CHECK(Statistics::Instance().ActionsFlakyCounter() == 1); @@ -399,7 +403,7 @@ static void TestFlakyHelloWorldDetected(bool /*is_hermetic*/ = true) { // make_exe[flaky]->make_output[miss]->strip_time[miss]->list_ctimes [flaky] auto clargs_ctimes = p.CmdLineArgs("_entry_points_ctimes"); clargs_ctimes.gtargs.rebuild = RebuildArguments{}; - GraphTraverser const gt_ctimes{clargs_ctimes.gtargs}; + GraphTraverser const gt_ctimes{clargs_ctimes.gtargs, p.GetRepoConfig()}; REQUIRE(gt_ctimes.BuildAndStage(clargs_ctimes.graph_description, clargs_ctimes.artifacts)); CHECK(Statistics::Instance().ActionsFlakyCounter() == 2); |