From: Trieu Huynh <vikingtc4@gmail.com>
To: stolee@gmail.com, gitster@pobox.com
Cc: git@vger.kernel.org, Trieu Huynh <vikingtc4@gmail.com>
Subject: [GSoC PATCH v2] backfill: add --[no-]progress option
Date: Mon, 13 Apr 2026 02:36:59 +0700 [thread overview]
Message-ID: <20260412193659.26288-1-viking4@gmail.com> (raw)
From: Trieu Huynh <vikingtc4@gmail.com>
'git backfill' does not show an overall progress bar across
batches, giving no cross-batch feedback during potentially
long-running operations on large repositories. By contrast,
'git fetch', 'git gc', and 'git index-pack' all support
--[no-]progress.
Add a --[no-]progress option that tracks the total number of
missing blobs downloaded across all batches, defaulting to
showing progress when stderr is a terminal (matching the
behaviour of 'git fetch').
Add tests to verify that:
- progress is shown by default on a TTY
- --progress forces output regardless of TTY
- --no-progress suppresses output
Signed-off-by: Trieu Huynh <vikingtc4@gmail.com>
---
builtin/backfill.c | 18 +++++++++++++++++-
t/t5620-backfill.sh | 24 ++++++++++++++++++++++++
2 files changed, 41 insertions(+), 1 deletion(-)
diff --git a/builtin/backfill.c b/builtin/backfill.c
index d794dd842f..e90c899071 100644
--- a/builtin/backfill.c
+++ b/builtin/backfill.c
@@ -26,7 +26,7 @@
#include "path-walk.h"
static const char * const builtin_backfill_usage[] = {
- N_("git backfill [--min-batch-size=<n>] [--[no-]sparse]"),
+ N_("git backfill [--min-batch-size=<n>] [--[no-]sparse] [--[no-]progress]"),
NULL
};
@@ -36,6 +36,9 @@ struct backfill_context {
size_t min_batch_size;
int sparse;
struct rev_info revs;
+ int show_progress;
+ size_t nr_downloaded;
+ struct progress *progress;
};
static void backfill_context_clear(struct backfill_context *ctx)
@@ -48,6 +51,7 @@ static void download_batch(struct backfill_context *ctx)
promisor_remote_get_direct(ctx->repo,
ctx->current_batch.oid,
ctx->current_batch.nr);
+ ctx->nr_downloaded += ctx->current_batch.nr;
oid_array_clear(&ctx->current_batch);
/*
@@ -55,6 +59,7 @@ static void download_batch(struct backfill_context *ctx)
* avoid possible duplicate downloads of the same objects.
*/
odb_reprepare(ctx->repo->objects);
+ display_progress(ctx->progress, ctx->nr_downloaded);
}
static int fill_missing_blobs(const char *path UNUSED,
@@ -121,12 +126,16 @@ int cmd_backfill(int argc, const char **argv, const char *prefix, struct reposit
.min_batch_size = 50000,
.sparse = -1,
.revs = REV_INFO_INIT,
+ .nr_downloaded = 0,
+ .show_progress = -1,
};
struct option options[] = {
OPT_UNSIGNED(0, "min-batch-size", &ctx.min_batch_size,
N_("Minimum number of objects to request at a time")),
OPT_BOOL(0, "sparse", &ctx.sparse,
N_("Restrict the missing objects to the current sparse-checkout")),
+ OPT_BOOL(0, "progress", &ctx.show_progress,
+ N_("show progress while downloading missing objects")),
OPT_END(),
};
struct repo_config_values *cfg = repo_config_values(the_repository);
@@ -150,7 +159,14 @@ int cmd_backfill(int argc, const char **argv, const char *prefix, struct reposit
if (ctx.sparse < 0)
ctx.sparse = cfg->apply_sparse_checkout;
+ if (ctx.show_progress < 0)
+ ctx.show_progress = isatty(2);
+
+ if (ctx.show_progress)
+ ctx.progress = start_progress(ctx.repo,
+ _("Downloading missing blobs"), 0);
result = do_backfill(&ctx);
+ stop_progress(&ctx.progress);
backfill_context_clear(&ctx);
release_revisions(&ctx.revs);
return result;
diff --git a/t/t5620-backfill.sh b/t/t5620-backfill.sh
index f3b5e39493..a75b84d8ac 100755
--- a/t/t5620-backfill.sh
+++ b/t/t5620-backfill.sh
@@ -133,6 +133,30 @@ test_expect_success 'do partial clone 2, backfill min batch size' '
test_line_count = 0 revs2
'
+test_expect_success TTY 'backfill shows progress on tty by default' '
+ git clone --no-checkout --filter=blob:none \
+ --single-branch --branch=main \
+ "file://$(pwd)/srv.bare" clone-tty &&
+ test_terminal env GIT_PROGRESS_DELAY=0 git -C clone-tty backfill 2>err &&
+ test_grep "Downloading missing blobs" err
+'
+
+test_expect_success 'backfill --progress shows progress' '
+ git clone --no-checkout --filter=blob:none \
+ --single-branch --branch=main \
+ "file://$(pwd)/srv.bare" clone-progress &&
+ git -C clone-progress backfill --progress 2>err &&
+ test_grep "Downloading missing blobs" err
+'
+
+test_expect_success 'backfill --no-progress suppresses progress' '
+ git clone --no-checkout --filter=blob:none \
+ --single-branch --branch=main \
+ "file://$(pwd)/srv.bare" clone-no-progress &&
+ git -C clone-no-progress backfill --no-progress 2>err &&
+ test_grep ! "Downloading missing blobs" err
+'
+
test_expect_success 'backfill --sparse without sparse-checkout fails' '
git init not-sparse &&
test_must_fail git -C not-sparse backfill --sparse 2>err &&
--
2.43.0
next reply other threads:[~2026-04-12 19:37 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-04-12 19:36 Trieu Huynh [this message]
2026-04-12 19:46 ` [GSoC PATCH v2] backfill: add --[no-]progress option Derrick Stolee
2026-04-13 19:02 ` Trieu Huynh
2026-04-15 18:28 ` Derrick Stolee
2026-04-15 17:04 ` Tian Yuchen
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260412193659.26288-1-viking4@gmail.com \
--to=vikingtc4@gmail.com \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
--cc=stolee@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox