]> git.ipfire.org Git - thirdparty/git.git/commitdiff
packfile: split out packfile list logic
authorPatrick Steinhardt <ps@pks.im>
Wed, 17 Jun 2026 06:39:45 +0000 (08:39 +0200)
committerJunio C Hamano <gitster@pobox.com>
Wed, 17 Jun 2026 12:00:00 +0000 (05:00 -0700)
In the next commit we're about to introduce the "packed" object database
source. This source will embed a packfile list, and consequently we'll
have to include "packfile.h" to make the struct definition available.
This will unfortunately lead to a cyclic dependency that we cannot
resolve with a forward declaration.

Split out the code that relates to the packfile list into a separate
compilation unit so that both "packfile.h" and "odb/source-packed.h" can
include it.

Signed-off-by: Patrick Steinhardt <ps@pks.im>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Makefile
meson.build
packfile-list.c [new file with mode: 0644]
packfile-list.h [new file with mode: 0644]
packfile.c
packfile.h

index 0976a69b4ca424fd1b66b704c31a7f88686ee86d..ed1731548e903f02ac16c6a2455413247452458f 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -1233,6 +1233,7 @@ LIB_OBJS += pack-refs.o
 LIB_OBJS += pack-revindex.o
 LIB_OBJS += pack-write.o
 LIB_OBJS += packfile.o
+LIB_OBJS += packfile-list.o
 LIB_OBJS += pager.o
 LIB_OBJS += parallel-checkout.o
 LIB_OBJS += parse.o
