From: "Pablo Sabater" <pabloosabaterr@gmail.com>
To: "Karthik Nayak" <karthik.188@gmail.com>,
"Pablo Sabater" <pabloosabaterr@gmail.com>, <git@vger.kernel.org>
Cc: "Derrick Stolee" <stolee@gmail.com>
Subject: Re: [PATCH RFC 4/5] backfill: add --dry-run option
Date: Wed, 30 Sep 2026 13:19:17 +0100 [thread overview]
Message-ID: <DLSN94VUFI80.15JU19PJ3RPK1@gmail.com> (raw)
In-Reply-To: <CAOLa=ZR2Ka+5o8HxgZtnO98oH6vo6B_HmjVekYT8hC3HTMq-QQ@mail.gmail.com>
On Wed Sep 30, 2026 at 12:06 PM WEST, Karthik Nayak wrote:
> Pablo Sabater <pabloosabaterr@gmail.com> writes:
>
>> Users have no way to know how many blobs git backfill is going to
>> download before running it.
>>
>> Add a new --dry-run option to the backfill command. The objects are
>> walked as usual, but instead of fetching each batch of missing blobs
>> they are only counted, and the total is printed at the end.
>>
>> A subsequent commit will also print their size when the server supports
>> the object-info capability.
>>
>> Signed-off-by: Pablo Sabater <pabloosabaterr@gmail.com>
>> ---
>> Documentation/git-backfill.adoc | 6 +++++-
>> builtin/backfill.c | 37 +++++++++++++++++++++++++++++++++----
>> t/t5620-backfill.sh | 26 ++++++++++++++++++++++++++
>> 3 files changed, 64 insertions(+), 5 deletions(-)
>>
>> diff --git a/Documentation/git-backfill.adoc b/Documentation/git-backfill.adoc
>> index 82d6a1969d..08f19fea17 100644
>> --- a/Documentation/git-backfill.adoc
>> +++ b/Documentation/git-backfill.adoc
>> @@ -9,7 +9,7 @@ git-backfill - Download missing objects in a partial clone
>> SYNOPSIS
>> --------
>> [synopsis]
>> -git backfill [--min-batch-size=<n>] [--[no-]sparse] [--[no-]include-edges] [<revision-range>]
>> +git backfill [--min-batch-size=<n>] [--[no-]sparse] [--[no-]include-edges] [--dry-run] [<revision-range>]
>>
>> DESCRIPTION
>> -----------
>> @@ -70,6 +70,10 @@ OPTIONS
>> --onto TARGET A..B`, where A..B normally excludes A but you need
>> the blobs from A as well. `--include-edges` is the default.
>>
>> +`--dry-run`::
>> + Do not download any objects. Instead, print the number of
>> + missing blobs that would be downloaded.
>> +
>> `<revision-range>`::
>> Backfill only blobs reachable from commits in the specified
>> revision range. When no _<revision-range>_ is specified, it
>> diff --git a/builtin/backfill.c b/builtin/backfill.c
>> index e71e0f4742..6019112966 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] [--[no-]include-edges] [<revision-range>]"),
>> + N_("git backfill [--min-batch-size=<n>] [--[no-]sparse] [--[no-]include-edges] [--dry-run] [<revision-range>]"),
>> NULL
>> };
>>
>> @@ -36,6 +36,8 @@ struct backfill_context {
>> size_t min_batch_size;
>> int sparse;
>> int include_edges;
>> + int dry_run;
>
> Nit: This could be a bool, since `OPT__DRY_RUN` uses `OPT_BOOL` internally.
Will do, didn't know that using bool was a thing ;). Is it also prefered
for 0/1 functions?
>
>> + size_t total_batch_nr;
>
>
>> struct rev_info revs;
>> };
>>
>> @@ -58,6 +60,15 @@ static void download_batch(struct backfill_context *ctx)
>> odb_reprepare(ctx->repo->objects);
>> }
>>
>> +static void dry_run_batch(struct backfill_context *ctx)
>> +{
>
> While it is used during dry_run, probably makes more sense to rename it
> to `count_batch()` since that's what it does.
count_batch() works for me, I think that "count" doesn't fit too well
for summing the size of the objects, might opt for another name if I
think of a better name.
Prob a comment helps.
>
>> + if (!ctx->current_batch.nr)
>> + return;
>> +
>> + ctx->total_batch_nr += ctx->current_batch.nr;
>> + oid_array_clear(&ctx->current_batch);
>> +}
>> +
>> static int fill_missing_blobs(const char *path UNUSED,
>> struct oid_array *list,
>> enum object_type type,
>> @@ -73,8 +84,12 @@ static int fill_missing_blobs(const char *path UNUSED,
>> oid_array_append(&ctx->current_batch, &list->oid[i]);
>> }
>>
>> - if (ctx->current_batch.nr >= ctx->min_batch_size)
>> - download_batch(ctx);
>> + if (ctx->current_batch.nr >= ctx->min_batch_size) {
>> + if (ctx->dry_run)
>> + dry_run_batch(ctx);
>> + else
>> + download_batch(ctx);
>> + }
>>
>> return 0;
>> }
>> @@ -131,10 +146,23 @@ static int do_backfill(struct backfill_context *ctx)
>>
>> ret = walk_objects_by_path(&info);
>>
>> + if (ret)
>> + goto end;
>> +
>> /* Download the objects that did not fill a batch. */
>> - if (!ret)
>> + if (!ctx->dry_run) {
>> download_batch(ctx);
>> + goto end;
>> + }
>> +
>> + dry_run_batch(ctx);
>> +
>> + printf(Q_("After backfill, %" PRIuMAX " blob would be fetched.\n",
>> + "After backfill, %" PRIuMAX " blobs would be fetched.\n",
>> + (unsigned long)ctx->total_batch_nr),
>> + (uintmax_t)ctx->total_batch_nr);
>>
>
> Nit: Okay so we have a goto inside the first if(...), which skips this
> section. I would have found it easier to read if it was
>
> if (dry_run)
> count()
> else
> download()
Will change it, thanks.
>
[snip]
next prev parent reply other threads:[~2026-09-30 12:19 UTC|newest]
Thread overview: 18+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-09-30 0:21 [PATCH RFC 0/5] Add --dry-run option to git-backfill(1) Pablo Sabater
2026-09-30 0:21 ` [PATCH RFC 1/5] transport-internal: update fetch_object_info comment Pablo Sabater
2026-09-30 0:21 ` [PATCH RFC 2/5] fetch-object-info: add enum for fetch_object_info() statuses Pablo Sabater
2026-09-30 10:56 ` Karthik Nayak
2026-09-30 11:59 ` Pablo Sabater
2026-09-30 0:21 ` [PATCH RFC 3/5] fetch-object-info: return a status instead of dying Pablo Sabater
2026-09-30 17:07 ` Junio C Hamano
2026-09-30 18:03 ` Pablo Sabater
2026-09-30 20:01 ` Junio C Hamano
2026-09-30 0:21 ` [PATCH RFC 4/5] backfill: add --dry-run option Pablo Sabater
2026-09-30 11:06 ` Karthik Nayak
2026-09-30 12:19 ` Pablo Sabater [this message]
2026-09-30 0:21 ` [PATCH RFC 5/5] backfill: report total size of missing blobs in --dry-run Pablo Sabater
2026-09-30 17:17 ` Junio C Hamano
2026-09-30 18:31 ` Pablo Sabater
2026-09-30 18:14 ` [PATCH RFC 0/5] Add --dry-run option to git-backfill(1) Derrick Stolee
2026-09-30 19:06 ` Pablo Sabater
2026-09-30 20:03 ` Junio C Hamano
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=DLSN94VUFI80.15JU19PJ3RPK1@gmail.com \
--to=pabloosabaterr@gmail.com \
--cc=git@vger.kernel.org \
--cc=karthik.188@gmail.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.