summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Cristian Sarbu <paul.cristian.sarbu@huawei.com>2023-11-24 11:31:42 +0100
committerPaul Cristian Sarbu <paul.cristian.sarbu@huawei.com>2023-11-27 15:03:20 +0100
commitcf04253130030bc28866d10aa1f8fe1353643d42 (patch)
treeef7049624771866455105a8dab7b001840139701
parentbc09302c2772c979c45ecc716c36e4a70bb484ac (diff)
downloadjustbuild-cf04253130030bc28866d10aa1f8fe1353643d42.tar.gz
Refactoring RepositoryConfig
With the introduction of 'just serve', export targets can now be built also independently from one another based on their corresponding minimal repository configuration, as stored in the target cache key. In this context, this commit changes the RepositoryConfig usage from one global (static) instance to pointers passed as necessary throughout the code.
-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);