2683
return match_pattern(filter->exclude.v, refname, filter->ignore_case);
2684
}
2685
2686
+/*
2687
+ * We need to seek to the reference right after a given marker but excluding any
2688
+ * matching references. So we seek to the lexicographically next reference.
2689
+ */
2690
+static int start_ref_iterator_after(struct ref_iterator *iter, const char *marker)
2691
+{
2692
+ struct strbuf sb = STRBUF_INIT;
2693
+ int ret;
2694
+
2695
+ strbuf_addstr(&sb, marker);
2696
+ strbuf_addch(&sb, 1);
2697
+
2698
+ ret = ref_iterator_seek(iter, sb.buf, 0);
2699
+
2700
+ strbuf_release(&sb);
2701
+ return ret;
2702
+}
2703
+
2704
+static int for_each_fullref_with_seek(struct ref_filter *filter, each_ref_fn cb,
2705
+ void *cb_data, unsigned int flags)
2706
+{
2707
+ struct ref_iterator *iter;
2708
+ int ret = 0;
2709
+
2710
+ iter = refs_ref_iterator_begin(get_main_ref_store(the_repository), "",
2711
+ NULL, 0, flags);
2712
+ if (filter->start_after)
2713
+ ret = start_ref_iterator_after(iter, filter->start_after);
2714
+
2715
+ if (ret)
2716
+ return ret;
2717
+
2718
+ return do_for_each_ref_iterator(iter, cb, cb_data);
2719
+}
2720
+
2721
/*
2722
* This is the same as for_each_fullref_in(), but it tries to iterate
2723
* only over the patterns we'll care about. Note that it _doesn't_ do a full
2729
{
2730
if (filter->kind & FILTER_REFS_ROOT_REFS) {
2731
/* In this case, we want to print all refs including root refs. */
2697
- return refs_for_each_include_root_refs(get_main_ref_store(the_repository),
2698
- cb, cb_data);
2732
+ return for_each_fullref_with_seek(filter, cb, cb_data,
2733
+ DO_FOR_EACH_INCLUDE_ROOT_REFS);
2734
}
2735
2736
if (!filter->match_as_path) {
2739
* prefixes like "refs/heads/" etc. are stripped off,
2740
* so we have to look at everything:
2741
*/
2707
- return refs_for_each_fullref_in(get_main_ref_store(the_repository),
2708
- "", NULL, cb, cb_data);
2742
+ return for_each_fullref_with_seek(filter, cb, cb_data, 0);
2743
}
2744
2745
if (filter->ignore_case) {
2748
* so just return everything and let the caller
2749
* sort it out.
2750
*/
2717
- return refs_for_each_fullref_in(get_main_ref_store(the_repository),
2718
- "", NULL, cb, cb_data);
2751
+ return for_each_fullref_with_seek(filter, cb, cb_data, 0);
2752
}
2753
2754
if (!filter->name_patterns[0]) {
2755
/* no patterns; we have to look at everything */
2723
- return refs_for_each_fullref_in(get_main_ref_store(the_repository),
2724
- "", filter->exclude.v, cb, cb_data);
2756
+ return for_each_fullref_with_seek(filter, cb, cb_data, 0);
2757
}
2758
2759
return refs_for_each_fullref_in_prefixes(get_main_ref_store(the_repository),
3221
3222
static int do_filter_refs(struct ref_filter *filter, unsigned int type, each_ref_fn fn, void *cb_data)
3223
{
3224
+ const char *prefix = NULL;
3225
int ret = 0;
3226
3227
filter->kind = type & FILTER_REFS_KIND_MASK;
3240
* of filter_ref_kind().
3241
*/
3242
if (filter->kind == FILTER_REFS_BRANCHES)
3210
- ret = refs_for_each_fullref_in(get_main_ref_store(the_repository),
3211
- "refs/heads/", NULL,
3212
- fn, cb_data);
3243
+ prefix = "refs/heads/";
3244
else if (filter->kind == FILTER_REFS_REMOTES)
3214
- ret = refs_for_each_fullref_in(get_main_ref_store(the_repository),
3215
- "refs/remotes/", NULL,
3216
- fn, cb_data);
3245
+ prefix = "refs/remotes/";
3246
else if (filter->kind == FILTER_REFS_TAGS)
3218
- ret = refs_for_each_fullref_in(get_main_ref_store(the_repository),
3219
- "refs/tags/", NULL, fn,
3220
- cb_data);
3221
- else if (filter->kind & FILTER_REFS_REGULAR)
3247
+ prefix = "refs/tags/";
3248
+
3249
+ if (prefix) {
3250
+ struct ref_iterator *iter;
3251
+
3252
+ iter = refs_ref_iterator_begin(get_main_ref_store(the_repository),
3253
+ "", NULL, 0, 0);
3254
+
3255
+ if (filter->start_after)
3256
+ ret = start_ref_iterator_after(iter, filter->start_after);
3257
+ else if (prefix)
3258
+ ret = ref_iterator_seek(iter, prefix, 1);
3259
+
3260
+ if (!ret)
3261
+ ret = do_for_each_ref_iterator(iter, fn, cb_data);
3262
+ } else if (filter->kind & FILTER_REFS_REGULAR) {
3263
ret = for_each_fullref_in_pattern(filter, fn, cb_data);
3264
+ }
3265
3266
/*
3267
* When printing all ref types, HEAD is already included,