Skip to content

Commit 5e01d83

Browse files
pks-tgitster
authored andcommitted
refs: always treat iterators as ordered
In the preceding commit we have converted the reflog iterator of the "files" backend to be ordered, which was the only remaining ref iterator that wasn't ordered. Refactor the ref iterator infrastructure so that we always assume iterators to be ordered, thus simplifying the code. Signed-off-by: Patrick Steinhardt <[email protected]> Signed-off-by: Junio C Hamano <[email protected]>
1 parent 6f22780 commit 5e01d83

File tree

8 files changed

+20
-50
lines changed

8 files changed

+20
-50
lines changed

refs.c

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1594,10 +1594,6 @@ struct ref_iterator *refs_ref_iterator_begin(
15941594
if (trim)
15951595
iter = prefix_ref_iterator_begin(iter, "", trim);
15961596

1597-
/* Sanity check for subclasses: */
1598-
if (!iter->ordered)
1599-
BUG("reference iterator is not ordered");
1600-
16011597
return iter;
16021598
}
16031599

refs/debug.c

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -181,7 +181,6 @@ static int debug_ref_iterator_advance(struct ref_iterator *ref_iterator)
181181
trace_printf_key(&trace_refs, "iterator_advance: %s (0)\n",
182182
diter->iter->refname);
183183

