From 565be5e97ded644142f47b8b9dfaf6cc44d60b18 Mon Sep 17 00:00:00 2001 From: Simon Quigley Date: Sat, 25 Jan 2025 22:55:19 -0600 Subject: [PATCH] Attempt to add repo clone/fetch progress to the log --- cpp/ci_logic.cpp | 36 +++++++++++++++++++++++++++++++++++- 1 file changed, 35 insertions(+), 1 deletion(-) diff --git a/cpp/ci_logic.cpp b/cpp/ci_logic.cpp index 5fe43b3..b202992 100644 --- a/cpp/ci_logic.cpp +++ b/cpp/ci_logic.cpp @@ -395,6 +395,23 @@ static int submodule_trampoline(git_submodule* sm, const char* name, void* paylo return (*callback)(sm, name, payload); } +static int progress_cb(const git_indexer_progress *stats, void *payload) { + if (stats->total_objects == 0) return 0; + + // Calculate percentage + int pct = static_cast((static_cast(stats->received_objects) / stats->total_objects) * 100); + // 0 <= pct <= 100 + if (pct > 100) pct = 100; + if (pct < 0) pct = 0; + std::string progress_str = (pct < 10 ? "0" : "") + std::to_string(pct) + "%"; + + // Cast payload back to shared_ptr and append the percentage + auto log = static_cast*>(payload); + (*log)->append(progress_str); + + return 0; +} + /** * clone_or_fetch: clone if needed, else fetch */ @@ -414,6 +431,13 @@ void CiLogic::clone_or_fetch(const std::filesystem::path &repo_dir, opts.checkout_branch = branch->c_str(); } + git_remote_callbacks callbacks = GIT_REMOTE_CALLBACKS_INIT; + callbacks.transfer_progress = progress_cb; + callbacks.payload = &log; + git_fetch_options fetch_opts = GIT_FETCH_OPTIONS_INIT; + fetch_opts.callbacks = callbacks; + opts.fetch_opts = fetch_opts; + opts.checkout_opts.checkout_strategy |= GIT_CHECKOUT_UPDATE_SUBMODULES; error = git_clone(&repo, repo_url.c_str(), repo_dir.c_str(), &opts); @@ -433,7 +457,13 @@ void CiLogic::clone_or_fetch(const std::filesystem::path &repo_dir, std::string(e && e->message ? e->message : "unknown")); } - if (git_remote_fetch(remote, nullptr, nullptr, nullptr) < 0) { + git_remote_callbacks callbacks = GIT_REMOTE_CALLBACKS_INIT; + callbacks.transfer_progress = progress_cb; + callbacks.payload = &log; + git_fetch_options fetch_opts = GIT_FETCH_OPTIONS_INIT; + fetch_opts.callbacks = callbacks; + + if (git_remote_fetch(remote, nullptr, &fetch_opts, nullptr) < 0) { const git_error *e = git_error_last(); git_remote_free(remote); git_repository_free(repo); @@ -557,8 +587,12 @@ void CiLogic::clone_or_fetch(const std::filesystem::path &repo_dir, // Set up update options git_submodule_update_options opts = GIT_SUBMODULE_UPDATE_OPTIONS_INIT; + git_remote_callbacks callbacks = GIT_REMOTE_CALLBACKS_INIT; + callbacks.transfer_progress = progress_cb; + callbacks.payload = &log; opts.version = GIT_SUBMODULE_UPDATE_OPTIONS_VERSION; opts.fetch_opts = GIT_FETCH_OPTIONS_INIT; + opts.fetch_opts.callbacks = callbacks; opts.fetch_opts.version = GIT_FETCH_OPTIONS_VERSION; opts.checkout_opts = GIT_CHECKOUT_OPTIONS_INIT; opts.checkout_opts.checkout_strategy = GIT_CHECKOUT_SAFE;