diff options
author | Paul Cristian Sarbu <paul.cristian.sarbu@huawei.com> | 2025-05-26 14:46:25 +0200 |
---|---|---|
committer | Paul Cristian Sarbu <paul.cristian.sarbu@huawei.com> | 2025-06-04 14:34:44 +0200 |
commit | 811e9be4cc9604dba3d768639444c0d9f849a3c7 (patch) | |
tree | 15460350b2554be422b76c0cc817a4e5d8a1421e /src/buildtool | |
parent | 8d4f583d63c657397583f778096b8bcb6d96c12f (diff) | |
download | justbuild-811e9be4cc9604dba3d768639444c0d9f849a3c7.tar.gz |
RepositoryConfig: Give access to a persistent storage config...
...whenever it is given access to a Git repository.
The referenced storage config needs to outlive the repository
config instance.
Diffstat (limited to 'src/buildtool')
-rw-r--r-- | src/buildtool/common/TARGETS | 1 | ||||
-rw-r--r-- | src/buildtool/common/repository_config.hpp | 4 | ||||
-rw-r--r-- | src/buildtool/main/main.cpp | 2 | ||||
-rw-r--r-- | src/buildtool/serve_api/remote/serve_api.cpp | 4 | ||||
-rw-r--r-- | src/buildtool/serve_api/serve_service/source_tree.cpp | 2 | ||||
-rw-r--r-- | src/buildtool/tree_structure/tree_structure_utils.cpp | 6 | ||||
-rw-r--r-- | src/buildtool/tree_structure/tree_structure_utils.hpp | 2 |
7 files changed, 17 insertions, 4 deletions
diff --git a/src/buildtool/common/TARGETS b/src/buildtool/common/TARGETS index 469f074f..f324d767 100644 --- a/src/buildtool/common/TARGETS +++ b/src/buildtool/common/TARGETS @@ -189,6 +189,7 @@ , ["src/buildtool/file_system", "precomputed_root"] , ["src/buildtool/logging", "log_level"] , ["src/buildtool/multithreading", "atomic_value"] + , ["src/buildtool/storage", "config"] , ["src/buildtool/storage", "storage"] ] , "stage": ["src", "buildtool", "common"] diff --git a/src/buildtool/common/repository_config.hpp b/src/buildtool/common/repository_config.hpp index 68023b8e..1a2f5be1 100644 --- a/src/buildtool/common/repository_config.hpp +++ b/src/buildtool/common/repository_config.hpp @@ -34,6 +34,7 @@ #include "src/buildtool/file_system/precomputed_root.hpp" #include "src/buildtool/logging/log_level.hpp" #include "src/buildtool/multithreading/atomic_value.hpp" +#include "src/buildtool/storage/config.hpp" #include "src/buildtool/storage/storage.hpp" class RepositoryConfig { @@ -64,7 +65,9 @@ class RepositoryConfig { [[nodiscard]] auto SetGitCAS( std::filesystem::path const& repo_path, + gsl::not_null<StorageConfig const*> const& storage_config, LogLevel log_level = LogLevel::Warning) noexcept -> bool { + storage_config_ = storage_config; git_cas_ = GitCAS::Open(repo_path, log_level); return static_cast<bool>(git_cas_); } @@ -181,6 +184,7 @@ class RepositoryConfig { std::unordered_map<std::string, RepositoryData> repos_; GitCASPtr git_cas_; + StorageConfig const* storage_config_ = nullptr; AtomicValue<duplicates_t> duplicates_; template <class T> diff --git a/src/buildtool/main/main.cpp b/src/buildtool/main/main.cpp index c1b8bcdf..2487a37f 100644 --- a/src/buildtool/main/main.cpp +++ b/src/buildtool/main/main.cpp @@ -1020,6 +1020,7 @@ auto main(int argc, char* argv[]) -> int { if (arguments.cmd == SubCommand::kInstallCas) { if (not repo_config.SetGitCAS(storage_config->GitRoot(), + &(*storage_config), LogLevel::Trace)) { Logger::Log(LogLevel::Debug, "Failed set Git CAS {}.", @@ -1082,6 +1083,7 @@ auto main(int argc, char* argv[]) -> int { return kExitSyntaxError; } if (not repo_config.SetGitCAS(*arguments.graph.git_cas, + &(*storage_config), LogLevel::Debug)) { Logger::Log(LogLevel::Warning, "Failed set Git CAS {}.", diff --git a/src/buildtool/serve_api/remote/serve_api.cpp b/src/buildtool/serve_api/remote/serve_api.cpp index 107f4439..44755820 100644 --- a/src/buildtool/serve_api/remote/serve_api.cpp +++ b/src/buildtool/serve_api/remote/serve_api.cpp @@ -35,8 +35,10 @@ auto ServeApi::UploadTree(ArtifactDigest const& tree, fmt::format("Not a git tree: {}", tree.hash()), not kIsSyncError}}; } + // Set up the repository config; compatibility of used storage instance is + // irrelevant here, as only the build root path info is needed. RepositoryConfig repo; - if (not repo.SetGitCAS(git_repo)) { + if (not repo.SetGitCAS(git_repo, &storage_config_)) { return unexpected{UploadError{ fmt::format("Failed to SetGitCAS at {}", git_repo.string()), not kIsSyncError}}; diff --git a/src/buildtool/serve_api/serve_service/source_tree.cpp b/src/buildtool/serve_api/serve_service/source_tree.cpp index 7ffe176e..35d5797a 100644 --- a/src/buildtool/serve_api/serve_service/source_tree.cpp +++ b/src/buildtool/serve_api/serve_service/source_tree.cpp @@ -370,7 +370,7 @@ auto SourceTreeService::SyncGitEntryToCas( } auto repo = RepositoryConfig{}; - if (not repo.SetGitCAS(repo_path)) { + if (not repo.SetGitCAS(repo_path, native_context_->storage_config)) { logger_->Emit( LogLevel::Error, "Failed to SetGitCAS at {}", repo_path.string()); return TResponse::INTERNAL_ERROR; diff --git a/src/buildtool/tree_structure/tree_structure_utils.cpp b/src/buildtool/tree_structure/tree_structure_utils.cpp index f09d627b..758e47fc 100644 --- a/src/buildtool/tree_structure/tree_structure_utils.cpp +++ b/src/buildtool/tree_structure/tree_structure_utils.cpp @@ -208,6 +208,7 @@ auto TreeStructureUtils::ImportToGit( auto TreeStructureUtils::ExportFromGit( ArtifactDigest const& tree, std::vector<std::filesystem::path> const& source_repos, + StorageConfig const& storage_config, IExecutionApi const& target_api) noexcept -> expected<bool, std::string> { if (not tree.IsTree() or not ProtocolTraits::IsNative(tree.GetHashType())) { return unexpected{fmt::format("Not a git tree: {}", tree.hash())}; @@ -231,7 +232,7 @@ auto TreeStructureUtils::ExportFromGit( } RepositoryConfig repo_config{}; - if (not repo_config.SetGitCAS(*repo)) { + if (not repo_config.SetGitCAS(*repo, &storage_config)) { return unexpected{ fmt::format("Failed to set git cas at {}", repo->string())}; } @@ -276,7 +277,8 @@ auto TreeStructureUtils::ComputeStructureLocally( // If the tree is not in the storage, it must be present in git: if (not storage.CAS().TreePath(tree).has_value()) { - auto in_cas = ExportFromGit(tree, known_repositories, local_api); + auto in_cas = + ExportFromGit(tree, known_repositories, storage_config, local_api); if (not in_cas.has_value()) { return unexpected{ fmt::format("While exporting {} from git to CAS:\n{}", diff --git a/src/buildtool/tree_structure/tree_structure_utils.hpp b/src/buildtool/tree_structure/tree_structure_utils.hpp index 7cecf7f8..93615cf0 100644 --- a/src/buildtool/tree_structure/tree_structure_utils.hpp +++ b/src/buildtool/tree_structure/tree_structure_utils.hpp @@ -67,12 +67,14 @@ class TreeStructureUtils final { /// regular GitApi for retrieval from git and doesn't perform rehashing. /// \param tree Tree to export /// \param source_repos Repositories to check + /// \param storage_config Storage to use for lookups /// \param target_api Api to export the tree to /// \return True if target api contains tree after the call, false if none /// of source repositories contain tree, or an error message on failure. [[nodiscard]] static auto ExportFromGit( ArtifactDigest const& tree, std::vector<std::filesystem::path> const& source_repos, + StorageConfig const& storage_config, IExecutionApi const& target_api) noexcept -> expected<bool, std::string>; |