summaryrefslogtreecommitdiff
path: root/src/other_tools/git_operations/git_repo_remote.cpp
diff options
context:
space:
mode:
authorOliver Reiche <oliver.reiche@huawei.com>2024-02-23 18:51:51 +0100
committerOliver Reiche <oliver.reiche@huawei.com>2024-03-08 14:16:45 +0100
commit2ebf355989eb92ac9967eceee0af14d39477afe0 (patch)
treedb993f8df39eb05b625b2c4590f1e5696b2e7b04 /src/other_tools/git_operations/git_repo_remote.cpp
parentc512ae174920ada425e2b33d0fea24891d6305bd (diff)
downloadjustbuild-2ebf355989eb92ac9967eceee0af14d39477afe0.tar.gz
just-mr: Fix shell out execution
... by avoiding reusing temp dirs for execute. While we are at it, also refactor LocalFetchViaTmpRepo() to create its own empty temp dirs, that cannot be reused by the caller.
Diffstat (limited to 'src/other_tools/git_operations/git_repo_remote.cpp')
-rw-r--r--src/other_tools/git_operations/git_repo_remote.cpp27
1 files changed, 20 insertions, 7 deletions
diff --git a/src/other_tools/git_operations/git_repo_remote.cpp b/src/other_tools/git_operations/git_repo_remote.cpp
index 2a434928..f3964e74 100644
--- a/src/other_tools/git_operations/git_repo_remote.cpp
+++ b/src/other_tools/git_operations/git_repo_remote.cpp
@@ -20,6 +20,7 @@
#include "src/buildtool/logging/logger.hpp"
#include "src/buildtool/system/system_command.hpp"
#include "src/other_tools/git_operations/git_config_settings.hpp"
+#include "src/utils/cpp/tmp_dir.hpp"
extern "C" {
#include <git2.h>
@@ -392,7 +393,6 @@ auto GitRepoRemote::FetchFromRemote(std::shared_ptr<git_config> cfg,
}
auto GitRepoRemote::UpdateCommitViaTmpRepo(
- std::filesystem::path const& tmp_dir,
std::string const& repo_url,
std::string const& branch,
std::vector<std::string> const& inherit_env,
@@ -401,6 +401,13 @@ auto GitRepoRemote::UpdateCommitViaTmpRepo(
anon_logger_ptr const& logger) const noexcept
-> std::optional<std::string> {
try {
+ auto tmp_dir = TmpDir::Create("update");
+ if (not tmp_dir) {
+ (*logger)("Failed to create temp dir for running 'git ls-remote'",
+ /*fatal=*/true);
+ return std::nullopt;
+ }
+ auto const& tmp_path = tmp_dir->GetPath();
// check for internally supported protocols
if (IsSupported(repo_url)) {
// preferably with a "fake" repository!
@@ -410,7 +417,7 @@ auto GitRepoRemote::UpdateCommitViaTmpRepo(
}
// create the temporary real repository
auto tmp_repo =
- GitRepoRemote::InitAndOpen(tmp_dir, /*is_bare=*/true);
+ GitRepoRemote::InitAndOpen(tmp_path / "git", /*is_bare=*/true);
if (tmp_repo == std::nullopt) {
return std::nullopt;
}
@@ -456,7 +463,7 @@ auto GitRepoRemote::UpdateCommitViaTmpRepo(
system.Execute(cmdline,
env,
GetGitPath(), // which path is not actually relevant
- tmp_dir);
+ tmp_path);
if (not command_output) {
(*logger)(fmt::format("exec() on command failed."),
@@ -522,8 +529,7 @@ auto GitRepoRemote::UpdateCommitViaTmpRepo(
}
}
-auto GitRepoRemote::FetchViaTmpRepo(std::filesystem::path const& tmp_dir,
- std::string const& repo_url,
+auto GitRepoRemote::FetchViaTmpRepo(std::string const& repo_url,
std::optional<std::string> const& branch,
std::vector<std::string> const& inherit_env,
std::string const& git_bin,
@@ -531,6 +537,13 @@ auto GitRepoRemote::FetchViaTmpRepo(std::filesystem::path const& tmp_dir,
anon_logger_ptr const& logger) noexcept
-> bool {
try {
+ auto tmp_dir = TmpDir::Create("fetch");
+ if (not tmp_dir) {
+ (*logger)("Failed to create temp dir for running 'git fetch'",
+ /*fatal=*/true);
+ return false;
+ }
+ auto const& tmp_path = tmp_dir->GetPath();
// check for internally supported protocols
if (IsSupported(repo_url)) {
// preferably with a "fake" repository!
@@ -542,7 +555,7 @@ auto GitRepoRemote::FetchViaTmpRepo(std::filesystem::path const& tmp_dir,
// it can be bare, as the refspecs for this fetch will be given
// explicitly.
auto tmp_repo =
- GitRepoRemote::InitAndOpen(tmp_dir, /*is_bare=*/true);
+ GitRepoRemote::InitAndOpen(tmp_path / "git", /*is_bare=*/true);
if (tmp_repo == std::nullopt) {
return false;
}
@@ -606,7 +619,7 @@ auto GitRepoRemote::FetchViaTmpRepo(std::filesystem::path const& tmp_dir,
// run command
SystemCommand system{repo_url};
auto const command_output =
- system.Execute(cmdline, env, GetGitPath(), tmp_dir);
+ system.Execute(cmdline, env, GetGitPath(), tmp_path);
if (not command_output) {
(*logger)(fmt::format("exec() on command failed."),