index 3247697f74aae13a61a1f49300b4231113283e04..12913fc9489ec31a83065aa234c1add42bb49efa 100644 (file)
@@ -421,6 +421,7 @@ libgit_sources = [
   'pack-revindex.c',
   'pack-write.c',
   'packfile.c',
+  'packfile-list.c',
   'pager.c',
   'parallel-checkout.c',
   'parse.c',
diff --git a/packfile-list.c b/packfile-list.c
new file mode 100644 (file)
index 0000000..01fb913
--- /dev/null
@@ -0,0 +1,86 @@
+#include "git-compat-util.h"
+#include "packfile.h"
+#include "packfile-list.h"
+
+void packfile_list_clear(struct packfile_list *list)
+{
+       struct packfile_list_entry *e, *next;
+
+       for (e = list->head; e; e = next) {
+               next = e->next;
+               free(e);
+       }
+
+       list->head = list->tail = NULL;
+}
+
+static struct packfile_list_entry *packfile_list_remove_internal(struct packfile_list *list,
+                                                                struct packed_git *pack)
+{
+       struct packfile_list_entry *e, *prev;
+
+       for (e = list->head, prev = NULL; e; prev = e, e = e->next) {
+               if (e->pack != pack)
+                       continue;
+
+               if (prev)
+                       prev->next = e->next;
+               if (list->head == e)
+                       list->head = e->next;
+               if (list->tail == e)
+                       list->tail = prev;
+
+               return e;
+       }
+
+       return NULL;
+}
+
+void packfile_list_remove(struct packfile_list *list, struct packed_git *pack)
+{
+       free(packfile_list_remove_internal(list, pack));
+}
+
+void packfile_list_prepend(struct packfile_list *list, struct packed_git *pack)
+{
+       struct packfile_list_entry *entry;
+
+       entry = packfile_list_remove_internal(list, pack);
+       if (!entry) {
+               entry = xmalloc(sizeof(*entry));
+               entry->pack = pack;
+       }
+       entry->next = list->head;
+
+       list->head = entry;
+       if (!list->tail)
+               list->tail = entry;
+}
+
+void packfile_list_append(struct packfile_list *list, struct packed_git *pack)
+{
+       struct packfile_list_entry *entry;
+
+       entry = packfile_list_remove_internal(list, pack);
+       if (!entry) {
+               entry = xmalloc(sizeof(*entry));
+               entry->pack = pack;
+       }
+       entry->next = NULL;
+
+       if (list->tail) {
+               list->tail->next = entry;
+               list->tail = entry;
+       } else {
+               list->head = list->tail = entry;
+       }
+}
+
+struct packed_git *packfile_list_find_oid(struct packfile_list_entry *packs,
+                                         const struct object_id *oid)
+{
+       for (; packs; packs = packs->next)
+               if (find_pack_entry_one(oid, packs->pack))
+                       return packs->pack;
+       return NULL;
+}
diff --git a/packfile-list.h b/packfile-list.h
new file mode 100644 (file)
index 0000000..1b05e2a
--- /dev/null
@@ -0,0 +1,28 @@
+#ifndef PACKFILE_LIST_H
+#define PACKFILE_LIST_H
+
+struct object_id;
+
+struct packfile_list {
+       struct packfile_list_entry *head, *tail;
+};
+
+struct packfile_list_entry {
+       struct packfile_list_entry *next;
+       struct packed_git *pack;
+};
+
+void packfile_list_clear(struct packfile_list *list);
+void packfile_list_remove(struct packfile_list *list, struct packed_git *pack);
+void packfile_list_prepend(struct packfile_list *list, struct packed_git *pack);
+void packfile_list_append(struct packfile_list *list, struct packed_git *pack);
+
+/*
+ * Find the pack within the "packs" list whose index contains the object
+ * "oid". For general object lookups, you probably don't want this; use
+ * find_pack_entry() instead.
+ */
+struct packed_git *packfile_list_find_oid(struct packfile_list_entry *packs,
+                                         const struct object_id *oid);
+
+#endif
index a2d768d0ae4bdd1ba4281ea3d92e5f444db1623b..27ea4a8436a53591998efa06330cf43d773d730d 100644 (file)
@@ -48,89 +48,6 @@ static size_t pack_mapped;
 #define SZ_FMT PRIuMAX
 static inline uintmax_t sz_fmt(size_t s) { return s; }
 
-void packfile_list_clear(struct packfile_list *list)
-{
-       struct packfile_list_entry *e, *next;
-
-       for (e = list->head; e; e = next) {
-               next = e->next;
-               free(e);
-       }
-
-       list->head = list->tail = NULL;
-}
-
-static struct packfile_list_entry *packfile_list_remove_internal(struct packfile_list *list,
-                                                                struct packed_git *pack)
-{
-       struct packfile_list_entry *e, *prev;
-
-       for (e = list->head, prev = NULL; e; prev = e, e = e->next) {
-               if (e->pack != pack)
-                       continue;
-
-               if (prev)
-                       prev->next = e->next;
-               if (list->head == e)
-                       list->head = e->next;
-               if (list->tail == e)
-                       list->tail = prev;
-
-               return e;
-       }
-
-       return NULL;
-}
-
-void packfile_list_remove(struct packfile_list *list, struct packed_git *pack)
-{
-       free(packfile_list_remove_internal(list, pack));
-}
-
-void packfile_list_prepend(struct packfile_list *list, struct packed_git *pack)
-{
-       struct packfile_list_entry *entry;
-
-       entry = packfile_list_remove_internal(list, pack);
-       if (!entry) {
-               entry = xmalloc(sizeof(*entry));
-               entry->pack = pack;
-       }
-       entry->next = list->head;
-
-       list->head = entry;
-       if (!list->tail)
-               list->tail = entry;
-}
-
-void packfile_list_append(struct packfile_list *list, struct packed_git *pack)
-{
-       struct packfile_list_entry *entry;
-
-       entry = packfile_list_remove_internal(list, pack);
-       if (!entry) {
-               entry = xmalloc(sizeof(*entry));
-               entry->pack = pack;
-       }
-       entry->next = NULL;
-
-       if (list->tail) {
-               list->tail->next = entry;
-               list->tail = entry;
-       } else {
-               list->head = list->tail = entry;
-       }
-}
-
-struct packed_git *packfile_list_find_oid(struct packfile_list_entry *packs,
-                                         const struct object_id *oid)
-{
-       for (; packs; packs = packs->next)
-               if (find_pack_entry_one(oid, packs->pack))
-                       return packs->pack;
-       return NULL;
-}
-
 void pack_report(struct repository *repo)
 {
        fprintf(stderr,
index 9cec15bc50a22336ba991a3f08858b4505d5e25d..4e3d701a3a25042b77b13e4ba35d459a4c13b8ca 100644 (file)
@@ -6,6 +6,7 @@
 #include "odb.h"
 #include "odb/source-files.h"
 #include "oidset.h"
+#include "packfile-list.h"
 #include "repository.h"
 #include "strmap.h"
 
@@ -54,28 +55,6 @@ struct packed_git {
        char pack_name[FLEX_ARRAY]; /* more */
 };
 
-struct packfile_list {
-       struct packfile_list_entry *head, *tail;
-};
-
-struct packfile_list_entry {
-       struct packfile_list_entry *next;
-       struct packed_git *pack;
-};
-
-void packfile_list_clear(struct packfile_list *list);
-void packfile_list_remove(struct packfile_list *list, struct packed_git *pack);
-void packfile_list_prepend(struct packfile_list *list, struct packed_git *pack);
-void packfile_list_append(struct packfile_list *list, struct packed_git *pack);
-
-/*
- * Find the pack within the "packs" list whose index contains the object
- * "oid". For general object lookups, you probably don't want this; use
- * find_pack_entry() instead.
- */
-struct packed_git *packfile_list_find_oid(struct packfile_list_entry *packs,
-                                         const struct object_id *oid);
-
 /*
  * A store that manages packfiles for a given object database.
  */