From: Patrick Steinhardt Date: Thu, 25 Jun 2026 09:57:39 +0000 (+0200) Subject: odb/source-packed: extract logic to skip certain packs X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=d45f956f2022a90d39b1ce82aea668cce73f1d75;p=thirdparty%2Fgit.git odb/source-packed: extract logic to skip certain packs The caller can pass flags that allow them to filter out specific kinds of objects when iterating objects via `odb_for_each_object()`. This only works for "normal" iteration though, as we `BUG()` when the user passes flags and specifies an object prefix. This limitation will be lifted in the next commit. Prepare for this by extracting the logic that skips certain kinds of packs so that we can easily reuse it. Signed-off-by: Patrick Steinhardt Signed-off-by: Junio C Hamano --- diff --git a/odb/source-packed.c b/odb/source-packed.c index 42c28fba0e..3afc4bf01f 100644 --- a/odb/source-packed.c +++ b/odb/source-packed.c @@ -126,6 +126,22 @@ static int match_hash(unsigned len, const unsigned char *a, const unsigned char return 1; } +static bool should_exclude_pack(struct packed_git *p, enum odb_for_each_object_flags flags) +{ + if ((flags & ODB_FOR_EACH_OBJECT_LOCAL_ONLY) && !p->pack_local) + return true; + if ((flags & ODB_FOR_EACH_OBJECT_PROMISOR_ONLY) && + !p->pack_promisor) + return true; + if ((flags & ODB_FOR_EACH_OBJECT_SKIP_IN_CORE_KEPT_PACKS) && + p->pack_keep_in_core) + return true; + if ((flags & ODB_FOR_EACH_OBJECT_SKIP_ON_DISK_KEPT_PACKS) && + p->pack_keep) + return true; + return false; +} + static int for_each_prefixed_object_in_midx( struct odb_source_packed *store, struct multi_pack_index *m, @@ -306,17 +322,9 @@ static int odb_source_packed_for_each_object(struct odb_source *source, for (e = packfile_store_get_packs(packed); e; e = e->next) { struct packed_git *p = e->pack; - if ((opts->flags & ODB_FOR_EACH_OBJECT_LOCAL_ONLY) && !p->pack_local) - continue; - if ((opts->flags & ODB_FOR_EACH_OBJECT_PROMISOR_ONLY) && - !p->pack_promisor) - continue; - if ((opts->flags & ODB_FOR_EACH_OBJECT_SKIP_IN_CORE_KEPT_PACKS) && - p->pack_keep_in_core) - continue; - if ((opts->flags & ODB_FOR_EACH_OBJECT_SKIP_ON_DISK_KEPT_PACKS) && - p->pack_keep) + if (should_exclude_pack(p, opts->flags)) continue; + if (open_pack_index(p)) { pack_errors = 1; continue;