summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/buildtool/build_engine/base_maps/TARGETS8
-rw-r--r--src/buildtool/build_engine/base_maps/directory_map.cpp19
-rw-r--r--src/buildtool/build_engine/base_maps/directory_map.hpp5
-rw-r--r--src/buildtool/build_engine/base_maps/entity_name.hpp16
-rw-r--r--src/buildtool/build_engine/base_maps/expression_map.cpp16
-rw-r--r--src/buildtool/build_engine/base_maps/expression_map.hpp2
-rw-r--r--src/buildtool/build_engine/base_maps/field_reader.hpp6
-rw-r--r--src/buildtool/build_engine/base_maps/json_file_map.hpp18
-rw-r--r--src/buildtool/build_engine/base_maps/rule_map.cpp47
-rw-r--r--src/buildtool/build_engine/base_maps/rule_map.hpp2
-rw-r--r--src/buildtool/build_engine/base_maps/source_map.cpp14
-rw-r--r--src/buildtool/build_engine/base_maps/source_map.hpp2
-rw-r--r--src/buildtool/build_engine/target_map/TARGETS4
-rw-r--r--src/buildtool/build_engine/target_map/absent_target_map.cpp23
-rw-r--r--src/buildtool/build_engine/target_map/absent_target_map.hpp2
-rw-r--r--src/buildtool/build_engine/target_map/built_in_rules.cpp72
-rw-r--r--src/buildtool/build_engine/target_map/built_in_rules.hpp2
-rw-r--r--src/buildtool/build_engine/target_map/export.cpp9
-rw-r--r--src/buildtool/build_engine/target_map/export.hpp2
-rw-r--r--src/buildtool/build_engine/target_map/target_map.cpp79
-rw-r--r--src/buildtool/build_engine/target_map/target_map.hpp2
-rw-r--r--src/buildtool/build_engine/target_map/utils.cpp8
-rw-r--r--src/buildtool/build_engine/target_map/utils.hpp2
-rw-r--r--src/buildtool/common/repository_config.hpp6
-rw-r--r--src/buildtool/execution_api/common/TARGETS3
-rw-r--r--src/buildtool/execution_api/common/create_execution_api.hpp6
-rw-r--r--src/buildtool/execution_api/git/git_api.hpp2
-rw-r--r--src/buildtool/execution_api/local/TARGETS1
-rw-r--r--src/buildtool/execution_api/local/local_api.hpp26
-rw-r--r--src/buildtool/execution_engine/executor/executor.hpp60
-rw-r--r--src/buildtool/graph_traverser/TARGETS1
-rw-r--r--src/buildtool/graph_traverser/graph_traverser.hpp30
-rw-r--r--src/buildtool/main/TARGETS6
-rw-r--r--src/buildtool/main/analyse.cpp23
-rw-r--r--src/buildtool/main/analyse.hpp2
-rw-r--r--src/buildtool/main/describe.cpp26
-rw-r--r--src/buildtool/main/describe.hpp10
-rw-r--r--src/buildtool/main/main.cpp52
-rw-r--r--src/buildtool/serve_api/remote/target_client.hpp1
-rw-r--r--src/buildtool/serve_api/serve_service/source_tree.hpp4
-rw-r--r--src/buildtool/serve_api/serve_service/target.hpp1
-rw-r--r--test/buildtool/build_engine/base_maps/TARGETS3
-rw-r--r--test/buildtool/build_engine/base_maps/directory_map.test.cpp13
-rw-r--r--test/buildtool/build_engine/base_maps/expression_map.test.cpp15
-rw-r--r--test/buildtool/build_engine/base_maps/json_file_map.test.cpp14
-rw-r--r--test/buildtool/build_engine/base_maps/rule_map.test.cpp21
-rw-r--r--test/buildtool/build_engine/base_maps/source_map.test.cpp17
-rw-r--r--test/buildtool/build_engine/target_map/target_map.test.cpp215
-rw-r--r--test/buildtool/common/repository_config.test.cpp12
-rw-r--r--test/buildtool/execution_api/local/TARGETS1
-rwxr-xr-xtest/buildtool/execution_api/local/local_execution.test.cpp16
-rw-r--r--test/buildtool/execution_engine/executor/TARGETS3
-rw-r--r--test/buildtool/execution_engine/executor/executor.test.cpp36
-rwxr-xr-xtest/buildtool/execution_engine/executor/executor_api.test.hpp113
-rwxr-xr-xtest/buildtool/execution_engine/executor/executor_api_local.test.cpp21
-rwxr-xr-xtest/buildtool/execution_engine/executor/executor_api_remote_bazel.test.cpp12
-rw-r--r--test/buildtool/graph_traverser/graph_traverser.test.hpp38
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);