]> git.ipfire.org Git - thirdparty/git.git/commitdiff
packfile: extend `is_delta` field to allow for "unknown" state
authorPatrick Steinhardt <ps@pks.im>
Wed, 7 Jan 2026 13:08:02 +0000 (14:08 +0100)
committerJunio C Hamano <gitster@pobox.com>
Thu, 8 Jan 2026 02:04:22 +0000 (11:04 +0900)
The `struct object_info::u::packed::is_delta` field determines whether
or not a specific object is stored as a delta. It only stores whether or
not the object is stored as delta, so it is treated as a boolean value.

This boolean is insufficient though: when reading a packed object via
`packfile_store_read_object_info()` we know to skip parsing the actual
object when the user didn't request any object-specific data. In that
case we won't read the object itself, but will only look up its position
in the packfile. Consequently, we do not know whether it is a delta or
not.

This isn't really an issue right now, as the check for an empty request
is broken. But a subsequent commit will fix it, and once we do we will
have the need to also represent an "unknown" delta state.

Prepare for this change by introducing a new enum that encodes the
object type. We don't use the "unknown" state just yet, but will start
to do so in a subsequent commit.

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

diff --git a/odb.h b/odb.h
index 73b0b87ad55cf28462f78232d213c528675abd13..afae5e5c0190ad5c1ec929547c287a66546ec816 100644 (file)
--- a/odb.h
+++ b/odb.h
@@ -343,7 +343,12 @@ struct object_info {
                struct {
                        struct packed_git *pack;
                        off_t offset;
-                       unsigned int is_delta;
+                       enum packed_object_type {
+                               PACKED_OBJECT_TYPE_UNKNOWN,
+                               PACKED_OBJECT_TYPE_FULL,
+                               PACKED_OBJECT_TYPE_OFS_DELTA,
+                               PACKED_OBJECT_TYPE_REF_DELTA,
+                       } type;
                } packed;
        } u;
 };
index b0c6665c878d9e1112472051f2a325f77bceb44c..cc797b2b6ab7b8b32c40c2bb6a822558f8d3edde 100644 (file)
@@ -2159,8 +2159,18 @@ int packfile_store_read_object_info(struct packfile_store *store,
        if (oi->whence == OI_PACKED) {
                oi->u.packed.offset = e.offset;
                oi->u.packed.pack = e.p;
-               oi->u.packed.is_delta = (rtype == OBJ_REF_DELTA ||
-                                        rtype == OBJ_OFS_DELTA);
+
+               switch (rtype) {
+               case OBJ_REF_DELTA:
+                       oi->u.packed.type = PACKED_OBJECT_TYPE_REF_DELTA;
+                       break;
+               case OBJ_OFS_DELTA:
+                       oi->u.packed.type = PACKED_OBJECT_TYPE_OFS_DELTA;
+                       break;
+               default:
+                       oi->u.packed.type = PACKED_OBJECT_TYPE_FULL;
+                       break;
+               }
        }
 
        return 0;
@@ -2531,7 +2541,8 @@ int packfile_store_read_object_stream(struct odb_read_stream **out,
        oi.sizep = &size;
 
        if (packfile_store_read_object_info(store, oid, &oi, 0) ||
-           oi.u.packed.is_delta ||
+           oi.u.packed.type == PACKED_OBJECT_TYPE_REF_DELTA ||
+           oi.u.packed.type == PACKED_OBJECT_TYPE_OFS_DELTA ||
            repo_settings_get_big_file_threshold(store->odb->repo) >= size)
                return -1;