]> git.ipfire.org Git - thirdparty/git.git/commitdiff
loose: write loose objects map via their source
authorPatrick Steinhardt <ps@pks.im>
Thu, 17 Jul 2025 04:56:34 +0000 (06:56 +0200)
committerJunio C Hamano <gitster@pobox.com>
Thu, 17 Jul 2025 05:16:15 +0000 (22:16 -0700)
When a repository is configured to have a compatibility hash algorithm
we keep track of object ID mappings for loose objects via the loose
object map. This map simply maps an object ID of the actual hash to the
object ID of the compatibility hash. This loose object map is an
inherent property of the loose files backend and thus of one specific
object source.

Refactor the interfaces to reflect this by requiring a `struct
odb_source` as input instead of a repository. This prepares for
subsequent commits where we will refactor writing of loose objects to
work on a `struct odb_source`, as well.

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

diff --git a/loose.c b/loose.c
index 519f5db79352a11bfb38e2a913749be9eacabd7b..e8ea6e7e24ba31218579c92fb506b012f2b72f12 100644 (file)
--- a/loose.c
+++ b/loose.c
@@ -166,7 +166,8 @@ errout:
        return -1;
 }
 
-static int write_one_object(struct repository *repo, const struct object_id *oid,
+static int write_one_object(struct odb_source *source,
+                           const struct object_id *oid,
                            const struct object_id *compat_oid)
 {
        struct lock_file lock;
@@ -174,7 +175,7 @@ static int write_one_object(struct repository *repo, const struct object_id *oid
        struct stat st;
        struct strbuf buf = STRBUF_INIT, path = STRBUF_INIT;
 
-       repo_common_path_replace(repo, &path, "objects/loose-object-idx");
+       strbuf_addf(&path, "%s/loose-object-idx", source->path);
        hold_lock_file_for_update_timeout(&lock, path.buf, LOCK_DIE_ON_ERROR, -1);
 
        fd = open(path.buf, O_WRONLY | O_CREAT | O_APPEND, 0666);
@@ -190,7 +191,7 @@ static int write_one_object(struct repository *repo, const struct object_id *oid
                goto errout;
        if (close(fd))
                goto errout;
-       adjust_shared_perm(repo, path.buf);
+       adjust_shared_perm(source->odb->repo, path.buf);
        rollback_lock_file(&lock);
        strbuf_release(&buf);
        strbuf_release(&path);
@@ -204,17 +205,18 @@ errout:
        return -1;
 }
 
-int repo_add_loose_object_map(struct repository *repo, const struct object_id *oid,
+int repo_add_loose_object_map(struct odb_source *source,
+                             const struct object_id *oid,
                              const struct object_id *compat_oid)
 {
        int inserted = 0;
 
-       if (!should_use_loose_object_map(repo))
+       if (!should_use_loose_object_map(source->odb->repo))
                return 0;
 
-       inserted = insert_loose_map(repo->objects->sources, oid, compat_oid);
+       inserted = insert_loose_map(source, oid, compat_oid);
        if (inserted)
-               return write_one_object(repo, oid, compat_oid);
+               return write_one_object(source, oid, compat_oid);
        return 0;
 }
 
diff --git a/loose.h b/loose.h
index 28512306e5fec7e57cdab949e8444264c31eab75..6af1702973c05883f942201d5a3bb978e3cea9dd 100644 (file)
--- a/loose.h
+++ b/loose.h
@@ -4,6 +4,7 @@
 #include "khash.h"
 
 struct repository;
+struct odb_source;
 
 struct loose_object_map {
        kh_oid_map_t *to_compat;
@@ -16,7 +17,8 @@ int repo_loose_object_map_oid(struct repository *repo,
                              const struct object_id *src,
                              const struct git_hash_algo *dest_algo,
                              struct object_id *dest);
-int repo_add_loose_object_map(struct repository *repo, const struct object_id *oid,
+int repo_add_loose_object_map(struct odb_source *source,
+                             const struct object_id *oid,
                              const struct object_id *compat_oid);
 int repo_read_loose_object_map(struct repository *repo);
 int repo_write_loose_object_map(struct repository *repo);
index 6a7049a9e9819c0d4c47f58c2789bc9691a05fb0..a9248760a2682216c0ef53014fcdb2cb9f2aed59 100644 (file)
@@ -1025,7 +1025,7 @@ int stream_loose_object(struct input_stream *in_stream, size_t len,
        err = finalize_object_file_flags(the_repository, tmp_file.buf, filename.buf,
                                         FOF_SKIP_COLLISION_CHECK);
        if (!err && compat)
-               err = repo_add_loose_object_map(the_repository, oid, &compat_oid);
+               err = repo_add_loose_object_map(the_repository->objects->sources, oid, &compat_oid);
 cleanup:
        strbuf_release(&tmp_file);
        strbuf_release(&filename);
@@ -1069,7 +1069,7 @@ int write_object_file_flags(const void *buf, unsigned long len,
        if (write_loose_object(oid, hdr, hdrlen, buf, len, 0, flags))
                return -1;
        if (compat)
-               return repo_add_loose_object_map(repo, oid, &compat_oid);
+               return repo_add_loose_object_map(repo->objects->sources, oid, &compat_oid);
        return 0;
 }
 
@@ -1103,7 +1103,7 @@ int force_object_loose(const struct object_id *oid, time_t mtime)
        hdrlen = format_object_header(hdr, sizeof(hdr), type, len);
        ret = write_loose_object(oid, hdr, hdrlen, buf, len, mtime, 0);
        if (!ret && compat)
-               ret = repo_add_loose_object_map(the_repository, oid, &compat_oid);
+               ret = repo_add_loose_object_map(the_repository->objects->sources, oid, &compat_oid);
        free(buf);
 
        return ret;