git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH v2 0/6] packfile: remove `packfile_store_get_packs()`

From
Patrick Steinhardt <ps@pks.im>
Date
Oct 9, 2025, 08:01 UTC
Message-ID
<20251009-pks-packfiles-convert-get-all-v2-0-0d73b87ce711@pks.im>
In-Reply-To
<20251007-pks-packfiles-convert-get-all-v1-0-428227657a89@pks.im>
Hi,

this patch series follows up on the discussion at [1]. Originally, these patches were part of the series that introduced the packfile store, but we decided to split them out into a separate series.

In any case, the goal of this series is to remove the confusing difference between `packfiles_store_get_{,all_}packs()`. It's not really obvious to the caller what the difference is. But even worse, the result of these functions depends on whether or not `get_all_packs()` was ever executed before `get_packs()`.

The series is built on top of 821f583da6 (The thirteenth batcn, 2025-09-29) with tb/incremental-midx-part-3.1 at c886af90f8 (SQUASH??? play well with other topics by preemptively including "repository.h", 2025-09-29) merged into it. This is done to fix some minor conflicts with that patch series.

Changes in v2:
  - Some commit message improvements.
  - Adapt `packfile_store_for_each_pack()` to `repo_for_each_pack()`. On
    the one hand this provides easier ergonomics. On the other hand this
    will eventually allow us to handle object databases of a different
    type more easily.
  - Link to v1: https://lore.kernel.org/r/20251007-pks-packfiles-convert-get-all-v1-0-428227657a89@pks.im
Thanks!
Patrick
[1]: <aK5hpwcCgjkgQB1N@nand.local>
---
Patrick Steinhardt (6):
      object-name: convert to use `packfile_store_get_all_packs()`
      builtin/gc: convert to use `packfile_store_get_all_packs()`
      builtin/grep: simplify how we preload packs
      packfile: drop `packfile_store_get_packs()`
      packfile: introduce macro to iterate through packs
      packfile: rename `packfile_store_get_all_packs()`
 builtin/cat-file.c          |  3 +--
 builtin/count-objects.c     |  3 +--
 builtin/fast-import.c       |  4 ++--
 builtin/fsck.c              | 15 ++++++---------
 builtin/gc.c                | 16 +++++++---------
 builtin/grep.c              |  2 +-
 builtin/pack-objects.c      | 26 +++++++++-----------------
 builtin/pack-redundant.c    | 14 ++++----------
 connected.c                 |  3 +--
 http-backend.c              |  5 ++---
 http.c                      |  3 +--
 object-name.c               |  8 +++++---
 pack-bitmap.c               |  6 +++---
 pack-objects.c              |  5 ++---
 packfile.c                  | 10 ++--------
 packfile.h                  | 10 ++++++----
 repack-cruft.c              |  3 +--
 repack-geometry.c           |  3 +--
 repack.c                    |  3 +--
 server-info.c               |  3 +--
 t/helper/test-find-pack.c   |  3 ++-
 t/helper/test-pack-mtimes.c |  2 +-
 22 files changed, 60 insertions(+), 90 deletions(-)
Range-diff versus v1:
1:  c52009c363 = 1:  04550dbdcf object-name: convert to use `packfile_store_get_all_packs()`
2:  20389a8027 ! 2:  2677bc631f builtin/gc: convert to use `packfile_store_get_all_packs()`
    @@ Commit message
         The auto-condition for this task checks how many packfiles there are
         that aren't indexed by any multi-pack index. If there is a sufficient
         number then we execute the above command to combine those into a single
    -    pack and add them to the MIDX.
    +    pack and add that pack to the MIDX.
     
         As we don't care about MIDX'd packs we use `packfile_store_get_packs()`,
         which knows to not load any packs that are indexed by a MIDX. But as
         explained in the preceding commit, we want to get rid of that function.
     
    -    We already handle packfiles that have an MIDX alright by the very nature
    -    of this function, as we explicitly count non-MIDX'd packs. As such, we
    -    can trivially switch over to use `packfile_store_get_all_packs()`
    -    instead.
    +    We already handle packfiles that have a MIDX by the very nature of this
    +    function, as we explicitly count non-MIDX'd packs. As such, we can
    +    trivially switch over to use `packfile_store_get_all_packs()` instead.
     
         Do so.
     
