]> git.ipfire.org Git - thirdparty/git.git/commitdiff
object-file: get rid of `the_repository` in `force_object_loose()`
authorPatrick Steinhardt <ps@pks.im>
Thu, 17 Jul 2025 04:56:41 +0000 (06:56 +0200)
committerJunio C Hamano <gitster@pobox.com>
Thu, 17 Jul 2025 05:16:17 +0000 (22:16 -0700)
The function `force_object_loose()` forces an object to become a loose
object in case it only exists in its packed form. To do so it implicitly
relies on `the_repository`.

Refactor the function by passing a `struct odb_source` as parameter.
While the check whether any such loose object exists already acts on the
whole object database, writing the loose object happens in one specific
source.

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

index 9e85293730be1aa999f601951a35f3c24d9c628e..7ff79d6b376852ef4cfb7c8dfcea4b83f02e1aee 100644 (file)
@@ -4411,7 +4411,8 @@ static void loosen_unused_packed_objects(void)
                        if (!packlist_find(&to_pack, &oid) &&
                            !has_sha1_pack_kept_or_nonlocal(&oid) &&
                            !loosened_object_can_be_discarded(&oid, p->mtime)) {
-                               if (force_object_loose(&oid, p->mtime))
+                               if (force_object_loose(the_repository->objects->sources,
+                                                      &oid, p->mtime))
                                        die(_("unable to force loose object"));
                                loosened_objects_nr++;
                        }
index f7c07acadc91ab2caec6c72500370987473f14aa..e9152d9e04c26bf78d68304bea9d8a74dc7112de 100644 (file)
@@ -1077,10 +1077,10 @@ int write_object_file(struct odb_source *source,
        return 0;
 }
 
-int force_object_loose(const struct object_id *oid, time_t mtime)
+int force_object_loose(struct odb_source *source,
+                      const struct object_id *oid, time_t mtime)
 {
-       struct repository *repo = the_repository;
-       const struct git_hash_algo *compat = repo->compat_hash_algo;
+       const struct git_hash_algo *compat = source->odb->repo->compat_hash_algo;
        void *buf;
        unsigned long len;
        struct object_info oi = OBJECT_INFO_INIT;
@@ -1090,24 +1090,24 @@ int force_object_loose(const struct object_id *oid, time_t mtime)
        int hdrlen;
        int ret;
 
-       for (struct odb_source *source = repo->objects->sources; source; source = source->next)
-               if (has_loose_object(source, oid))
+       for (struct odb_source *s = source->odb->sources; s; s = s->next)
+               if (has_loose_object(s, oid))
                        return 0;
 
        oi.typep = &type;
        oi.sizep = &len;
        oi.contentp = &buf;
-       if (odb_read_object_info_extended(the_repository->objects, oid, &oi, 0))
+       if (odb_read_object_info_extended(source->odb, oid, &oi, 0))
                return error(_("cannot read object for %s"), oid_to_hex(oid));
        if (compat) {
-               if (repo_oid_to_algop(repo, oid, compat, &compat_oid))
+               if (repo_oid_to_algop(source->odb->repo, oid, compat, &compat_oid))
                        return error(_("cannot map object %s to %s"),
                                     oid_to_hex(oid), compat->name);
        }
        hdrlen = format_object_header(hdr, sizeof(hdr), type, len);
-       ret = write_loose_object(repo->objects->sources, oid, hdr, hdrlen, buf, len, mtime, 0);
+       ret = write_loose_object(source, oid, hdr, hdrlen, buf, len, mtime, 0);
        if (!ret && compat)
-               ret = repo_add_loose_object_map(the_repository->objects->sources, oid, &compat_oid);
+               ret = repo_add_loose_object_map(source, oid, &compat_oid);
        free(buf);
 
        return ret;
index 52f7979267d08c9d0eb2839424b1d01043897dd5..15d97630d3b11b5b4f94f9f6b9d39502928101df 100644 (file)
@@ -161,7 +161,8 @@ int stream_loose_object(struct odb_source *source,
                        struct input_stream *in_stream, size_t len,
                        struct object_id *oid);
 
-int force_object_loose(const struct object_id *oid, time_t mtime);
+int force_object_loose(struct odb_source *source,
+                      const struct object_id *oid, time_t mtime);
 
 /**
  * With in-core object data in "buf", rehash it to make sure the