184-
diter->base.ordered = diter->iter->ordered;
185184
diter->base.refname = diter->iter->refname;
186185
diter->base.oid = diter->iter->oid;
187186
diter->base.flags = diter->iter->flags;
@@ -222,7 +221,7 @@ debug_ref_iterator_begin(struct ref_store *ref_store, const char *prefix,
222221
drefs->refs->be->iterator_begin(drefs->refs, prefix,
223222
exclude_patterns, flags);
224223
struct debug_ref_iterator *diter = xcalloc(1, sizeof(*diter));
225-
base_ref_iterator_init(&diter->base, &debug_ref_iterator_vtable, 1);
224+
base_ref_iterator_init(&diter->base, &debug_ref_iterator_vtable);
226225
diter->iter = res;
227226
trace_printf_key(&trace_refs, "ref_iterator_begin: \"%s\" (0x%x)\n",
228227
prefix, flags);

refs/files-backend.c

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -879,8 +879,7 @@ static struct ref_iterator *files_ref_iterator_begin(
879879

880880
CALLOC_ARRAY(iter, 1);
881881
ref_iterator = &iter->base;
882-
base_ref_iterator_init(ref_iterator, &files_ref_iterator_vtable,
883-
overlay_iter->ordered);
882+
base_ref_iterator_init(ref_iterator, &files_ref_iterator_vtable);
884883
iter->iter0 = overlay_iter;
885884
iter->repo = ref_store->repo;
886885
iter->flags = flags;
@@ -2202,7 +2201,7 @@ static struct ref_iterator *reflog_iterator_begin(struct ref_store *ref_store,
22022201
CALLOC_ARRAY(iter, 1);
22032202
ref_iterator = &iter->base;
22042203

2205-
base_ref_iterator_init(ref_iterator, &files_reflog_iterator_vtable, 1);
2204+
base_ref_iterator_init(ref_iterator, &files_reflog_iterator_vtable);
22062205
iter->dir_iterator = diter;
22072206
iter->ref_store = ref_store;
22082207
strbuf_release(&sb);
@@ -2220,7 +2219,7 @@ static struct ref_iterator *files_reflog_iterator_begin(struct ref_store *ref_st
22202219
return reflog_iterator_begin(ref_store, refs->gitcommondir);
22212220
} else {
22222221
return merge_ref_iterator_begin(
2223-
1, reflog_iterator_begin(ref_store, refs->base.gitdir),
2222+
reflog_iterator_begin(ref_store, refs->base.gitdir),
22242223
reflog_iterator_begin(ref_store, refs->gitcommondir),
22252224
ref_iterator_select, refs);
22262225
}

refs/iterator.c

Lines changed: 8 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -25,11 +25,9 @@ int ref_iterator_abort(struct ref_iterator *ref_iterator)
2525
}
2626

2727
void base_ref_iterator_init(struct ref_iterator *iter,
28-
struct ref_iterator_vtable *vtable,
29-
int ordered)
28+
struct ref_iterator_vtable *vtable)
3029
{
3130
iter->vtable = vtable;
32-
iter->ordered = !!ordered;
3331
iter->refname = NULL;
3432
iter->oid = NULL;
3533
iter->flags = 0;
@@ -74,7 +72,7 @@ struct ref_iterator *empty_ref_iterator_begin(void)
7472
struct empty_ref_iterator *iter = xcalloc(1, sizeof(*iter));
7573
struct ref_iterator *ref_iterator = &iter->base;
7674

77-
base_ref_iterator_init(ref_iterator, &empty_ref_iterator_vtable, 1);
75+
base_ref_iterator_init(ref_iterator, &empty_ref_iterator_vtable);
7876
return ref_iterator;
7977
}
8078

@@ -250,7 +248,6 @@ static struct ref_iterator_vtable merge_ref_iterator_vtable = {
250248
};
251249

252250
struct ref_iterator *merge_ref_iterator_begin(
253-
int ordered,
254251
struct ref_iterator *iter0, struct ref_iterator *iter1,
255252
ref_iterator_select_fn *select, void *cb_data)
256253
{
@@ -265,7 +262,7 @@ struct ref_iterator *merge_ref_iterator_begin(
265262
* references through only if they exist in both iterators.
266263
*/
267264

268-
base_ref_iterator_init(ref_iterator, &merge_ref_iterator_vtable, ordered);
265+
base_ref_iterator_init(ref_iterator, &merge_ref_iterator_vtable);
269266
iter->iter0 = iter0;
270267
iter->iter1 = iter1;
271268
iter->select = select;
@@ -314,12 +311,9 @@ struct ref_iterator *overlay_ref_iterator_begin(
314311
} else if (is_empty_ref_iterator(back)) {
315312
ref_iterator_abort(back);
316313
return front;
317-
} else if (!front->ordered || !back->ordered) {
318-
BUG("overlay_ref_iterator requires ordered inputs");
319314
}
320315

321-
return merge_ref_iterator_begin(1, front, back,
322-
overlay_iterator_select, NULL);
316+
return merge_ref_iterator_begin(front, back, overlay_iterator_select, NULL);
323317
}
324318

325319
struct prefix_ref_iterator {
@@ -358,16 +352,12 @@ static int prefix_ref_iterator_advance(struct ref_iterator *ref_iterator)
358352

359353
if (cmp > 0) {
360354
/*
361-
* If the source iterator is ordered, then we
355+
* As the source iterator is ordered, we
362356
* can stop the iteration as soon as we see a
363357
* refname that comes after the prefix:
364358
*/
365-
if (iter->iter0->ordered) {
366-
ok = ref_iterator_abort(iter->iter0);
367-
break;
368-
} else {
369-
continue;
370-
}
359+
ok = ref_iterator_abort(iter->iter0);
360+
break;
371361
}
372362

373363
if (iter->trim) {
@@ -439,7 +429,7 @@ struct ref_iterator *prefix_ref_iterator_begin(struct ref_iterator *iter0,
439429
CALLOC_ARRAY(iter, 1);
440430
ref_iterator = &iter->base;
441431

442-
base_ref_iterator_init(ref_iterator, &prefix_ref_iterator_vtable, iter0->ordered);
432+
base_ref_iterator_init(ref_iterator, &prefix_ref_iterator_vtable);
443433

444434
iter->iter0 = iter0;
445435
iter->prefix = xstrdup(prefix);

refs/packed-backend.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1111,7 +1111,7 @@ static struct ref_iterator *packed_ref_iterator_begin(
11111111

11121112
CALLOC_ARRAY(iter, 1);
11131113
ref_iterator = &iter->base;
1114-
base_ref_iterator_init(ref_iterator, &packed_ref_iterator_vtable, 1);
1114+
base_ref_iterator_init(ref_iterator, &packed_ref_iterator_vtable);
11151115

11161116
if (exclude_patterns)
11171117
populate_excluded_jump_list(iter, snapshot, exclude_patterns);

refs/ref-cache.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -486,7 +486,7 @@ struct ref_iterator *cache_ref_iterator_begin(struct ref_cache *cache,
486486

487487
CALLOC_ARRAY(iter, 1);
488488
ref_iterator = &iter->base;
489-
base_ref_iterator_init(ref_iterator, &cache_ref_iterator_vtable, 1);
489+
base_ref_iterator_init(ref_iterator, &cache_ref_iterator_vtable);
490490
ALLOC_GROW(iter->levels, 10, iter->levels_alloc);
491491

492492
iter->levels_nr = 1;

refs/refs-internal.h

Lines changed: 2 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -312,13 +312,6 @@ enum do_for_each_ref_flags {
312312
*/
313313
struct ref_iterator {
314314
struct ref_iterator_vtable *vtable;
315-
316-
/*
317-
* Does this `ref_iterator` iterate over references in order
318-
* by refname?
319-
*/
320-
unsigned int ordered : 1;
321-
322315
const char *refname;
323316
const struct object_id *oid;
324317
unsigned int flags;
@@ -399,11 +392,9 @@ enum iterator_selection ref_iterator_select(struct ref_iterator *iter_worktree,
399392
* Iterate over the entries from iter0 and iter1, with the values
400393
* interleaved as directed by the select function. The iterator takes
401394
* ownership of iter0 and iter1 and frees them when the iteration is
402-
* over. A derived class should set `ordered` to 1 or 0 based on
403-
* whether it generates its output in order by reference name.
395+
* over.
404396
*/
405397
struct ref_iterator *merge_ref_iterator_begin(
406-
int ordered,
407398
struct ref_iterator *iter0, struct ref_iterator *iter1,
408399
ref_iterator_select_fn *select, void *cb_data);
409400

@@ -432,8 +423,6 @@ struct ref_iterator *overlay_ref_iterator_begin(
432423
* As an convenience to callers, if prefix is the empty string and
433424
* trim is zero, this function returns iter0 directly, without
434425
* wrapping it.
435-
*
436-
* The resulting ref_iterator is ordered if iter0 is.
437426
*/
438427
struct ref_iterator *prefix_ref_iterator_begin(struct ref_iterator *iter0,
439428
const char *prefix,
@@ -444,14 +433,11 @@ struct ref_iterator *prefix_ref_iterator_begin(struct ref_iterator *iter0,
444433
/*
445434
* Base class constructor for ref_iterators. Initialize the
446435
* ref_iterator part of iter, setting its vtable pointer as specified.
447-
* `ordered` should be set to 1 if the iterator will iterate over
448-
* references in order by refname; otherwise it should be set to 0.
449436
* This is meant to be called only by the initializers of derived
450437
* classes.
451438
*/
452439
void base_ref_iterator_init(struct ref_iterator *iter,
453-
struct ref_iterator_vtable *vtable,
454-
int ordered);
440+
struct ref_iterator_vtable *vtable);
455441

456442
/*
457443
* Base class destructor for ref_iterators. Destroy the ref_iterator

refs/reftable-backend.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -479,7 +479,7 @@ static struct reftable_ref_iterator *ref_iterator_for_stack(struct reftable_ref_
479479
int ret;
480480

481481
iter = xcalloc(1, sizeof(*iter));
482-
base_ref_iterator_init(&iter->base, &reftable_ref_iterator_vtable, 1);
482+
base_ref_iterator_init(&iter->base, &reftable_ref_iterator_vtable);
483483
iter->prefix = prefix;
484484
iter->base.oid = &iter->oid;
485485
iter->flags = flags;
@@ -532,7 +532,7 @@ static struct ref_iterator *reftable_be_iterator_begin(struct ref_store *ref_sto
532532
* single iterator.
533533
*/
534534
worktree_iter = ref_iterator_for_stack(refs, refs->worktree_stack, prefix, flags);
535-
return merge_ref_iterator_begin(1, &worktree_iter->base, &main_iter->base,
535+
return merge_ref_iterator_begin(&worktree_iter->base, &main_iter->base,
536536
ref_iterator_select, NULL);
537537
}
538538

@@ -1680,7 +1680,7 @@ static struct reftable_reflog_iterator *reflog_iterator_for_stack(struct reftabl
16801680
int ret;
16811681

16821682
iter = xcalloc(1, sizeof(*iter));
1683-
base_ref_iterator_init(&iter->base, &reftable_reflog_iterator_vtable, 1);
1683+
base_ref_iterator_init(&iter->base, &reftable_reflog_iterator_vtable);
16841684
iter->refs = refs;
16851685
iter->base.oid = &iter->oid;
16861686

@@ -1715,7 +1715,7 @@ static struct ref_iterator *reftable_be_reflog_iterator_begin(struct ref_store *
17151715

17161716
worktree_iter = reflog_iterator_for_stack(refs, refs->worktree_stack);
17171717

1718-
return merge_ref_iterator_begin(1, &worktree_iter->base, &main_iter->base,
1718+
return merge_ref_iterator_begin(&worktree_iter->base, &main_iter->base,
17191719
ref_iterator_select, NULL);
17201720
}
17211721

0 commit comments

Comments
 (0)