]> Kevux Git Server - rit/commitdiff
refs: use peeled tag values in reference backends
authorKarthik Nayak <karthik.188@gmail.com>
Mon, 4 May 2026 17:44:13 +0000 (19:44 +0200)
committerJunio C Hamano <gitster@pobox.com>
Tue, 5 May 2026 07:34:08 +0000 (16:34 +0900)
The reference backends peel tag objects when storing references to them.
This is to provide optimized reads which avoids hitting the odb. The
previous commits ensures that the peeled value is now propagated via the
generic layer. So modify the packed and reftable backend to directly use
this value instead of calling `peel_object()` independently.

Signed-off-by: Karthik Nayak <karthik.188@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
refs/packed-backend.c
refs/reftable-backend.c

index 35a0f32..0acde48 100644 (file)
@@ -1531,13 +1531,11 @@ static enum ref_transaction_error write_with_updates(struct packed_ref_store *re
                         */
                        i++;
                } else {
-                       struct object_id peeled;
-                       int peel_error = peel_object(refs->base.repo, &update->new_oid,
-                                                    &peeled, PEEL_OBJECT_VERIFY_TAGGED_OBJECT_TYPE);
+                       bool peeled = update->flags & REF_HAVE_PEELED;
 
                        if (write_packed_entry(out, update->refname,
                                               &update->new_oid,
-                                              peel_error ? NULL : &peeled))
+                                              peeled ? &update->peeled : NULL))
                                goto write_error;
 
                        i++;
index b0c0103..8b4ac2e 100644 (file)
@@ -12,7 +12,6 @@
 #include "../hex.h"
 #include "../ident.h"
 #include "../iterator.h"
-#include "../object.h"
 #include "../parse.h"
 #include "../path.h"
 #include "../refs.h"
@@ -1584,17 +1583,13 @@ static int write_transaction_table(struct reftable_writer *writer, void *cb_data
                                goto done;
                } else if (u->flags & REF_HAVE_NEW) {
                        struct reftable_ref_record ref = {0};
-                       struct object_id peeled;
-                       int peel_error;
 
                        ref.refname = (char *)u->refname;
                        ref.update_index = ts;
 
-                       peel_error = peel_object(arg->refs->base.repo, &u->new_oid, &peeled,
-                                                PEEL_OBJECT_VERIFY_TAGGED_OBJECT_TYPE);
-                       if (!peel_error) {
+                       if (u->flags & REF_HAVE_PEELED) {
                                ref.value_type = REFTABLE_REF_VAL2;
-                               memcpy(ref.value.val2.target_value, peeled.hash, GIT_MAX_RAWSZ);
+                               memcpy(ref.value.val2.target_value, u->peeled.hash, GIT_MAX_RAWSZ);
                                memcpy(ref.value.val2.value, u->new_oid.hash, GIT_MAX_RAWSZ);
                        } else if (!is_null_oid(&u->new_oid)) {
                                ref.value_type = REFTABLE_REF_VAL1;