]> git.ipfire.org Git - thirdparty/git.git/commitdiff
packfile: use a `strmap` to store packs by name
authorPatrick Steinhardt <ps@pks.im>
Thu, 30 Oct 2025 10:38:38 +0000 (11:38 +0100)
committerJunio C Hamano <gitster@pobox.com>
Thu, 30 Oct 2025 14:09:52 +0000 (07:09 -0700)
To allow fast lookups of a packfile by name we use a hashmap that has
the packfile name as key and the pack itself as value. But while this is
the perfect use case for a `strmap`, we instead use `struct hashmap` and
store the hashmap entry in the packfile itself.

Simplify the code by using a `strmap` instead.

Signed-off-by: Patrick Steinhardt <ps@pks.im>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
packfile.c
packfile.h

index 1ae2b2fe1eda77a57f007f78726724bd26f6a743..04649e52920a1f35e2efb8e556991c2e019398c8 100644 (file)
@@ -788,8 +788,7 @@ void packfile_store_add_pack(struct packfile_store *store,
        pack->next = store->packs;
        store->packs = pack;
 
-       hashmap_entry_init(&pack->packmap_ent, strhash(pack->pack_name));
-       hashmap_add(&store->map, &pack->packmap_ent);
+       strmap_put(&store->packs_by_path, pack->pack_name, pack);
 }
 
 struct packed_git *packfile_store_load_pack(struct packfile_store *store,
@@ -806,8 +805,7 @@ struct packed_git *packfile_store_load_pack(struct packfile_store *store,
        strbuf_strip_suffix(&key, ".idx");
        strbuf_addstr(&key, ".pack");
 
-       p = hashmap_get_entry_from_hash(&store->map, strhash(key.buf), key.buf,
-                                       struct packed_git, packmap_ent);
+       p = strmap_get(&store->packs_by_path, key.buf);
        if (!p) {
                p = add_packed_git(store->odb->repo, idx_path,
                                   strlen(idx_path), local);
@@ -2311,27 +2309,13 @@ int parse_pack_header_option(const char *in, unsigned char *out, unsigned int *l
        return 0;
 }
 
-static int pack_map_entry_cmp(const void *cmp_data UNUSED,
-                             const struct hashmap_entry *entry,
-                             const struct hashmap_entry *entry2,
-                             const void *keydata)
-{
-       const char *key = keydata;
-       const struct packed_git *pg1, *pg2;
-
-       pg1 = container_of(entry, const struct packed_git, packmap_ent);
-       pg2 = container_of(entry2, const struct packed_git, packmap_ent);
-
-       return strcmp(pg1->pack_name, key ? key : pg2->pack_name);
-}
-
 struct packfile_store *packfile_store_new(struct object_database *odb)
 {
        struct packfile_store *store;
        CALLOC_ARRAY(store, 1);
        store->odb = odb;
        INIT_LIST_HEAD(&store->mru);
-       hashmap_init(&store->map, pack_map_entry_cmp, NULL, 0);
+       strmap_init(&store->packs_by_path);
        return store;
 }
 
@@ -2341,7 +2325,7 @@ void packfile_store_free(struct packfile_store *store)
                next = p->next;
                free(p);
        }
-       hashmap_clear(&store->map);
+       strmap_clear(&store->packs_by_path, 0);
        free(store);
 }
 
index c9d0b93446b5f569aadb12f48fce8ffc6aace59d..9da7f14317b02ca78111cd422996167b0b41a8e0 100644 (file)
@@ -5,12 +5,12 @@
 #include "object.h"
 #include "odb.h"
 #include "oidset.h"
+#include "strmap.h"
 
 /* in odb.h */
 struct object_info;
 
 struct packed_git {
-       struct hashmap_entry packmap_ent;
        struct packed_git *next;
        struct list_head mru;
        struct pack_window *windows;
@@ -85,7 +85,7 @@ struct packfile_store {
         * A map of packfile names to packed_git structs for tracking which
         * packs have been loaded already.
         */
-       struct hashmap map;
+       struct strmap packs_by_path;
 
        /*
         * Whether packfiles have already been populated with this store's