refs/iterator: implement seeking for files iterators

Implement seeking for "files" iterators. As we simply use a ref-cache iterator under the hood the implementation is straight-forward. Note that we do not implement seeking on reflog iterators, same as with the "reftable" backend. Signed-off-by: Patrick Steinhardt <ps@pks.im> Signed-off-by: Junio C Hamano <gitster@pobox.com>

Patrick Steinhardt committed Mar 12, 2025 at 16:56 UTC a95da5c8aec733c5b2e051bdfaa451f11570e87a
1 file changed +16
refs/files-backend.c
+16
@@ -918,6 +918,14 @@ static int files_ref_iterator_advance(struct ref_iterator *ref_iterator)
918 return ok;
919 }
920
921 +static int files_ref_iterator_seek(struct ref_iterator *ref_iterator,
922 + const char *prefix)
923 +{
924 + struct files_ref_iterator *iter =
925 + (struct files_ref_iterator *)ref_iterator;
926 + return ref_iterator_seek(iter->iter0, prefix);
927 +}
928 +
929 static int files_ref_iterator_peel(struct ref_iterator *ref_iterator,
930 struct object_id *peeled)
931 {
@@ -936,6 +944,7 @@ static void files_ref_iterator_release(struct ref_iterator *ref_iterator)
944
945 static struct ref_iterator_vtable files_ref_iterator_vtable = {
946 .advance = files_ref_iterator_advance,
947 + .seek = files_ref_iterator_seek,
948 .peel = files_ref_iterator_peel,
949 .release = files_ref_iterator_release,
950 };
@@ -2294,6 +2303,12 @@ static int files_reflog_iterator_advance(struct ref_iterator *ref_iterator)
2303 return ok;
2304 }
2305
2306 +static int files_reflog_iterator_seek(struct ref_iterator *ref_iterator UNUSED,
2307 + const char *prefix UNUSED)
2308 +{
2309 + BUG("ref_iterator_seek() called for reflog_iterator");
2310 +}
2311 +
2312 static int files_reflog_iterator_peel(struct ref_iterator *ref_iterator UNUSED,
2313 struct object_id *peeled UNUSED)
2314 {
@@ -2309,6 +2324,7 @@ static void files_reflog_iterator_release(struct ref_iterator *ref_iterator)
2324
2325 static struct ref_iterator_vtable files_reflog_iterator_vtable = {
2326 .advance = files_reflog_iterator_advance,
2327 + .seek = files_reflog_iterator_seek,
2328 .peel = files_reflog_iterator_peel,
2329 .release = files_reflog_iterator_release,
2330 };