refs: drop infrastructure to peel via iterators

Now that the peeled object ID gets propagated via the `struct reference` there is no need anymore to call into the reference iterator itself to dereference an object. Remove this infrastructure. Most of the changes are straight-forward deletions of code. There is one exception though in `refs/packed-backend.c::write_with_updates()`. Here we stop peeling the iterator and instead just pass the peeled object ID of that iterator directly. Signed-off-by: Patrick Steinhardt <ps@pks.im> Signed-off-by: Junio C Hamano <gitster@pobox.com>

Patrick Steinhardt committed Oct 23, 2025 at 09:16 UTC 705114772e0a0741c3288329bd9ac4e11e38db9a
8 files changed +1 -141
refs.h
-14
@@ -1289,10 +1289,6 @@ int repo_migrate_ref_storage_format(struct repository *repo,
1289 * to the next entry, ref_iterator_advance() aborts the iteration,
1290 * frees the ref_iterator, and returns ITER_ERROR.
1291 *
1292 - * The reference currently being looked at can be peeled by calling
1293 - * ref_iterator_peel(). This function is often faster than peel_ref(),
1294 - * so it should be preferred when iterating over references.
1295 - *
1292 * Putting it all together, a typical iteration looks like this:
1293 *
1294 * int ok;
@@ -1307,9 +1303,6 @@ int repo_migrate_ref_storage_format(struct repository *repo,
1303 * // Access information about the current reference:
1304 * if (!(iter->flags & REF_ISSYMREF))
1305 * printf("%s is %s\n", iter->refname, oid_to_hex(iter->oid));
1310 - *
1311 - * // If you need to peel the reference:
1312 - * ref_iterator_peel(iter, &oid);
1306 * }
1307 *
1308 * if (ok != ITER_DONE)
@@ -1400,13 +1393,6 @@ enum ref_iterator_seek_flag {
1393 int ref_iterator_seek(struct ref_iterator *ref_iterator, const char *refname,
1394 unsigned int flags);
1395
1403 -/*
1404 - * If possible, peel the reference currently being viewed by the
1405 - * iterator. Return 0 on success.
1406 - */
1407 -int ref_iterator_peel(struct ref_iterator *ref_iterator,
1408 - struct object_id *peeled);
1409 -
1396 /* Free the reference iterator and any associated resources. */
1397 void ref_iterator_free(struct ref_iterator *ref_iterator);
1398
refs/debug.c
-11
@@ -177,16 +177,6 @@ static int debug_ref_iterator_seek(struct ref_iterator *ref_iterator,
177 return res;
178 }
179
180 -static int debug_ref_iterator_peel(struct ref_iterator *ref_iterator,
181 - struct object_id *peeled)
182 -{
183 - struct debug_ref_iterator *diter =
184 - (struct debug_ref_iterator *)ref_iterator;
185 - int res = diter->iter->vtable->peel(diter->iter, peeled);
186 - trace_printf_key(&trace_refs, "iterator_peel: %s: %d\n", diter->iter->ref.name, res);
187 - return res;
188 -}
189 -
180 static void debug_ref_iterator_release(struct ref_iterator *ref_iterator)
181 {
182 struct debug_ref_iterator *diter =
@@ -198,7 +188,6 @@ static void debug_ref_iterator_release(struct ref_iterator *ref_iterator)
188 static struct ref_iterator_vtable debug_ref_iterator_vtable = {
189 .advance = debug_ref_iterator_advance,
190 .seek = debug_ref_iterator_seek,
201 - .peel = debug_ref_iterator_peel,
191 .release = debug_ref_iterator_release,
192 };
193
refs/files-backend.c
-17
@@ -993,15 +993,6 @@ static int files_ref_iterator_seek(struct ref_iterator *ref_iterator,
993 return ref_iterator_seek(iter->iter0, refname, flags);
994 }
995
996 -static int files_ref_iterator_peel(struct ref_iterator *ref_iterator,
997 - struct object_id *peeled)
998 -{
999 - struct files_ref_iterator *iter =
1000 - (struct files_ref_iterator *)ref_iterator;
1001 -
1002 - return ref_iterator_peel(iter->iter0, peeled);
1003 -}
1004 -
996 static void files_ref_iterator_release(struct ref_iterator *ref_iterator)
997 {
998 struct files_ref_iterator *iter =
@@ -1012,7 +1003,6 @@ static void files_ref_iterator_release(struct ref_iterator *ref_iterator)
1003 static struct ref_iterator_vtable files_ref_iterator_vtable = {
1004 .advance = files_ref_iterator_advance,
1005 .seek = files_ref_iterator_seek,
1015 - .peel = files_ref_iterator_peel,
1006 .release = files_ref_iterator_release,
1007 };
1008
@@ -2388,12 +2378,6 @@ static int files_reflog_iterator_seek(struct ref_iterator *ref_iterator UNUSED,
2378 BUG("ref_iterator_seek() called for reflog_iterator");
2379 }
2380
2391 -static int files_reflog_iterator_peel(struct ref_iterator *ref_iterator UNUSED,
2392 - struct object_id *peeled UNUSED)
2393 -{
2394 - BUG("ref_iterator_peel() called for reflog_iterator");
2395 -}
2396 -
2381 static void files_reflog_iterator_release(struct ref_iterator *ref_iterator)
2382 {
2383 struct files_reflog_iterator *iter =
@@ -2404,7 +2388,6 @@ static void files_reflog_iterator_release(struct ref_iterator *ref_iterator)
2388 static struct ref_iterator_vtable files_reflog_iterator_vtable = {
2389 .advance = files_reflog_iterator_advance,
2390 .seek = files_reflog_iterator_seek,
2407 - .peel = files_reflog_iterator_peel,
2391 .release = files_reflog_iterator_release,
2392 };
2393
refs/iterator.c
-36
@@ -21,12 +21,6 @@ int ref_iterator_seek(struct ref_iterator *ref_iterator, const char *refname,
21 return ref_iterator->vtable->seek(ref_iterator, refname, flags);
22 }
23
24 -int ref_iterator_peel(struct ref_iterator *ref_iterator,
25 - struct object_id *peeled)
26 -{
27 - return ref_iterator->vtable->peel(ref_iterator, peeled);
28 -}
29 -
24 void ref_iterator_free(struct ref_iterator *ref_iterator)
25 {
26 if (ref_iterator) {
@@ -60,12 +54,6 @@ static int empty_ref_iterator_seek(struct ref_iterator *ref_iterator UNUSED,
54 return 0;
55 }
56
63 -static int empty_ref_iterator_peel(struct ref_iterator *ref_iterator UNUSED,
64 - struct object_id *peeled UNUSED)
65 -{
66 - BUG("peel called for empty iterator");
67 -}
68 -
57 static void empty_ref_iterator_release(struct ref_iterator *ref_iterator UNUSED)
58 {
59 }
@@ -73,7 +61,6 @@ static void empty_ref_iterator_release(struct ref_iterator *ref_iterator UNUSED)
61 static struct ref_iterator_vtable empty_ref_iterator_vtable = {
62 .advance = empty_ref_iterator_advance,
63 .seek = empty_ref_iterator_seek,
76 - .peel = empty_ref_iterator_peel,
64 .release = empty_ref_iterator_release,
65 };
66
@@ -240,18 +227,6 @@ static int merge_ref_iterator_seek(struct ref_iterator *ref_iterator,
227 return 0;
228 }
229
243 -static int merge_ref_iterator_peel(struct ref_iterator *ref_iterator,
244 - struct object_id *peeled)
245 -{
246 - struct merge_ref_iterator *iter =
247 - (struct merge_ref_iterator *)ref_iterator;
248 -
249 - if (!iter->current) {
250 - BUG("peel called before advance for merge iterator");
251 - }
252 - return ref_iterator_peel(*iter->current, peeled);
253 -}
254 -
230 static void merge_ref_iterator_release(struct ref_iterator *ref_iterator)
231 {
232 struct merge_ref_iterator *iter =
@@ -263,7 +238,6 @@ static void merge_ref_iterator_release(struct ref_iterator *ref_iterator)
238 static struct ref_iterator_vtable merge_ref_iterator_vtable = {
239 .advance = merge_ref_iterator_advance,
240 .seek = merge_ref_iterator_seek,
266 - .peel = merge_ref_iterator_peel,
241 .release = merge_ref_iterator_release,
242 };
243
@@ -412,15 +386,6 @@ static int prefix_ref_iterator_seek(struct ref_iterator *ref_iterator,
386 return ref_iterator_seek(iter->iter0, refname, flags);
387 }
388
415 -static int prefix_ref_iterator_peel(struct ref_iterator *ref_iterator,
416 - struct object_id *peeled)
417 -{
418 - struct prefix_ref_iterator *iter =
419 - (struct prefix_ref_iterator *)ref_iterator;
420 -
421 - return ref_iterator_peel(iter->iter0, peeled);
422 -}
423 -
389 static void prefix_ref_iterator_release(struct ref_iterator *ref_iterator)
390 {
391 struct prefix_ref_iterator *iter =
@@ -432,7 +397,6 @@ static void prefix_ref_iterator_release(struct ref_iterator *ref_iterator)
397 static struct ref_iterator_vtable prefix_ref_iterator_vtable = {
398 .advance = prefix_ref_iterator_advance,
399 .seek = prefix_ref_iterator_seek,
435 - .peel = prefix_ref_iterator_peel,
400 .release = prefix_ref_iterator_release,
401 };
402
refs/packed-backend.c
+1 -23
@@ -1030,22 +1030,6 @@ static int packed_ref_iterator_seek(struct ref_iterator *ref_iterator,
1030 return 0;
1031 }
1032
1033 -static int packed_ref_iterator_peel(struct ref_iterator *ref_iterator,
1034 - struct object_id *peeled)
1035 -{
1036 - struct packed_ref_iterator *iter =
1037 - (struct packed_ref_iterator *)ref_iterator;
1038 -
1039 - if ((iter->base.ref.flags & REF_KNOWS_PEELED)) {
1040 - oidcpy(peeled, &iter->peeled);
1041 - return is_null_oid(&iter->peeled) ? -1 : 0;
1042 - } else if ((iter->base.ref.flags & (REF_ISBROKEN | REF_ISSYMREF))) {
1043 - return -1;
1044 - } else {
1045 - return peel_object(iter->repo, &iter->oid, peeled) ? -1 : 0;
1046 - }
1047 -}
1048 -
1033 static void packed_ref_iterator_release(struct ref_iterator *ref_iterator)
1034 {
1035 struct packed_ref_iterator *iter =
@@ -1059,7 +1043,6 @@ static void packed_ref_iterator_release(struct ref_iterator *ref_iterator)
1043 static struct ref_iterator_vtable packed_ref_iterator_vtable = {
1044 .advance = packed_ref_iterator_advance,
1045 .seek = packed_ref_iterator_seek,
1062 - .peel = packed_ref_iterator_peel,
1046 .release = packed_ref_iterator_release,
1047 };
1048
@@ -1525,13 +1508,8 @@ static enum ref_transaction_error write_with_updates(struct packed_ref_store *re
1508
1509 if (cmp < 0) {
1510 /* Pass the old reference through. */
1528 -
1529 - struct object_id peeled;
1530 - int peel_error = ref_iterator_peel(iter, &peeled);
1531 -
1511 if (write_packed_entry(out, iter->ref.name,
1533 - iter->ref.oid,
1534 - peel_error ? NULL : &peeled))
1512 + iter->ref.oid, iter->ref.peeled_oid))
1513 goto write_error;
1514
1515 if ((ok = ref_iterator_advance(iter)) != ITER_OK) {
refs/ref-cache.c
-9
@@ -546,14 +546,6 @@ static int cache_ref_iterator_seek(struct ref_iterator *ref_iterator,
546 return 0;
547 }
548
549 -static int cache_ref_iterator_peel(struct ref_iterator *ref_iterator,
550 - struct object_id *peeled)
551 -{
552 - struct cache_ref_iterator *iter =
553 - (struct cache_ref_iterator *)ref_iterator;
554 - return peel_object(iter->repo, ref_iterator->ref.oid, peeled) ? -1 : 0;
555 -}
556 -
549 static void cache_ref_iterator_release(struct ref_iterator *ref_iterator)
550 {
551 struct cache_ref_iterator *iter =
@@ -565,7 +557,6 @@ static void cache_ref_iterator_release(struct ref_iterator *ref_iterator)
557 static struct ref_iterator_vtable cache_ref_iterator_vtable = {
558 .advance = cache_ref_iterator_advance,
559 .seek = cache_ref_iterator_seek,
568 - .peel = cache_ref_iterator_peel,
560 .release = cache_ref_iterator_release,
561 };
562
refs/refs-internal.h
-7
@@ -357,12 +357,6 @@ typedef int ref_iterator_advance_fn(struct ref_iterator *ref_iterator);
357 typedef int ref_iterator_seek_fn(struct ref_iterator *ref_iterator,
358 const char *refname, unsigned int flags);
359
360 -/*
361 - * Peels the current ref, returning 0 for success or -1 for failure.
362 - */
363 -typedef int ref_iterator_peel_fn(struct ref_iterator *ref_iterator,
364 - struct object_id *peeled);
365 -
360 /*
361 * Implementations of this function should free any resources specific
362 * to the derived class.
@@ -372,7 +366,6 @@ typedef void ref_iterator_release_fn(struct ref_iterator *ref_iterator);
366 struct ref_iterator_vtable {
367 ref_iterator_advance_fn *advance;
368 ref_iterator_seek_fn *seek;
375 - ref_iterator_peel_fn *peel;
369 ref_iterator_release_fn *release;
370 };
371
refs/reftable-backend.c
-24
@@ -744,21 +744,6 @@ static int reftable_ref_iterator_seek(struct ref_iterator *ref_iterator,
744 return iter->err;
745 }
746
747 -static int reftable_ref_iterator_peel(struct ref_iterator *ref_iterator,
748 - struct object_id *peeled)
749 -{
750 - struct reftable_ref_iterator *iter =
751 - (struct reftable_ref_iterator *)ref_iterator;
752 -
753 - if (iter->ref.value_type == REFTABLE_REF_VAL2) {
754 - oidread(peeled, iter->ref.value.val2.target_value,
755 - iter->refs->base.repo->hash_algo);
756 - return 0;
757 - }
758 -
759 - return -1;
760 -}
761 -
747 static void reftable_ref_iterator_release(struct ref_iterator *ref_iterator)
748 {
749 struct reftable_ref_iterator *iter =
@@ -776,7 +761,6 @@ static void reftable_ref_iterator_release(struct ref_iterator *ref_iterator)
761 static struct ref_iterator_vtable reftable_ref_iterator_vtable = {
762 .advance = reftable_ref_iterator_advance,
763 .seek = reftable_ref_iterator_seek,
779 - .peel = reftable_ref_iterator_peel,
764 .release = reftable_ref_iterator_release,
765 };
766
@@ -2098,13 +2082,6 @@ static int reftable_reflog_iterator_seek(struct ref_iterator *ref_iterator UNUSE
2082 return -1;
2083 }
2084
2101 -static int reftable_reflog_iterator_peel(struct ref_iterator *ref_iterator UNUSED,
2102 - struct object_id *peeled UNUSED)
2103 -{
2104 - BUG("reftable reflog iterator cannot be peeled");
2105 - return -1;
2106 -}
2107 -
2085 static void reftable_reflog_iterator_release(struct ref_iterator *ref_iterator)
2086 {
2087 struct reftable_reflog_iterator *iter =
@@ -2117,7 +2094,6 @@ static void reftable_reflog_iterator_release(struct ref_iterator *ref_iterator)
2094 static struct ref_iterator_vtable reftable_reflog_iterator_vtable = {
2095 .advance = reftable_reflog_iterator_advance,
2096 .seek = reftable_reflog_iterator_seek,
2120 - .peel = reftable_reflog_iterator_peel,
2097 .release = reftable_reflog_iterator_release,
2098 };
2099