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