]> git.ipfire.org Git - thirdparty/git.git/commitdiff
odb: add `source` field to struct object_info_source
authorPatrick Steinhardt <ps@pks.im>
Thu, 2 Jul 2026 12:02:01 +0000 (14:02 +0200)
committerJunio C Hamano <gitster@pobox.com>
Thu, 2 Jul 2026 16:52:32 +0000 (09:52 -0700)
The previous commit introduced `struct object_info_source` as an opt-in
container for backend-specific information, but for now we only moved
preexisting data into this structure. Most importantly, the caller has
no way yet to learn about which source an object was actually looked up
from. Instead, callers have to rely on the `whence` enum to distinguish
the object type, but cannot use that enum to tell the object source.

Add a `struct odb_source *source` field to the structure and populate it
from each backend's lookup path.

The `whence` enum is still set and used by callers; it will be removed
in a subsequent commit now that `sourcep->source` can identify the
backend on its own.

Signed-off-by: Patrick Steinhardt <ps@pks.im>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
builtin/cat-file.c
builtin/index-pack.c
builtin/pack-objects.c
odb.c
odb.h
odb/source-inmemory.c
odb/source-loose.c
packfile.c
reachable.c

index adc626ce30ee330fcd61f8f85e005f6f697e27fc..0aca6acb753312c1faffe46c5ccc3ec4767c1742 100644 (file)
@@ -835,8 +835,8 @@ static int batch_one_object_oi(const struct object_id *oid,
 {
        struct for_each_object_payload *payload = _payload;
        if (oi && oi->whence == OI_PACKED)
-               return payload->callback(oid, oi->sourcep->u.packed.pack,
-                                        oi->sourcep->u.packed.offset,
+               return payload->callback(oid, oi->source_infop->u.packed.pack,
+                                        oi->source_infop->u.packed.offset,
                                         payload->payload);
        return payload->callback(oid, NULL, 0, payload->payload);
 }
@@ -907,9 +907,9 @@ static void batch_each_object(struct batch_options *opt,
                                                &payload, flags);
                }
        } else {
-               struct object_info_source oi_source;
+               struct odb_source_info source_info;
                struct object_info oi = {
-                       .sourcep = &oi_source,
+                       .source_infop = &source_info,
                };
 
                for (source = the_repository->objects->sources; source; source = source->next) {
index 77af26db8fc0f34c6d985795861e20602439c7a3..fe6e70522d648d3b73e74d0fef16ecd947aa67b1 100644 (file)
@@ -1825,15 +1825,15 @@ static void repack_local_links(void)
 
        oidset_iter_init(&outgoing_links, &iter);
        while ((oid = oidset_iter_next(&iter))) {
-               struct object_info_source info_source;
+               struct odb_source_info source_info;
                struct object_info info = {
-                       .sourcep = &info_source,
+                       .source_infop = &source_info,
                };
 
                if (odb_read_object_info_extended(the_repository->objects, oid, &info, 0))
                        /* Missing; assume it is a promisor object */
                        continue;
-               if (info.whence == OI_PACKED && info_source.u.packed.pack->pack_promisor)
+               if (info.whence == OI_PACKED && source_info.u.packed.pack->pack_promisor)
                        continue;
 
                if (!cmd.args.nr) {
index 9deb37e9e87efeeafe53b093c3e8a4d0bc8bec13..b7ef90f67c68f4df9f3b1e3d646b50a2b7ad3291 100644 (file)
@@ -4491,8 +4491,8 @@ static int add_object_in_unpacked_pack(const struct object_id *oid,
                                       void *data UNUSED)
 {
        if (cruft) {
-               add_cruft_object_entry(oid, OBJ_NONE, oi->sourcep->u.packed.pack,
-                                      oi->sourcep->u.packed.offset, NULL,
+               add_cruft_object_entry(oid, OBJ_NONE, oi->source_infop->u.packed.pack,
+                                      oi->source_infop->u.packed.offset, NULL,
                                       *oi->mtimep);
        } else {
                add_object_entry(oid, OBJ_NONE, "", 0);
@@ -4510,10 +4510,10 @@ static void add_objects_in_unpacked_packs(void)
                         ODB_FOR_EACH_OBJECT_SKIP_IN_CORE_KEPT_PACKS |
                         ODB_FOR_EACH_OBJECT_SKIP_ON_DISK_KEPT_PACKS,
        };
-       struct object_info_source oi_source;
+       struct odb_source_info source_info;
        struct object_info oi = {
                .mtimep = &mtime,
-               .sourcep = &oi_source,
+               .source_infop = &source_info,
        };
 
        odb_prepare_alternates(to_pack.repo->objects);
@@ -5003,14 +5003,14 @@ static int option_parse_cruft_expiration(const struct option *opt UNUSED,
 
 static int is_not_in_promisor_pack_obj(struct object *obj, void *data UNUSED)
 {
-       struct object_info_source info_source;
+       struct odb_source_info source_info;
        struct object_info info = {
-               .sourcep = &info_source,
+               .source_infop = &source_info,
        };
 
        if (odb_read_object_info_extended(the_repository->objects, &obj->oid, &info, 0))
                BUG("should_include_obj should only be called on existing objects");
-       return info.whence != OI_PACKED || !info_source.u.packed.pack->pack_promisor;
+       return info.whence != OI_PACKED || !source_info.u.packed.pack->pack_promisor;
 }
 
 static int is_not_in_promisor_pack(struct commit *commit, void *data) {
diff --git a/odb.c b/odb.c
index 99f4e7551c427432041e3f6800b7cda0a8ba296d..34c35c47a54d58df18047fcd48ff1dc8e8c7b424 100644 (file)
--- a/odb.c
+++ b/odb.c
@@ -692,8 +692,8 @@ static int oid_object_info_convert(struct repository *r,
                }
        }
        input_oi->whence = new_oi.whence;
-       if (input_oi->sourcep)
-               *input_oi->sourcep = *new_oi.sourcep;
+       if (input_oi->source_infop)
+               *input_oi->source_infop = *new_oi.source_infop;
        return ret;
 }
 
diff --git a/odb.h b/odb.h
index 770900289ab2170fe11357e363eab2078b97a065..659bf8afe145917e911a576a5587d2f9bfd03ab0 100644 (file)
--- a/odb.h
+++ b/odb.h
@@ -249,10 +249,13 @@ int odb_pretend_object(struct object_database *odb,
                       struct object_id *oid);
 
 /*
- * Object information that can be used to uniquely identify an object and learn
- * more about how exactly it is stored.
+ * Object database source information that can be used to uniquely identify an
+ * object and learn more about how exactly it is stored.
  */
-struct object_info_source {
+struct odb_source_info {
+       /* The source that this object has been looked up from. */
+       struct odb_source *source;
+
        /*
         * Backend-specific information about the specific object. This can be
         * used for example to uniquely identify a given object in case it
@@ -307,7 +310,7 @@ struct object_info {
         * object lookups in case the same object exists in multiple sources,
         * or multiple times in the same source.
         */
-       struct object_info_source *sourcep;
+       struct odb_source_info *source_infop;
 
        /* Response */
        enum {
index e004566d768b01c62163c9cfef34a664ba102a56..1d173bfa46d12f75ba30fa830616d60f317220de 100644 (file)
@@ -52,6 +52,9 @@ static void populate_object_info(struct odb_source_inmemory *source,
                *oi->contentp = xmemdupz(object->buf, object->size);
        if (oi->mtimep)
                *oi->mtimep = 0;
+       if (oi->source_infop)
+               oi->source_infop->source = &source->base;
+
        oi->whence = OI_CACHED;
 }
 
index 66e6bb8d3f800451d68a9cafddd7d267754f0993..c254957602f4d183198b8f1cf16628d1c728b108 100644 (file)
@@ -196,6 +196,8 @@ out:
                        oi->typep = NULL;
                if (oi->delta_base_oid)
                        oidclr(oi->delta_base_oid, loose->base.odb->repo->hash_algo);
+               if (oi->source_infop && !ret)
+                       oi->source_infop->source = &loose->base;
                if (!ret)
                        oi->whence = OI_LOOSE;
        }
index 688c410b35fc251dce7d679453ebdcab73cb95ea..ce51d1e5a371cc960997875a5d86e8ff80c66cbf 100644 (file)
@@ -1324,7 +1324,7 @@ static void add_delta_base_cache(struct packed_git *p, off_t base_offset,
        hashmap_add(&delta_base_cache, &ent->ent);
 }
 
-int packed_object_info_with_index_pos(struct odb_source_packed *source UNUSED,
+int packed_object_info_with_index_pos(struct odb_source_packed *source,
                                      struct packed_git *p, off_t obj_offset,
                                      uint32_t *maybe_index_pos, struct object_info *oi)
 {
@@ -1423,22 +1423,26 @@ int packed_object_info_with_index_pos(struct odb_source_packed *source UNUSED,
 
        oi->whence = OI_PACKED;
 
-       if (oi->sourcep) {
-               oi->sourcep->u.packed.offset = obj_offset;
-               oi->sourcep->u.packed.pack = p;
+       if (oi->source_infop) {
+               if (!source)
+                       BUG("cannot request source without an owning source");
+               oi->source_infop->source = &source->base;
+
+               oi->source_infop->u.packed.offset = obj_offset;
+               oi->source_infop->u.packed.pack = p;
 
                switch (type) {
                case OBJ_NONE:
-                       oi->sourcep->u.packed.type = PACKED_OBJECT_TYPE_UNKNOWN;
+                       oi->source_infop->u.packed.type = PACKED_OBJECT_TYPE_UNKNOWN;
                        break;
                case OBJ_REF_DELTA:
-                       oi->sourcep->u.packed.type = PACKED_OBJECT_TYPE_REF_DELTA;
+                       oi->source_infop->u.packed.type = PACKED_OBJECT_TYPE_REF_DELTA;
                        break;
                case OBJ_OFS_DELTA:
-                       oi->sourcep->u.packed.type = PACKED_OBJECT_TYPE_OFS_DELTA;
+                       oi->source_infop->u.packed.type = PACKED_OBJECT_TYPE_OFS_DELTA;
                        break;
                default:
-                       oi->sourcep->u.packed.type = PACKED_OBJECT_TYPE_FULL;
+                       oi->source_infop->u.packed.type = PACKED_OBJECT_TYPE_FULL;
                        break;
                }
        }
index 2fc5b82d62658b66491a8189b535f53b2c172226..bf76b48fc5fff0ae23c62b45418c156d81d12303 100644 (file)
@@ -235,8 +235,8 @@ static int add_recent_object(const struct object_id *oid,
        add_pending_object(data->revs, obj, "");
        if (data->cb) {
                if (oi->whence == OI_PACKED)
-                       data->cb(obj, oi->sourcep->u.packed.pack,
-                                oi->sourcep->u.packed.offset, *oi->mtimep);
+                       data->cb(obj, oi->source_infop->u.packed.pack,
+                                oi->source_infop->u.packed.offset, *oi->mtimep);
                else
                        data->cb(obj, NULL, 0, *oi->mtimep);
        }
@@ -253,11 +253,11 @@ int add_unseen_recent_objects_to_traversal(struct rev_info *revs,
        unsigned flags;
        enum object_type type;
        time_t mtime;
-       struct object_info_source oi_source;
+       struct odb_source_info source_info;
        struct object_info oi = {
                .mtimep = &mtime,
                .typep = &type,
-               .sourcep = &oi_source,
+               .source_infop = &source_info,
        };
        int r;