summaryrefslogtreecommitdiff
path: root/src/buildtool/serve_api/serve_service/source_tree.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/buildtool/serve_api/serve_service/source_tree.cpp')
-rw-r--r--src/buildtool/serve_api/serve_service/source_tree.cpp29
1 files changed, 27 insertions, 2 deletions
diff --git a/src/buildtool/serve_api/serve_service/source_tree.cpp b/src/buildtool/serve_api/serve_service/source_tree.cpp
index 7a4a8828..4eeadf3f 100644
--- a/src/buildtool/serve_api/serve_service/source_tree.cpp
+++ b/src/buildtool/serve_api/serve_service/source_tree.cpp
@@ -375,6 +375,7 @@ auto SourceTreeService::SyncArchive(std::string const& tree_id,
auto SourceTreeService::ResolveContentTree(
std::string const& tree_id,
std::filesystem::path const& repo_path,
+ bool repo_is_git_cache,
std::optional<PragmaSpecial> const& resolve_special,
bool sync_tree,
ServeArchiveTreeResponse* response) -> ::grpc::Status {
@@ -396,7 +397,26 @@ auto SourceTreeService::ResolveContentTree(
return SyncArchive(
*resolved_tree_id, repo_path, sync_tree, response);
}
- // resolve tree
+ // resolve tree; target repository is always the Git cache
+ auto target_cas = GitCAS::Open(StorageConfig::GitRoot());
+ if (not target_cas) {
+ auto str = fmt::format("Failed to open Git ODB at {}",
+ StorageConfig::GitRoot().string());
+ logger_->Emit(LogLevel::Error, str);
+ response->set_status(ServeArchiveTreeResponse::INTERNAL_ERROR);
+ return ::grpc::Status::OK;
+ }
+ auto source_cas = target_cas;
+ if (not repo_is_git_cache) {
+ source_cas = GitCAS::Open(repo_path);
+ if (not source_cas) {
+ auto str = fmt::format("Failed to open Git ODB at {}",
+ repo_path.string());
+ logger_->Emit(LogLevel::Error, str);
+ response->set_status(ServeArchiveTreeResponse::INTERNAL_ERROR);
+ return ::grpc::Status::OK;
+ }
+ }
ResolvedGitObject resolved_tree{};
bool failed{false};
{
@@ -406,7 +426,9 @@ auto SourceTreeService::ResolveContentTree(
{GitObjectToResolve{tree_id,
".",
*resolve_special,
- /*known_info=*/std::nullopt}},
+ /*known_info=*/std::nullopt,
+ source_cas,
+ target_cas}},
[&resolved_tree](auto hashes) { resolved_tree = *hashes[0]; },
[logger = logger_, tree_id, &failed](auto const& msg,
bool fatal) {
@@ -625,6 +647,7 @@ auto SourceTreeService::ArchiveImportToGit(
}
return ResolveContentTree(*subtree_id,
StorageConfig::GitRoot(),
+ /*repo_is_git_cache=*/true,
resolve_special,
sync_tree,
response);
@@ -689,6 +712,7 @@ auto SourceTreeService::ServeArchiveTree(
if (std::holds_alternative<std::string>(res)) {
return ResolveContentTree(std::get<std::string>(res), // tree_id
StorageConfig::GitRoot(),
+ /*repo_is_git_cache=*/true,
resolve_special,
request->sync_tree(),
response);
@@ -709,6 +733,7 @@ auto SourceTreeService::ServeArchiveTree(
return ResolveContentTree(
std::get<std::string>(res), // tree_id
path,
+ /*repo_is_git_cache=*/false,
resolve_special,
request->sync_tree(),
response);