diff options
Diffstat (limited to 'src/other_tools')
-rw-r--r-- | src/other_tools/git_operations/TARGETS | 1 | ||||
-rw-r--r-- | src/other_tools/git_operations/git_repo_remote.cpp | 27 | ||||
-rw-r--r-- | src/other_tools/git_operations/git_repo_remote.hpp | 16 | ||||
-rw-r--r-- | src/other_tools/ops_maps/TARGETS | 1 | ||||
-rw-r--r-- | src/other_tools/ops_maps/git_tree_fetch_map.cpp | 32 | ||||
-rw-r--r-- | src/other_tools/ops_maps/git_update_map.cpp | 12 | ||||
-rw-r--r-- | src/other_tools/ops_maps/import_to_git_map.cpp | 12 | ||||
-rw-r--r-- | src/other_tools/root_maps/commit_git_map.cpp | 21 |
8 files changed, 40 insertions, 82 deletions
diff --git a/src/other_tools/git_operations/TARGETS b/src/other_tools/git_operations/TARGETS index dba6fc18..1cd49035 100644 --- a/src/other_tools/git_operations/TARGETS +++ b/src/other_tools/git_operations/TARGETS @@ -36,6 +36,7 @@ , ["@", "json", "", "json"] , ["src/buildtool/system", "system_command"] , "git_config_settings" + , ["src/utils/cpp", "tmp_dir"] ] } , "git_config_settings": 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."), diff --git a/src/other_tools/git_operations/git_repo_remote.hpp b/src/other_tools/git_operations/git_repo_remote.hpp index 614e7822..c59fb48e 100644 --- a/src/other_tools/git_operations/git_repo_remote.hpp +++ b/src/other_tools/git_operations/git_repo_remote.hpp @@ -82,15 +82,11 @@ class GitRepoRemote : public GitRepo { /// \brief Get commit from given branch on the remote. If URL is SSH, shells /// out to system git to perform an ls-remote call, ensuring correct /// handling of the remote connection settings (in particular proxy and - /// SSH). A temporary directory is needed to pipe the stdout and stderr to. - /// If URL is non-SSH, uses tmp dir to connect to remote and retrieve the - /// commit of a branch asynchronously using libgit2. - /// Caller needs to make sure the temporary directory exists and that the - /// given path is thread- and process-safe! + /// SSH). For non-SSH URLs, the branch commit is retrieved asynchronously + /// using libgit2. /// Returns the commit hash, as a string, or nullopt if failure. /// It guarantees the logger is called exactly once with fatal if failure. [[nodiscard]] auto UpdateCommitViaTmpRepo( - std::filesystem::path const& tmp_dir, std::string const& repo_url, std::string const& branch, std::vector<std::string> const& inherit_env, @@ -101,16 +97,12 @@ class GitRepoRemote : public GitRepo { /// \brief Fetch from a remote. If URL is SSH, shells out to system git to /// retrieve packs in a safe manner, with the only side-effect being that - /// there can be some redundancy in the fetched packs. The tmp dir is used - /// to pipe the stdout and stderr to. - /// If URL is non-SSH, uses tmp dir to fetch asynchronously using libgit2. - /// Caller needs to make sure the temporary directory exists and that the - /// given path is thread- and process-safe! + /// there can be some redundancy in the fetched packs. + /// For non-SSH URLs an asynchronous fetch is performed using libgit2. /// Uses either a given branch, or fetches all (with base refspecs). /// Returns a success flag. /// It guarantees the logger is called exactly once with fatal if failure. [[nodiscard]] auto FetchViaTmpRepo( - std::filesystem::path const& tmp_dir, std::string const& repo_url, std::optional<std::string> const& branch, std::vector<std::string> const& inherit_env, diff --git a/src/other_tools/ops_maps/TARGETS b/src/other_tools/ops_maps/TARGETS index 41f73000..4a15849f 100644 --- a/src/other_tools/ops_maps/TARGETS +++ b/src/other_tools/ops_maps/TARGETS @@ -48,7 +48,6 @@ [ ["@", "fmt", "", "fmt"] , ["src/buildtool/execution_api/local", "config"] , ["src/buildtool/storage", "fs_utils"] - , ["src/utils/cpp", "tmp_dir"] , ["src/other_tools/just_mr/progress_reporting", "statistics"] , ["src/other_tools/just_mr/progress_reporting", "progress"] ] diff --git a/src/other_tools/ops_maps/git_tree_fetch_map.cpp b/src/other_tools/ops_maps/git_tree_fetch_map.cpp index 38e25606..423808cc 100644 --- a/src/other_tools/ops_maps/git_tree_fetch_map.cpp +++ b/src/other_tools/ops_maps/git_tree_fetch_map.cpp @@ -419,7 +419,6 @@ auto CreateGitTreeFetchMap( fatal); }); if (not just_git_repo->FetchViaTmpRepo( - tmp_dir->GetPath(), target_path.string(), std::nullopt, key.inherit_env, @@ -454,12 +453,8 @@ auto CreateGitTreeFetchMap( critical_git_op_map->ConsumeAfterKeysReady( ts, {std::move(op_key)}, - [tmp_dir, // keep tmp_dir alive - remote_api, - backup_to_remote, - key, - setter, - logger](auto const& values) { + [remote_api, backup_to_remote, key, setter, logger]( + auto const& values) { GitOpValue op_result = *values[0]; // check flag if (not op_result.result) { @@ -477,28 +472,21 @@ auto CreateGitTreeFetchMap( // success (*setter)(false /*no cache hit*/); }, - [logger, - commit = *op_result.result, - target_path = tmp_dir->GetPath()](auto const& msg, - bool fatal) { + [logger, commit = *op_result.result]( + auto const& msg, bool fatal) { (*logger)( fmt::format("While running critical Git op " - "KEEP_TAG for commit {} in " - "target {}:\n{}", + "KEEP_TAG for commit {}:\n{}", commit, - target_path.string(), msg), fatal); }); }, - [logger, target_path = tmp_dir->GetPath()](auto const& msg, - bool fatal) { - (*logger)( - fmt::format("While running critical Git op " - "INITIAL_COMMIT for target {}:\n{}", - target_path.string(), - msg), - fatal); + [logger](auto const& msg, bool fatal) { + (*logger)(fmt::format("While running critical Git op " + "INITIAL_COMMIT:\n{}", + msg), + fatal); }); }, [logger, target_path = StorageConfig::GitRoot()](auto const& msg, diff --git a/src/other_tools/ops_maps/git_update_map.cpp b/src/other_tools/ops_maps/git_update_map.cpp index 0ce9de49..9886b84b 100644 --- a/src/other_tools/ops_maps/git_update_map.cpp +++ b/src/other_tools/ops_maps/git_update_map.cpp @@ -19,7 +19,6 @@ #include "src/buildtool/storage/fs_utils.hpp" #include "src/other_tools/just_mr/progress_reporting/progress.hpp" #include "src/other_tools/just_mr/progress_reporting/statistics.hpp" -#include "src/utils/cpp/tmp_dir.hpp" auto CreateGitUpdateMap(GitCASPtr const& git_cas, std::string const& git_bin, @@ -39,14 +38,6 @@ auto CreateGitUpdateMap(GitCASPtr const& git_cas, /*fatal=*/true); return; } - auto tmp_dir = StorageUtils::CreateTypedTmpDir("update"); - if (not tmp_dir) { - (*logger)(fmt::format("Failed to create commit update tmp dir for " - "remote {}", - key.repo), - /*fatal=*/true); - return; - } // setup wrapped logger auto wrapped_logger = std::make_shared<AsyncMapConsumerLogger>( [logger](auto const& msg, bool fatal) { @@ -57,8 +48,7 @@ auto CreateGitUpdateMap(GitCASPtr const& git_cas, // update commit auto id = fmt::format("{}:{}", key.repo, key.branch); JustMRProgress::Instance().TaskTracker().Start(id); - auto new_commit = git_repo->UpdateCommitViaTmpRepo(tmp_dir->GetPath(), - key.repo, + auto new_commit = git_repo->UpdateCommitViaTmpRepo(key.repo, key.branch, key.inherit_env, git_bin, diff --git a/src/other_tools/ops_maps/import_to_git_map.cpp b/src/other_tools/ops_maps/import_to_git_map.cpp index 4051cb01..991fc369 100644 --- a/src/other_tools/ops_maps/import_to_git_map.cpp +++ b/src/other_tools/ops_maps/import_to_git_map.cpp @@ -167,17 +167,6 @@ auto CreateImportToGitMap( /*fatal=*/true); return; } - // create tmp directory - auto tmp_dir = - StorageUtils::CreateTypedTmpDir("import-to-git"); - if (not tmp_dir) { - (*logger)( - fmt::format("Could not create unique path " - "for target {}", - target_path.string()), - /*fatal=*/true); - return; - } auto wrapped_logger = std::make_shared<AsyncMapConsumerLogger>( [logger, target_path](auto const& msg, @@ -190,7 +179,6 @@ auto CreateImportToGitMap( fatal); }); if (not just_git_repo->FetchViaTmpRepo( - tmp_dir->GetPath(), target_path.string(), std::nullopt, std::vector<std::string>{} /* XXX */, diff --git a/src/other_tools/root_maps/commit_git_map.cpp b/src/other_tools/root_maps/commit_git_map.cpp index d97f33be..a64ccc49 100644 --- a/src/other_tools/root_maps/commit_git_map.cpp +++ b/src/other_tools/root_maps/commit_git_map.cpp @@ -29,7 +29,6 @@ #include "src/other_tools/just_mr/progress_reporting/statistics.hpp" #include "src/other_tools/root_maps/root_utils.hpp" #include "src/other_tools/utils/curl_url_handle.hpp" -#include "src/utils/cpp/tmp_dir.hpp" namespace { @@ -224,13 +223,6 @@ void NetworkFetchAndSetPresentRoot( return; } - // default to fetching from network - auto tmp_dir = StorageUtils::CreateTypedTmpDir("fetch"); - if (not tmp_dir) { - (*logger)("Failed to create fetch tmp directory!", - /*fatal=*/true); - return; - } // store failed attempts for subsequent logging bool fetched{false}; std::string err_messages{}; @@ -251,8 +243,7 @@ void NetworkFetchAndSetPresentRoot( mirror, msg); }); - if (git_repo->FetchViaTmpRepo(tmp_dir->GetPath(), - mirror, + if (git_repo->FetchViaTmpRepo(mirror, repo_info.branch, repo_info.inherit_env, git_bin, @@ -284,8 +275,7 @@ void NetworkFetchAndSetPresentRoot( *preferred_url, msg); }); - if (git_repo->FetchViaTmpRepo(tmp_dir->GetPath(), - *preferred_url, + if (git_repo->FetchViaTmpRepo(*preferred_url, repo_info.branch, repo_info.inherit_env, git_bin, @@ -316,8 +306,7 @@ void NetworkFetchAndSetPresentRoot( fetch_repo, msg); }); - if (git_repo->FetchViaTmpRepo(tmp_dir->GetPath(), - fetch_repo, + if (git_repo->FetchViaTmpRepo(fetch_repo, repo_info.branch, repo_info.inherit_env, git_bin, @@ -352,7 +341,6 @@ void NetworkFetchAndSetPresentRoot( msg); }); if (git_repo->FetchViaTmpRepo( - tmp_dir->GetPath(), *preferred_mirror, repo_info.branch, repo_info.inherit_env, @@ -386,8 +374,7 @@ void NetworkFetchAndSetPresentRoot( mirror, msg); }); - if (git_repo->FetchViaTmpRepo(tmp_dir->GetPath(), - mirror, + if (git_repo->FetchViaTmpRepo(mirror, repo_info.branch, repo_info.inherit_env, git_bin, |