]> git.ipfire.org Git - thirdparty/git.git/commitdiff
loose: load loose object map for the correct source
authorPatrick Steinhardt <ps@pks.im>
Fri, 24 Jul 2026 03:48:40 +0000 (05:48 +0200)
committerJunio C Hamano <gitster@pobox.com>
Fri, 24 Jul 2026 17:21:44 +0000 (10:21 -0700)
When loading the loose object map via `load_one_loose_object_map()` we
pass in both a repository and the corresponding source. We ultimately
don't really respect the passed-in source though as we instead always
load the map via the common directory. This doesn't make any sense
though, as the function is called in a loop through all sources, and as
such the expectation is that we'll load the map that belongs to the
given source.

Fix this bug by instead loading the map via the loose source's path.

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

diff --git a/loose.c b/loose.c
index bf01d3e42def345d199cef45512c14beefbcf1ee..9dad75373b80806e2c534fdcda4a2ac99f8a6c0b 100644 (file)
--- a/loose.c
+++ b/loose.c
@@ -61,9 +61,11 @@ static int insert_loose_map(struct odb_source_loose *loose,
        return inserted;
 }
 
-static int load_one_loose_object_map(struct repository *repo, struct odb_source_loose *loose)
+static int load_one_loose_object_map(struct odb_source_loose *loose)
 {
-       struct strbuf buf = STRBUF_INIT, path = STRBUF_INIT;
+       struct repository *repo = loose->base.odb->repo;
+       struct strbuf buf = STRBUF_INIT;
+       char *path;
        FILE *fp;
        int ret = -1;
 
@@ -78,10 +80,10 @@ static int load_one_loose_object_map(struct repository *repo, struct odb_source_
        insert_loose_map(loose, repo->hash_algo->empty_blob, repo->compat_hash_algo->empty_blob);
        insert_loose_map(loose, repo->hash_algo->null_oid, repo->compat_hash_algo->null_oid);
 
-       repo_common_path_replace(repo, &path, "objects/loose-object-idx");
-       fp = fopen(path.buf, "rb");
+       path = xstrfmt("%s/loose-object-idx", loose->base.path);
+       fp = fopen(path, "rb");
        if (!fp) {
-               strbuf_release(&path);
+               free(path);
                return 0;
        }
 
@@ -102,7 +104,7 @@ static int load_one_loose_object_map(struct repository *repo, struct odb_source_
 err:
        fclose(fp);
        strbuf_release(&buf);
-       strbuf_release(&path);
+       free(path);
        return ret;
 }
 
@@ -117,10 +119,10 @@ int repo_read_loose_object_map(struct repository *repo)
 
        for (source = repo->objects->sources; source; source = source->next) {
                struct odb_source_files *files = odb_source_files_downcast(source);
-               if (load_one_loose_object_map(repo, files->loose) < 0) {
+               if (load_one_loose_object_map(files->loose) < 0)
                        return -1;
-               }
        }
+
        return 0;
 }