summaryrefslogtreecommitdiff
path: root/src/buildtool/main/main.cpp
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 /src/buildtool/main/main.cpp
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.
Diffstat (limited to 'src/buildtool/main/main.cpp')
-rw-r--r--src/buildtool/main/main.cpp52
1 files changed, 32 insertions, 20 deletions
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);