3:  1357bdce48 ! 3:  7bee72fd98 builtin/grep: simplify how we preload packs
    @@ Commit message
         such packfile. This pointer is ignored though, as all we really care
         about is that `packfile_store_prepare()` was called.
     
    -    Historyically, that function was file-local to "packfile.c", but that
    +    Historically, that function was file-local to "packfile.c", but that
         changed with 4188332569 (packfile: move `get_multi_pack_index()` into
         "midx.c", 2025-09-02). We can thus simplify the code by calling that
         function directly.
4:  f2275c97ae = 4:  e709bd4ac9 packfile: drop `packfile_store_get_packs()`
5:  6e57bdd081 ! 5:  2000ef6983 packfile: introduce macro to iterate through packs
    @@ Commit message
         packs of a given `struct packfile_store`. This pattern is somewhat
         verbose and repetitive, which makes it somewhat cumbersome.
     
    -    Introduce a new macro `packfile_store_for_each_pack()` that removes some
    -    of the boilerplate.
    +    Introduce a new macro `repo_for_each_pack()` that removes some of the
    +    boilerplate.
     
         Signed-off-by: Patrick Steinhardt <ps@pks.im>
     
      ## builtin/cat-file.c ##
     @@ builtin/cat-file.c: static void batch_each_object(struct batch_options *opt,
    - 		struct packfile_store *packs = the_repository->objects->packfiles;
    + 
    + 	if (bitmap && !for_each_bitmapped_object(bitmap, &opt->objects_filter,
    + 						 batch_one_object_bitmapped, &payload)) {
    +-		struct packfile_store *packs = the_repository->objects->packfiles;
      		struct packed_git *pack;
      
     -		for (pack = packfile_store_get_all_packs(packs); pack; pack = pack->next) {
    -+		packfile_store_for_each_pack(packs, pack) {
    ++		repo_for_each_pack(the_repository, pack) {
      			if (bitmap_index_contains_pack(bitmap, pack) ||
      			    open_pack_index(pack))
      				continue;
     
      ## builtin/count-objects.c ##
    +@@ builtin/count-objects.c: int cmd_count_objects(int argc,
    + 				      count_loose, count_cruft, NULL, NULL);
    + 
    + 	if (verbose) {
    +-		struct packfile_store *packs = the_repository->objects->packfiles;
    + 		struct packed_git *p;
    + 		unsigned long num_pack = 0;
    + 		off_t size_pack = 0;
     @@ builtin/count-objects.c: int cmd_count_objects(int argc,
      		struct strbuf pack_buf = STRBUF_INIT;
      		struct strbuf garbage_buf = STRBUF_INIT;
      
     -		for (p = packfile_store_get_all_packs(packs); p; p = p->next) {
    -+		packfile_store_for_each_pack(packs, p) {
    ++		repo_for_each_pack(the_repository, p) {
      			if (!p->pack_local)
      				continue;
      			if (open_pack_index(p))
     
      ## builtin/fsck.c ##
    -@@ builtin/fsck.c: static int check_pack_rev_indexes(struct repository *r, int show_progress)
    +@@ builtin/fsck.c: static int mark_packed_for_connectivity(const struct object_id *oid,
    + 
    + static int check_pack_rev_indexes(struct repository *r, int show_progress)
      {
    - 	struct packfile_store *packs = r->objects->packfiles;
    +-	struct packfile_store *packs = r->objects->packfiles;
      	struct progress *progress = NULL;
     +	struct packed_git *p;
      	uint32_t pack_count = 0;
    @@ builtin/fsck.c: static int check_pack_rev_indexes(struct repository *r, int show
      
      	if (show_progress) {
     -		for (struct packed_git *p = packfile_store_get_all_packs(packs); p; p = p->next)
    -+		packfile_store_for_each_pack(packs, p)
    ++		repo_for_each_pack(r, p)
      			pack_count++;
      		progress = start_delayed_progress(the_repository,
      						  "Verifying reverse pack-indexes", pack_count);
    @@ builtin/fsck.c: static int check_pack_rev_indexes(struct repository *r, int show
      	}
      
     -	for (struct packed_git *p = packfile_store_get_all_packs(packs); p; p = p->next) {
    -+	packfile_store_for_each_pack(packs, p) {
    ++	repo_for_each_pack(r, p) {
      		int load_error = load_pack_revindex_from_disk(p);
      
      		if (load_error < 0) {
    +@@ builtin/fsck.c: int cmd_fsck(int argc,
    + 		for_each_packed_object(the_repository,
    + 				       mark_packed_for_connectivity, NULL, 0);
    + 	} else {
    +-		struct packfile_store *packs = the_repository->objects->packfiles;
    +-
    + 		odb_prepare_alternates(the_repository->objects);
    + 		for (source = the_repository->objects->sources; source; source = source->next)
    + 			fsck_source(source);
     @@ builtin/fsck.c: int cmd_fsck(int argc,
      			struct progress *progress = NULL;
      
      			if (show_progress) {
     -				for (p = packfile_store_get_all_packs(packs); p;
     -				     p = p->next) {
    -+				packfile_store_for_each_pack(packs, p) {
    ++				repo_for_each_pack(the_repository, p) {
      					if (open_pack_index(p))
      						continue;
      					total += p->num_objects;
    @@ builtin/fsck.c: int cmd_fsck(int argc,
     -			for (p = packfile_store_get_all_packs(packs); p;
     -			     p = p->next) {
     +
    -+			packfile_store_for_each_pack(packs, p) {
    ++			repo_for_each_pack(the_repository, p) {
      				/* verify gives error messages itself */
      				if (verify_pack(the_repository,
      						p, fsck_obj_buffer,
     
      ## builtin/gc.c ##
    -@@ builtin/gc.c: static struct packed_git *find_base_packs(struct string_list *packs,
    - 	struct packfile_store *packfiles = the_repository->objects->packfiles;
    +@@ builtin/gc.c: static int too_many_loose_objects(struct gc_config *cfg)
    + static struct packed_git *find_base_packs(struct string_list *packs,
    + 					  unsigned long limit)
    + {
    +-	struct packfile_store *packfiles = the_repository->objects->packfiles;
      	struct packed_git *p, *base = NULL;
      
     -	for (p = packfile_store_get_all_packs(packfiles); p; p = p->next) {
    -+	packfile_store_for_each_pack(packfiles, p) {
    ++	repo_for_each_pack(the_repository, p) {
      		if (!p->pack_local || p->is_cruft)
      			continue;
      		if (limit) {
    -@@ builtin/gc.c: static int too_many_packs(struct gc_config *cfg)
    +@@ builtin/gc.c: static struct packed_git *find_base_packs(struct string_list *packs,
    + 
    + static int too_many_packs(struct gc_config *cfg)
      {
    - 	struct packfile_store *packs = the_repository->objects->packfiles;
    +-	struct packfile_store *packs = the_repository->objects->packfiles;
      	struct packed_git *p;
     -	int cnt;
     +	int cnt = 0;
    @@ builtin/gc.c: static int too_many_packs(struct gc_config *cfg)
      		return 0;
      
     -	for (cnt = 0, p = packfile_store_get_all_packs(packs); p; p = p->next) {
    -+	packfile_store_for_each_pack(packs, p) {
    ++	repo_for_each_pack(the_repository, p) {
      		if (!p->pack_local)
      			continue;
      		if (p->pack_keep)
    @@ builtin/gc.c: static int incremental_repack_auto_condition(struct gc_config *cfg
     -	for (p = packfile_store_get_all_packs(the_repository->objects->packfiles);
     -	     count < incremental_repack_auto_limit && p;
     -	     p = p->next) {
    -+	packfile_store_for_each_pack(the_repository->objects->packfiles, p) {
    ++	repo_for_each_pack(the_repository, p) {
     +		if (count >= incremental_repack_auto_limit)
     +			break;
      		if (!p->multi_pack_index)
    @@ builtin/gc.c: static off_t get_auto_pack_size(void)
      
      	odb_reprepare(r->objects);
     -	for (p = packfile_store_get_all_packs(r->objects->packfiles); p; p = p->next) {
    -+	packfile_store_for_each_pack(r->objects->packfiles, p) {
    ++	repo_for_each_pack(r, p) {
      		if (p->pack_size > max_size) {
      			second_largest_size = max_size;
      			max_size = p->pack_size;
     
      ## builtin/pack-objects.c ##
    +@@ builtin/pack-objects.c: static int pack_mtime_cmp(const void *_a, const void *_b)
    + 
    + static void read_packs_list_from_stdin(struct rev_info *revs)
    + {
    +-	struct packfile_store *packs = the_repository->objects->packfiles;
    + 	struct strbuf buf = STRBUF_INIT;
    + 	struct string_list include_packs = STRING_LIST_INIT_DUP;
    + 	struct string_list exclude_packs = STRING_LIST_INIT_DUP;
    + 	struct string_list_item *item = NULL;
    +-
    + 	struct packed_git *p;
    + 
    + 	while (strbuf_getline(&buf, stdin) != EOF) {
     @@ builtin/pack-objects.c: static void read_packs_list_from_stdin(struct rev_info *revs)
      	string_list_sort(&exclude_packs);
      	string_list_remove_duplicates(&exclude_packs, 0);
      
     -	for (p = packfile_store_get_all_packs(packs); p; p = p->next) {
    -+	packfile_store_for_each_pack(packs, p) {
    ++	repo_for_each_pack(the_repository, p) {
      		const char *pack_name = pack_basename(p);
      
      		if ((item = string_list_lookup(&include_packs, pack_name)))
    +@@ builtin/pack-objects.c: static void enumerate_cruft_objects(void)
    + 
    + static void enumerate_and_traverse_cruft_objects(struct string_list *fresh_packs)
    + {
    +-	struct packfile_store *packs = the_repository->objects->packfiles;
    + 	struct packed_git *p;
    + 	struct rev_info revs;
    + 	int ret;
     @@ builtin/pack-objects.c: static void enumerate_and_traverse_cruft_objects(struct string_list *fresh_packs
      	 * Re-mark only the fresh packs as kept so that objects in
      	 * unknown packs do not halt the reachability traversal early.
      	 */
     -	for (p = packfile_store_get_all_packs(packs); p; p = p->next)
    -+	packfile_store_for_each_pack(packs, p)
    ++	repo_for_each_pack(the_repository, p)
      		p->pack_keep_in_core = 0;
      	mark_pack_kept_in_core(fresh_packs, 1);
      
    +@@ builtin/pack-objects.c: static void enumerate_and_traverse_cruft_objects(struct string_list *fresh_packs
    + 
    + static void read_cruft_objects(void)
    + {
    +-	struct packfile_store *packs = the_repository->objects->packfiles;
    + 	struct strbuf buf = STRBUF_INIT;
    + 	struct string_list discard_packs = STRING_LIST_INIT_DUP;
    + 	struct string_list fresh_packs = STRING_LIST_INIT_DUP;
     @@ builtin/pack-objects.c: static void read_cruft_objects(void)
      	string_list_sort(&discard_packs);
      	string_list_sort(&fresh_packs);
      
     -	for (p = packfile_store_get_all_packs(packs); p; p = p->next) {
    -+	packfile_store_for_each_pack(packs, p) {
    ++	repo_for_each_pack(the_repository, p) {
      		const char *pack_name = pack_basename(p);
      		struct string_list_item *item;
      
    -@@ builtin/pack-objects.c: static void loosen_unused_packed_objects(void)
    +@@ builtin/pack-objects.c: static int loosened_object_can_be_discarded(const struct object_id *oid,
    + 
    + static void loosen_unused_packed_objects(void)
    + {
    +-	struct packfile_store *packs = the_repository->objects->packfiles;
    + 	struct packed_git *p;
    + 	uint32_t i;
      	uint32_t loosened_objects_nr = 0;
      	struct object_id oid;
      
     -	for (p = packfile_store_get_all_packs(packs); p; p = p->next) {
    -+	packfile_store_for_each_pack(packs, p) {
    ++	repo_for_each_pack(the_repository, p) {
      		if (!p->pack_local || p->pack_keep || p->pack_keep_in_core)
      			continue;
      
    -@@ builtin/pack-objects.c: static void add_extra_kept_packs(const struct string_list *names)
    +@@ builtin/pack-objects.c: static void get_object_list(struct rev_info *revs, struct strvec *argv)
    + 
    + static void add_extra_kept_packs(const struct string_list *names)
    + {
    +-	struct packfile_store *packs = the_repository->objects->packfiles;
    + 	struct packed_git *p;
    + 
      	if (!names->nr)
      		return;
      
     -	for (p = packfile_store_get_all_packs(packs); p; p = p->next) {
    -+	packfile_store_for_each_pack(packs, p) {
    ++	repo_for_each_pack(the_repository, p) {
      		const char *name = basename(p->pack_name);
      		int i;
      
     @@ builtin/pack-objects.c: int cmd_pack_objects(int argc,
    - 		struct packfile_store *packs = the_repository->objects->packfiles;
    + 
    + 	add_extra_kept_packs(&keep_pack_list);
    + 	if (ignore_packed_keep_on_disk) {
    +-		struct packfile_store *packs = the_repository->objects->packfiles;
      		struct packed_git *p;
      
     -		for (p = packfile_store_get_all_packs(packs); p; p = p->next)
    -+		packfile_store_for_each_pack(packs, p)
    ++		repo_for_each_pack(the_repository, p)
      			if (p->pack_local && p->pack_keep)
      				break;
      		if (!p) /* no keep-able packs found */
     @@ builtin/pack-objects.c: int cmd_pack_objects(int argc,
    - 		struct packfile_store *packs = the_repository->objects->packfiles;
    + 		 * want to unset "local" based on looking at packs, as
    + 		 * it also covers non-local objects
    + 		 */
    +-		struct packfile_store *packs = the_repository->objects->packfiles;
      		struct packed_git *p;
      
     -		for (p = packfile_store_get_all_packs(packs); p; p = p->next) {
    -+		packfile_store_for_each_pack(packs, p) {
    ++		repo_for_each_pack(the_repository, p) {
      			if (!p->pack_local) {
      				have_non_local_packs = 1;
      				break;
     
      ## builtin/pack-redundant.c ##
     @@ builtin/pack-redundant.c: static struct pack_list * add_pack(struct packed_git *p)
    + 
      static struct pack_list * add_pack_file(const char *filename)
      {
    - 	struct packfile_store *packs = the_repository->objects->packfiles;
    +-	struct packfile_store *packs = the_repository->objects->packfiles;
     -	struct packed_git *p = packfile_store_get_all_packs(packs);
     +	struct packed_git *p;
      
    @@ builtin/pack-redundant.c: static struct pack_list * add_pack(struct packed_git *
      		die("Bad pack filename: %s", filename);
      
     -	while (p) {
    -+	packfile_store_for_each_pack(packs, p)
    ++	repo_for_each_pack(the_repository, p)
      		if (strstr(p->pack_name, filename))
      			return add_pack(p);
     -		p = p->next;
    @@ builtin/pack-redundant.c: static struct pack_list * add_pack(struct packed_git *
      
      static void load_all(void)
      {
    - 	struct packfile_store *packs = the_repository->objects->packfiles;
    +-	struct packfile_store *packs = the_repository->objects->packfiles;
     -	struct packed_git *p = packfile_store_get_all_packs(packs);
     +	struct packed_git *p;
      
     -	while (p) {
    -+	packfile_store_for_each_pack(packs, p)
    ++	repo_for_each_pack(the_repository, p)
      		add_pack(p);
     -		p = p->next;
     -	}
    @@ builtin/pack-redundant.c: static struct pack_list * add_pack(struct packed_git *
     
      ## connected.c ##
     @@ connected.c: int check_connected(oid_iterate_fn fn, void *cb_data,
    - 			struct packfile_store *packs = the_repository->objects->packfiles;
    + 		 */
    + 		odb_reprepare(the_repository->objects);
    + 		do {
    +-			struct packfile_store *packs = the_repository->objects->packfiles;
      			struct packed_git *p;
      
     -			for (p = packfile_store_get_all_packs(packs); p; p = p->next) {
    -+			packfile_store_for_each_pack(packs, p) {
    ++			repo_for_each_pack(the_repository, p) {
      				if (!p->pack_promisor)
      					continue;
      				if (find_pack_entry_one(oid, p))
     
      ## http-backend.c ##
    -@@ http-backend.c: static void get_info_packs(struct strbuf *hdr, char *arg UNUSED)
    +@@ http-backend.c: static void get_head(struct strbuf *hdr, char *arg UNUSED)
    + static void get_info_packs(struct strbuf *hdr, char *arg UNUSED)
    + {
    + 	size_t objdirlen = strlen(repo_get_object_directory(the_repository));
    +-	struct packfile_store *packs = the_repository->objects->packfiles;
    + 	struct strbuf buf = STRBUF_INIT;
    + 	struct packed_git *p;
      	size_t cnt = 0;
      
      	select_getanyfile(hdr);
     -	for (p = packfile_store_get_all_packs(packs); p; p = p->next) {
    -+	packfile_store_for_each_pack(packs, p) {
    ++	repo_for_each_pack(the_repository, p) {
      		if (p->pack_local)
      			cnt++;
      	}
      
      	strbuf_grow(&buf, cnt * 53 + 2);
     -	for (p = packfile_store_get_all_packs(packs); p; p = p->next) {
    -+	packfile_store_for_each_pack(packs, p) {
    ++	repo_for_each_pack(the_repository, p) {
      		if (p->pack_local)
      			strbuf_addf(&buf, "P %s\n", p->pack_name + objdirlen + 6);
      	}
     
      ## http.c ##
    +@@ http.c: static char *fetch_pack_index(unsigned char *hash, const char *base_url)
    + static int fetch_and_setup_pack_index(struct packed_git **packs_head,
    + 	unsigned char *sha1, const char *base_url)
    + {
    +-	struct packfile_store *packs = the_repository->objects->packfiles;
    + 	struct packed_git *new_pack, *p;
    + 	char *tmp_idx = NULL;
    + 	int ret;
     @@ http.c: static int fetch_and_setup_pack_index(struct packed_git **packs_head,
      	 * If we already have the pack locally, no need to fetch its index or
      	 * even add it to list; we already have all of its objects.
      	 */
     -	for (p = packfile_store_get_all_packs(packs); p; p = p->next) {
    -+	packfile_store_for_each_pack(packs, p) {
    ++	repo_for_each_pack(the_repository, p) {
      		if (hasheq(p->hash, sha1, the_repository->hash_algo))
      			return 0;
      	}
    @@ object-name.c: static void find_short_packed_object(struct disambiguate_state *d
      
     -	for (p = packfile_store_get_all_packs(ds->repo->objects->packfiles); p && !ds->ambiguous;
     -	     p = p->next)
    -+	packfile_store_for_each_pack(ds->repo->objects->packfiles, p) {
    ++	repo_for_each_pack(ds->repo, p) {
     +		if (ds->ambiguous)
     +			break;
      		unique_in_pack(p, ds);
    @@ object-name.c: static void find_abbrev_len_packed(struct min_abbrev_data *mad)
      	}
      
     -	for (p = packfile_store_get_all_packs(mad->repo->objects->packfiles); p; p = p->next)
    -+	packfile_store_for_each_pack(mad->repo->objects->packfiles, p)
    ++	repo_for_each_pack(mad->repo, p)
      		find_abbrev_len_for_pack(p, mad);
      }
      
    @@ pack-bitmap.c: static int open_pack_bitmap(struct repository *r,
      	int ret = -1;
      
     -	for (p = packfile_store_get_all_packs(r->objects->packfiles); p; p = p->next) {
    -+	packfile_store_for_each_pack(r->objects->packfiles, p) {
    ++	repo_for_each_pack(r, p) {
      		if (open_pack_bitmap_1(bitmap_git, p) == 0) {
      			ret = 0;
      			/*
    @@ pack-bitmap.c: int verify_bitmap_files(struct repository *r)
      
     -	for (struct packed_git *p = packfile_store_get_all_packs(r->objects->packfiles);
     -	     p; p = p->next) {
    -+	packfile_store_for_each_pack(r->objects->packfiles, p) {
    ++	repo_for_each_pack(r, p) {
      		char *pack_bitmap_name = pack_bitmap_filename(p);
      		res |= verify_bitmap_file(r->hash_algo, pack_bitmap_name);
      		free(pack_bitmap_name);
     
      ## pack-objects.c ##
    +@@ pack-objects.c: struct object_entry *packlist_find(struct packing_data *pdata,
    + 
    + static void prepare_in_pack_by_idx(struct packing_data *pdata)
    + {
    +-	struct packfile_store *packs = pdata->repo->objects->packfiles;
    + 	struct packed_git **mapping, *p;
    + 	int cnt = 0, nr = 1U << OE_IN_PACK_BITS;
    + 
     @@ pack-objects.c: static void prepare_in_pack_by_idx(struct packing_data *pdata)
      	 * (i.e. in_pack_idx also zero) should return NULL.
      	 */
      	mapping[cnt++] = NULL;
     -	for (p = packfile_store_get_all_packs(packs); p; p = p->next, cnt++) {
    -+	packfile_store_for_each_pack(packs, p) {
    ++	repo_for_each_pack(pdata->repo, p) {
      		if (cnt == nr) {
      			free(mapping);
      			return;
    @@ packfile.c: struct packed_git **kept_pack_cache(struct repository *r, unsigned f
      		 * the non-kept version.
      		 */
     -		for (p = packfile_store_get_all_packs(r->objects->packfiles); p; p = p->next) {
    -+		packfile_store_for_each_pack(r->objects->packfiles, p) {
    ++		repo_for_each_pack(r, p) {
      			if ((p->pack_keep && (flags & ON_DISK_KEEP_PACKS)) ||
      			    (p->pack_keep_in_core && (flags & IN_CORE_KEEP_PACKS))) {
      				ALLOC_GROW(packs, nr + 1, alloc);
    @@ packfile.c: int for_each_packed_object(struct repository *repo, each_packed_obje
      	int pack_errors = 0;
      
     -	for (p = packfile_store_get_all_packs(repo->objects->packfiles); p; p = p->next) {
    -+	packfile_store_for_each_pack(repo->objects->packfiles, p) {
    ++	repo_for_each_pack(repo, p) {
      		if ((flags & FOR_EACH_OBJECT_LOCAL_ONLY) && !p->pack_local)
      			continue;
      		if ((flags & FOR_EACH_OBJECT_PROMISOR_ONLY) &&
    @@ packfile.h: void packfile_store_reprepare(struct packfile_store *store);
      			     struct packed_git *pack);
      
     +/*
    -+ * Load and iterate through all packs of the given packfile store.
    ++ * Load and iterate through all packs of the given repository. This helper
    ++ * function will yield packfiles from all object sources connected to the
    ++ * repository.
     + */
    -+#define packfile_store_for_each_pack(store, p) \
    -+	for (p = packfile_store_get_all_packs(store); p; p = p->next)
    ++#define repo_for_each_pack(repo, p) \
    ++	for (p = packfile_store_get_all_packs(repo->objects->packfiles); p; p = p->next)
     +
      /*
       * Get all packs managed by the given store, including packfiles that are
       * referenced by multi-pack indices.
     
      ## repack-cruft.c ##
    -@@ repack-cruft.c: static void combine_small_cruft_packs(FILE *in, off_t combine_cruft_below_size,
    +@@
    + static void combine_small_cruft_packs(FILE *in, off_t combine_cruft_below_size,
    + 				      struct existing_packs *existing)
    + {
    +-	struct packfile_store *packs = existing->repo->objects->packfiles;
    + 	struct packed_git *p;
      	struct strbuf buf = STRBUF_INIT;
      	size_t i;
      
     -	for (p = packfile_store_get_all_packs(packs); p; p = p->next) {
    -+	packfile_store_for_each_pack(packs, p) {
    ++	repo_for_each_pack(existing->repo, p) {
      		if (!(p->is_cruft && p->pack_local))
      			continue;
      
     
      ## repack-geometry.c ##
     @@ repack-geometry.c: void pack_geometry_init(struct pack_geometry *geometry,
    + 			struct existing_packs *existing,
    + 			const struct pack_objects_args *args)
    + {
    +-	struct packfile_store *packs = existing->repo->objects->packfiles;
      	struct packed_git *p;
      	struct strbuf buf = STRBUF_INIT;
      
     -	for (p = packfile_store_get_all_packs(packs); p; p = p->next) {
    -+	packfile_store_for_each_pack(packs, p) {
    ++	repo_for_each_pack(existing->repo, p) {
      		if (args->local && !p->pack_local)
      			/*
      			 * When asked to only repack local packfiles we skip
     
      ## repack.c ##
    -@@ repack.c: void existing_packs_collect(struct existing_packs *existing,
    +@@ repack.c: int finish_pack_objects_cmd(const struct git_hash_algo *algop,
    + void existing_packs_collect(struct existing_packs *existing,
    + 			    const struct string_list *extra_keep)
    + {
    +-	struct packfile_store *packs = existing->repo->objects->packfiles;
      	struct packed_git *p;
      	struct strbuf buf = STRBUF_INIT;
      
     -	for (p = packfile_store_get_all_packs(packs); p; p = p->next) {
    -+	packfile_store_for_each_pack(packs, p) {
    ++	repo_for_each_pack(existing->repo, p) {
      		size_t i;
      		const char *base;
      
     
      ## server-info.c ##
    -@@ server-info.c: static void init_pack_info(struct repository *r, const char *infofile, int force
    +@@ server-info.c: static int compare_info(const void *a_, const void *b_)
    + 
    + static void init_pack_info(struct repository *r, const char *infofile, int force)
    + {
    +-	struct packfile_store *packs = r->objects->packfiles;
    + 	struct packed_git *p;
    + 	int stale;
      	int i;
      	size_t alloc = 0;
      
     -	for (p = packfile_store_get_all_packs(packs); p; p = p->next) {
    -+	packfile_store_for_each_pack(packs, p) {
    ++	repo_for_each_pack(r, p) {
      		/* we ignore things on alternate path since they are
      		 * not available to the pullers in general.
      		 */
    @@ t/helper/test-find-pack.c: int cmd__find_pack(int argc, const char **argv)
      		die("cannot parse %s as an object name", argv[0]);
      
     -	for (p = packfile_store_get_all_packs(the_repository->objects->packfiles); p; p = p->next)
    -+	packfile_store_for_each_pack(the_repository->objects->packfiles, p) {
    ++	repo_for_each_pack(the_repository, p) {
      		if (find_pack_entry_one(&oid, p)) {
      			printf("%s\n", p->pack_name);
      			actual_count++;
    @@ t/helper/test-pack-mtimes.c: int cmd__pack_mtimes(int argc, const char **argv)
      		usage(pack_mtimes_usage);
      
     -	for (p = packfile_store_get_all_packs(the_repository->objects->packfiles); p; p = p->next) {
    -+	packfile_store_for_each_pack(the_repository->objects->packfiles, p) {
    ++	repo_for_each_pack(the_repository, p) {
      		strbuf_addstr(&buf, basename(p->pack_name));
      		strbuf_strip_suffix(&buf, ".pack");
      		strbuf_addstr(&buf, ".mtimes");
6:  ceceb9cc71 ! 6:  a688fef987 packfile: rename `packfile_store_get_all_packs()`
    @@ packfile.c: void packfile_store_reprepare(struct packfile_store *store)
     
      ## packfile.h ##
     @@ packfile.h: void packfile_store_add_pack(struct packfile_store *store,
    -  * Load and iterate through all packs of the given packfile store.
    +  * repository.
       */
    - #define packfile_store_for_each_pack(store, p) \
    --	for (p = packfile_store_get_all_packs(store); p; p = p->next)
    -+	for (p = packfile_store_get_packs(store); p; p = p->next)
    + #define repo_for_each_pack(repo, p) \
    +-	for (p = packfile_store_get_all_packs(repo->objects->packfiles); p; p = p->next)
    ++	for (p = packfile_store_get_packs(repo->objects->packfiles); p; p = p->next)
      
      /*
       * Get all packs managed by the given store, including packfiles that are

--- base-commit: a0cb7ee3bf6c8398ab18e7b0dfabec106312b2f8 change-id: 20250926-pks-packfiles-convert-get-all-4236f6e2ed9b

Previous: Patrick SteinhardtNext: Patrick Steinhardt
Message 17 of 27 in “packfile: remove `packfile_store_get_packs()`”
  1. 0/6 packfile: remove `packfile_store_get_packs()`Patrick Steinhardt, Oct 7, 2025
  2. 1/6 object-name: convert to use `packfile_store_get_all_packs()`Patrick Steinhardt, Oct 7, 2025
  3. Taylor BlauOct 8, 2025
  4. 2/6 builtin/gc: convert to use `packfile_store_get_all_packs()`Patrick Steinhardt, Oct 7, 2025
  5. Taylor BlauOct 8, 2025
  6. Patrick SteinhardtOct 9, 2025
  7. 3/6 builtin/grep: simplify how we preload packsPatrick Steinhardt, Oct 7, 2025
  8. Taylor BlauOct 8, 2025
  9. 4/6 packfile: drop `packfile_store_get_packs()`Patrick Steinhardt, Oct 7, 2025
  10. Taylor BlauOct 8, 2025
  11. 5/6 packfile: introduce macro to iterate through packsPatrick Steinhardt, Oct 7, 2025
  12. Taylor BlauOct 8, 2025
  13. Patrick SteinhardtOct 9, 2025
  14. 6/6 packfile: rename `packfile_store_get_all_packs()`Patrick Steinhardt, Oct 7, 2025
  15. Taylor BlauOct 8, 2025
  16. Patrick SteinhardtOct 9, 2025
  17. 0/6 packfile: remove `packfile_store_get_packs()`Patrick Steinhardt, Oct 9, 2025
  18. 1/6 object-name: convert to use `packfile_store_get_all_packs()`Patrick Steinhardt, Oct 9, 2025
  19. Justin ToblerOct 14, 2025
  20. 2/6 builtin/gc: convert to use `packfile_store_get_all_packs()`Patrick Steinhardt, Oct 9, 2025
  21. 3/6 builtin/grep: simplify how we preload packsPatrick Steinhardt, Oct 9, 2025
  22. 4/6 packfile: drop `packfile_store_get_packs()`Patrick Steinhardt, Oct 9, 2025
  23. Justin ToblerOct 14, 2025
  24. 5/6 packfile: introduce macro to iterate through packsPatrick Steinhardt, Oct 9, 2025
  25. Justin ToblerOct 14, 2025
  26. 6/6 packfile: rename `packfile_store_get_all_packs()`Patrick Steinhardt, Oct 9, 2025
  27. Justin ToblerOct 14, 2025

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.