From f0f95b7cf06b3d4c2848a4715766a330d1d71d4f Mon Sep 17 00:00:00 2001 From: Paul Cristian Sarbu Date: Wed, 31 Aug 2022 15:29:16 +0200 Subject: Just-MR: Add git commit update map --- src/other_tools/ops_maps/git_update_map.cpp | 64 +++++++++++++++++++++++++++++ 1 file changed, 64 insertions(+) create mode 100644 src/other_tools/ops_maps/git_update_map.cpp (limited to 'src/other_tools/ops_maps/git_update_map.cpp') diff --git a/src/other_tools/ops_maps/git_update_map.cpp b/src/other_tools/ops_maps/git_update_map.cpp new file mode 100644 index 00000000..b1172084 --- /dev/null +++ b/src/other_tools/ops_maps/git_update_map.cpp @@ -0,0 +1,64 @@ +// Copyright 2022 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/ops_maps/git_update_map.hpp" + +#include "fmt/core.h" +#include "src/buildtool/execution_api/local/config.hpp" +#include "src/other_tools/just_mr/utils.hpp" +#include "src/utils/cpp/tmp_dir.hpp" + +auto CreateGitUpdateMap(GitCASPtr const& git_cas, std::size_t jobs) + -> GitUpdateMap { + auto update_commits = [git_cas](auto /* unused */, + auto setter, + auto logger, + auto /* unused */, + auto const& key) { + // perform git update commit + auto git_repo = GitRepo::Open(git_cas); // wrap the tmp odb + if (not git_repo) { + (*logger)( + fmt::format("Failed to open tmp Git repository for remote {}", + key.first), + /*fatal=*/true); + return; + } + auto tmp_dir = JustMR::Utils::CreateTypedTmpDir("update"); + if (not tmp_dir) { + (*logger)(fmt::format("Failed to create commit update tmp dir for " + "remote {}", + key.first), + /*fatal=*/true); + return; + } + // setup wrapped logger + auto wrapped_logger = std::make_shared( + [&logger](auto const& msg, bool fatal) { + (*logger)( + fmt::format("While updating commit via tmp repo:\n{}", msg), + fatal); + }); + // update commit + auto refname = std::string("refs/heads/") + + key.second; // assume branch ref format + auto new_commit = git_repo->UpdateCommitViaTmpRepo( + tmp_dir->GetPath(), key.first, refname, wrapped_logger); + if (not new_commit) { + return; + } + (*setter)(new_commit->c_str()); + }; + return AsyncMapConsumer(update_commits, jobs); +} -- cgit v1.2.3