From: Toon Claes <toon@iotcl.com>
To: Patrick Steinhardt <ps@pks.im>, git@vger.kernel.org
Cc: Justin Tobler <jltobler@gmail.com>,
Junio C Hamano <gitster@pobox.com>, Jeff King <peff@peff.net>,
Taylor Blau <ttaylorr@openai.com>
Subject: Re: [PATCH v3 9/9] builtin/cat-file: filter objects via object database
Date: Wed, 15 Jul 2026 07:41:33 +0200 [thread overview]
Message-ID: <871pd4n71u.fsf@emacs.iotcl.com> (raw)
In-Reply-To: <20260713-pks-odb-for-each-object-filter-v3-9-b3c65c641073@pks.im>
Patrick Steinhardt <ps@pks.im> writes:
> When batching all objects, git-cat-file(1) reaches into the internals of
> the object database and manually manages bitmaps to apply object
> filters. This creates coupling between the command and the internals of
> the respective backend.
>
> Refactor git-cat-file(1) to use the new object filter option when
> batching all objects. This significantly simplifies the logic and
> ensures that we don't have to reach into internals of the "files" source
> anymore.
>
> Signed-off-by: Patrick Steinhardt <ps@pks.im>
> ---
> builtin/cat-file.c | 76 +++++-------------------------------------------------
> 1 file changed, 7 insertions(+), 69 deletions(-)
>
> diff --git a/builtin/cat-file.c b/builtin/cat-file.c
> index b4b99a73da..1458dd76d6 100644
> --- a/builtin/cat-file.c
> +++ b/builtin/cat-file.c
> @@ -20,7 +20,6 @@
> #include "userdiff.h"
> #include "oid-array.h"
> #include "packfile.h"
> -#include "pack-bitmap.h"
> #include "object-file.h"
> #include "object-name.h"
> #include "odb.h"
> @@ -844,28 +843,6 @@ static int batch_one_object_oi(const struct object_id *oid,
> return payload->callback(oid, NULL, 0, payload->payload);
> }
>
> -static int batch_one_object_packed(const struct object_id *oid,
> - struct packed_git *pack,
> - uint32_t pos,
> - void *_payload)
> -{
> - struct for_each_object_payload *payload = _payload;
> - return payload->callback(oid, pack, nth_packed_object_offset(pack, pos),
> - payload->payload);
> -}
> -
> -static int batch_one_object_bitmapped(const struct object_id *oid,
> - enum object_type type UNUSED,
> - int flags UNUSED,
> - uint32_t hash UNUSED,
> - struct packed_git *pack,
> - off_t offset,
> - void *_payload)
> -{
> - struct for_each_object_payload *payload = _payload;
> - return payload->callback(oid, pack, offset, payload->payload);
> -}
> -
> static void batch_each_object(struct batch_options *opt,
> for_each_object_fn callback,
> unsigned flags,
> @@ -875,56 +852,17 @@ static void batch_each_object(struct batch_options *opt,
> .callback = callback,
> .payload = _payload,
> };
> + struct odb_source_info source_info;
> + struct object_info oi = {
> + .source_infop = &source_info,
> + };
> struct odb_for_each_object_options opts = {
> .flags = flags,
> + .filter = &opt->objects_filter,
Ahha, so here we pass the filter down.
> };
> - struct bitmap_index *bitmap = NULL;
> - struct odb_source *source;
> -
> - /*
> - * TODO: we still need to tap into implementation details of the object
> - * database sources. Ideally, we should extend `odb_for_each_object()`
> - * to handle object filters itself so that we can move the filtering
> - * logic into the individual sources.
> - */
> - odb_prepare_alternates(the_repository->objects);
> - for (source = the_repository->objects->sources; source; source = source->next) {
> - struct odb_source_files *files = odb_source_files_downcast(source);
> - int ret = odb_source_for_each_object(&files->loose->base, NULL, batch_one_object_oi,
> - &payload, &opts);
> - if (ret)
> - break;
> - }
> -
> - if (opt->objects_filter.choice != LOFC_DISABLED &&
> - (bitmap = prepare_bitmap_git(the_repository)) &&
> - !for_each_bitmapped_object(bitmap, &opt->objects_filter,
> - batch_one_object_bitmapped, &payload)) {
Similar to the new code, the filter is used if possible. It is
batch_object_write() which ensures the filter is applied. That didn't
change.
> - struct packed_git *pack;
> -
> - repo_for_each_pack(the_repository, pack) {
> - if (bitmap_index_contains_pack(bitmap, pack) ||
> - open_pack_index(pack))
> - continue;
> - for_each_object_in_pack(pack, batch_one_object_packed,
> - &payload, flags);
> - }
> - } else {
> - struct odb_source_info source_info;
> - struct object_info oi = {
> - .source_infop = &source_info,
> - };
> -
> - for (source = the_repository->objects->sources; source; source = source->next) {
> - struct odb_source_files *files = odb_source_files_downcast(source);
> - int ret = odb_source_for_each_object(&files->packed->base, &oi,
> - batch_one_object_oi, &payload, &opts);
> - if (ret)
> - break;
> - }
> - }
>
> - free_bitmap_index(bitmap);
> + odb_for_each_object_ext(the_repository->objects, &oi,
> + batch_one_object_oi, &payload, &opts);
Nice to see it abstracted out like this!
> }
>
> static int batch_objects(struct batch_options *opt)
>
> --
> 2.55.0.313.g8d093f411d.dirty
>
>
--
Cheers,
Toon
next prev parent reply other threads:[~2026-07-15 5:41 UTC|newest]
Thread overview: 73+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-07-09 8:35 [PATCH 0/7] odb: introduce object filters to `odb_for_each_object()` Patrick Steinhardt
2026-07-09 8:35 ` [PATCH 1/7] odb/source-packed: improve lookup when enumerating objects Patrick Steinhardt
2026-07-09 19:54 ` Justin Tobler
2026-07-10 7:08 ` Patrick Steinhardt
2026-07-09 8:35 ` [PATCH 2/7] pack-bitmap: mark object filter as `const` Patrick Steinhardt
2026-07-09 8:35 ` [PATCH 3/7] pack-bitmap: allow aborting iteration of bitmapped objects Patrick Steinhardt
2026-07-09 20:19 ` Justin Tobler
2026-07-10 7:08 ` Patrick Steinhardt
2026-07-11 7:47 ` Jeff King
2026-07-09 8:35 ` [PATCH 4/7] pack-bitmap: iterate object sources when opening bitmaps Patrick Steinhardt
2026-07-09 21:08 ` Justin Tobler
2026-07-10 7:08 ` Patrick Steinhardt
2026-07-09 8:35 ` [PATCH 5/7] pack-bitmap: introduce function to open bitmap for a single source Patrick Steinhardt
2026-07-09 8:35 ` [PATCH 6/7] odb: introduce object filters to `odb_for_each_object()` Patrick Steinhardt
2026-07-09 21:43 ` Justin Tobler
2026-07-10 7:09 ` Patrick Steinhardt
2026-07-15 5:09 ` Toon Claes
2026-07-09 8:35 ` [PATCH 7/7] builtin/cat-file: filter objects via object database Patrick Steinhardt
2026-07-09 18:59 ` Junio C Hamano
2026-07-10 7:09 ` Patrick Steinhardt
2026-07-10 8:48 ` [PATCH v2 0/8] odb: introduce object filters to `odb_for_each_object()` Patrick Steinhardt
2026-07-10 8:48 ` [PATCH v2 1/8] odb/source-packed: improve lookup when enumerating objects Patrick Steinhardt
2026-07-10 22:25 ` Taylor Blau
2026-07-13 9:54 ` Patrick Steinhardt
2026-07-14 3:49 ` Taylor Blau
2026-07-14 5:35 ` Patrick Steinhardt
2026-07-10 8:48 ` [PATCH v2 2/8] pack-bitmap: mark object filter as `const` Patrick Steinhardt
2026-07-10 22:25 ` Taylor Blau
2026-07-10 8:48 ` [PATCH v2 3/8] pack-bitmap: allow aborting iteration of bitmapped objects Patrick Steinhardt
2026-07-10 22:34 ` Taylor Blau
2026-07-11 8:01 ` Jeff King
2026-07-13 9:53 ` Patrick Steinhardt
2026-07-14 3:58 ` Taylor Blau
2026-07-14 7:17 ` Jeff King
2026-07-10 8:48 ` [PATCH v2 4/8] pack-bitmap: iterate object sources when opening bitmaps Patrick Steinhardt
2026-07-10 22:40 ` Taylor Blau
2026-07-10 8:48 ` [PATCH v2 5/8] pack-bitmap: drop `_1` suffix from functions that open bitmaps Patrick Steinhardt
2026-07-10 22:41 ` Taylor Blau
2026-07-10 8:48 ` [PATCH v2 6/8] pack-bitmap: introduce function to open bitmap for a single source Patrick Steinhardt
2026-07-10 8:48 ` [PATCH v2 7/8] odb: introduce object filters to `odb_for_each_object()` Patrick Steinhardt
2026-07-10 22:42 ` Taylor Blau
2026-07-10 8:49 ` [PATCH v2 8/8] builtin/cat-file: filter objects via object database Patrick Steinhardt
2026-07-11 7:58 ` [PATCH v2 9/8?] pack-objects: drop unused return value from add_object_entry() Jeff King
2026-07-11 16:42 ` Junio C Hamano
2026-07-13 14:41 ` [PATCH v3 0/9] odb: introduce object filters to `odb_for_each_object()` Patrick Steinhardt
2026-07-13 14:41 ` [PATCH v3 1/9] odb/source-packed: improve lookup when enumerating objects Patrick Steinhardt
2026-07-13 14:41 ` [PATCH v3 2/9] pack-bitmap: mark object filter as `const` Patrick Steinhardt
2026-07-13 14:41 ` [PATCH v3 3/9] pack-objects: drop unused return value from add_object_entry() Patrick Steinhardt
2026-07-13 14:41 ` [PATCH v3 4/9] pack-bitmap: allow aborting iteration of bitmapped objects Patrick Steinhardt
2026-07-13 14:41 ` [PATCH v3 5/9] pack-bitmap: iterate object sources when opening bitmaps Patrick Steinhardt
2026-07-13 14:41 ` [PATCH v3 6/9] pack-bitmap: drop `_1` suffix from functions that open bitmaps Patrick Steinhardt
2026-07-13 14:41 ` [PATCH v3 7/9] pack-bitmap: introduce function to open bitmap for a single source Patrick Steinhardt
2026-07-15 5:25 ` Toon Claes
2026-07-15 6:22 ` Patrick Steinhardt
2026-07-13 14:41 ` [PATCH v3 8/9] odb: introduce object filters to `odb_for_each_object()` Patrick Steinhardt
2026-07-15 5:27 ` Toon Claes
2026-07-13 14:41 ` [PATCH v3 9/9] builtin/cat-file: filter objects via object database Patrick Steinhardt
2026-07-15 5:41 ` Toon Claes [this message]
2026-07-14 3:59 ` [PATCH v3 0/9] odb: introduce object filters to `odb_for_each_object()` Taylor Blau
2026-07-14 5:36 ` Patrick Steinhardt
2026-07-15 5:43 ` Toon Claes
2026-07-15 6:21 ` Patrick Steinhardt
2026-07-14 7:17 ` Jeff King
2026-07-15 6:22 ` [PATCH v4 " Patrick Steinhardt
2026-07-15 6:22 ` [PATCH v4 1/9] odb/source-packed: improve lookup when enumerating objects Patrick Steinhardt
2026-07-15 6:22 ` [PATCH v4 2/9] pack-bitmap: mark object filter as `const` Patrick Steinhardt
2026-07-15 6:22 ` [PATCH v4 3/9] pack-objects: drop unused return value from add_object_entry() Patrick Steinhardt
2026-07-15 6:22 ` [PATCH v4 4/9] pack-bitmap: allow aborting iteration of bitmapped objects Patrick Steinhardt
2026-07-15 6:22 ` [PATCH v4 5/9] pack-bitmap: iterate object sources when opening bitmaps Patrick Steinhardt
2026-07-15 6:22 ` [PATCH v4 6/9] pack-bitmap: drop `_1` suffix from functions that open bitmaps Patrick Steinhardt
2026-07-15 6:22 ` [PATCH v4 7/9] pack-bitmap: introduce function to open bitmap for a single source Patrick Steinhardt
2026-07-15 6:22 ` [PATCH v4 8/9] odb: introduce object filters to `odb_for_each_object()` Patrick Steinhardt
2026-07-15 6:22 ` [PATCH v4 9/9] builtin/cat-file: filter objects via object database Patrick Steinhardt
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=871pd4n71u.fsf@emacs.iotcl.com \
--to=toon@iotcl.com \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
--cc=jltobler@gmail.com \
--cc=peff@peff.net \
--cc=ps@pks.im \
--cc=ttaylorr@openai.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.