summaryrefslogtreecommitdiff
path: root/src/other_tools/root_maps/root_utils.cpp
diff options
context:
space:
mode:
authorPaul Cristian Sarbu <paul.cristian.sarbu@huawei.com>2024-01-12 10:55:10 +0100
committerPaul Cristian Sarbu <paul.cristian.sarbu@huawei.com>2024-01-26 14:51:43 +0100
commit9942c2762695c57b92ad5e8f83e283a2d68f4d0b (patch)
tree0ea8ae7dfb590a9618841fd79dd9578e15c82f33 /src/other_tools/root_maps/root_utils.cpp
parentdebbc9dd20156b5ba94946c4cc2f689a8e163a2b (diff)
downloadjustbuild-9942c2762695c57b92ad5e8f83e283a2d68f4d0b.tar.gz
root_maps: Add utility library for handling absent roots sync
Diffstat (limited to 'src/other_tools/root_maps/root_utils.cpp')
-rw-r--r--src/other_tools/root_maps/root_utils.cpp76
1 files changed, 76 insertions, 0 deletions
diff --git a/src/other_tools/root_maps/root_utils.cpp b/src/other_tools/root_maps/root_utils.cpp
new file mode 100644
index 00000000..f9815d88
--- /dev/null
+++ b/src/other_tools/root_maps/root_utils.cpp
@@ -0,0 +1,76 @@
+// Copyright 2024 Huawei Cloud Computing Technology Co., Ltd.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "src/other_tools/root_maps/root_utils.hpp"
+
+#include "fmt/core.h"
+#include "src/buildtool/common/artifact.hpp"
+#include "src/buildtool/common/artifact_digest.hpp"
+#include "src/buildtool/common/repository_config.hpp"
+#include "src/buildtool/execution_api/git/git_api.hpp"
+#include "src/buildtool/file_system/object_type.hpp"
+#include "src/buildtool/serve_api/remote/serve_api.hpp"
+
+auto CheckServeHasAbsentRoot(std::string const& tree_id,
+ AsyncMapConsumerLoggerPtr const& logger)
+ -> std::optional<bool> {
+ if (auto has_tree = ServeApi::CheckRootTree(tree_id)) {
+ return *has_tree;
+ }
+ (*logger)(fmt::format("Checking that the serve endpoint knows tree "
+ "{} failed.",
+ tree_id),
+ /*fatal=*/true);
+ return std::nullopt;
+}
+
+auto EnsureAbsentRootOnServe(
+ std::string const& tree_id,
+ std::filesystem::path const& repo_path,
+ std::optional<gsl::not_null<IExecutionApi*>> const& remote_api,
+ AsyncMapConsumerLoggerPtr const& logger,
+ bool no_sync_is_fatal) -> bool {
+ if (remote_api) {
+ // upload tree to remote CAS
+ auto repo = RepositoryConfig{};
+ if (not repo.SetGitCAS(repo_path)) {
+ (*logger)(
+ fmt::format("Failed to SetGitCAS at {}", repo_path.string()),
+ /*fatal=*/true);
+ return false;
+ }
+ auto git_api = GitApi{&repo};
+ if (not git_api.RetrieveToCas(
+ {Artifact::ObjectInfo{
+ .digest = ArtifactDigest{tree_id, 0, /*is_tree=*/true},
+ .type = ObjectType::Tree}},
+ *remote_api)) {
+ (*logger)(fmt::format("Failed to sync tree {} from repository {}",
+ tree_id,
+ repo_path.string()),
+ /*fatal=*/true);
+ return false;
+ }
+ }
+ // ask serve endpoint to retrieve the uploaded tree
+ if (not ServeApi::GetTreeFromRemote(tree_id)) {
+ // respond based on no_sync_is_fatal flag
+ (*logger)(
+ fmt::format("Serve endpoint failed to sync root tree {}.", tree_id),
+ /*fatal=*/no_sync_is_fatal);
+ return not no_sync_is_fatal;
+ }
+ // done!
+ return true;
+}