refs: plumb `exclude_patterns` argument throughout

The subsequent patch will want to access an optional `excluded_patterns` array within `refs/packed-backend.c` that will cull out certain references matching any of the given patterns on a best-effort basis. To do so, the refs subsystem needs to be updated to pass this value across a number of different locations. Prepare for a future patch by introducing this plumbing now, passing NULLs at top-level APIs in order to make that patch less noisy and more easily readable. Signed-off-by: Taylor Blau <me@ttaylorr.co> Signed-off-by: Junio C Hamano <gitster@pobox.com>

Taylor Blau committed Jul 10, 2023 at 17:12 UTC b269ac53c07aa46d5a88d05dac8216d189e69a50
9 files changed +42 -26
ls-refs.c
+1 -1
@@ -193,7 +193,7 @@ int ls_refs(struct repository *r, struct packet_reader *request)
193 strvec_push(&data.prefixes, "");
194 refs_for_each_fullref_in_prefixes(get_main_ref_store(r),
195 get_git_namespace(), data.prefixes.v,
196 - send_ref, &data);
196 + NULL, send_ref, &data);
197 packet_fflush(stdout);
198 strvec_clear(&data.prefixes);
199 strbuf_release(&data.buf);
ref-filter.c
+1 -1
@@ -2215,7 +2215,7 @@ static int for_each_fullref_in_pattern(struct ref_filter *filter,
2215
2216 return refs_for_each_fullref_in_prefixes(get_main_ref_store(the_repository),
2217 NULL, filter->name_patterns,
2218 - cb, cb_data);
2218 + NULL, cb, cb_data);
2219 }
2220
2221 /*
refs.c
+19 -13
@@ -1526,7 +1526,9 @@ int head_ref(each_ref_fn fn, void *cb_data)
1526
1527 struct ref_iterator *refs_ref_iterator_begin(
1528 struct ref_store *refs,
1529 - const char *prefix, int trim,
1529 + const char *prefix,
1530 + const char **exclude_patterns,
1531 + int trim,
1532 enum do_for_each_ref_flags flags)
1533 {
1534 struct ref_iterator *iter;
@@ -1542,8 +1544,7 @@ struct ref_iterator *refs_ref_iterator_begin(
1544 }
1545 }
1546
1545 - iter = refs->be->iterator_begin(refs, prefix, flags);
1546 -
1547 + iter = refs->be->iterator_begin(refs, prefix, exclude_patterns, flags);
1548 /*
1549 * `iterator_begin()` already takes care of prefix, but we
1550 * might need to do some trimming:
@@ -1577,7 +1578,7 @@ static int do_for_each_repo_ref(struct repository *r, const char *prefix,
1578 if (!refs)
1579 return 0;
1580
1580 - iter = refs_ref_iterator_begin(refs, prefix, trim, flags);
1581 + iter = refs_ref_iterator_begin(refs, prefix, NULL, trim, flags);
1582
1583 return do_for_each_repo_ref_iterator(r, iter, fn, cb_data);
1584 }
@@ -1599,6 +1600,7 @@ static int do_for_each_ref_helper(struct repository *r,
1600 }
1601
1602 static int do_for_each_ref(struct ref_store *refs, const char *prefix,
1603 + const char **exclude_patterns,
1604 each_ref_fn fn, int trim,
1605 enum do_for_each_ref_flags flags, void *cb_data)
1606 {
@@ -1608,7 +1610,8 @@ static int do_for_each_ref(struct ref_store *refs, const char *prefix,
1610 if (!refs)
1611 return 0;
1612
1611 - iter = refs_ref_iterator_begin(refs, prefix, trim, flags);
1613 + iter = refs_ref_iterator_begin(refs, prefix, exclude_patterns, trim,
1614 + flags);
1615
1616 return do_for_each_repo_ref_iterator(the_repository, iter,
1617 do_for_each_ref_helper, &hp);
@@ -1616,7 +1619,7 @@ static int do_for_each_ref(struct ref_store *refs, const char *prefix,
1619
1620 int refs_for_each_ref(struct ref_store *refs, each_ref_fn fn, void *cb_data)
1621 {
1619 - return do_for_each_ref(refs, "", fn, 0, 0, cb_data);
1622 + return do_for_each_ref(refs, "", NULL, fn, 0, 0, cb_data);
1623 }
1624
1625 int for_each_ref(each_ref_fn fn, void *cb_data)
@@ -1627,7 +1630,7 @@ int for_each_ref(each_ref_fn fn, void *cb_data)
1630 int refs_for_each_ref_in(struct ref_store *refs, const char *prefix,
1631 each_ref_fn fn, void *cb_data)
1632 {
1630 - return do_for_each_ref(refs, prefix, fn, strlen(prefix), 0, cb_data);
1633 + return do_for_each_ref(refs, prefix, NULL, fn, strlen(prefix), 0, cb_data);
1634 }
1635
1636 int for_each_ref_in(const char *prefix, each_ref_fn fn, void *cb_data)
@@ -1638,13 +1641,14 @@ int for_each_ref_in(const char *prefix, each_ref_fn fn, void *cb_data)
1641 int for_each_fullref_in(const char *prefix, each_ref_fn fn, void *cb_data)
1642 {
1643 return do_for_each_ref(get_main_ref_store(the_repository),
1641 - prefix, fn, 0, 0, cb_data);
1644 + prefix, NULL, fn, 0, 0, cb_data);
1645 }
1646
1647 int refs_for_each_fullref_in(struct ref_store *refs, const char *prefix,
1648 + const char **exclude_patterns,
1649 each_ref_fn fn, void *cb_data)
1650 {
1647 - return do_for_each_ref(refs, prefix, fn, 0, 0, cb_data);
1651 + return do_for_each_ref(refs, prefix, exclude_patterns, fn, 0, 0, cb_data);
1652 }
1653
1654 int for_each_replace_ref(struct repository *r, each_repo_ref_fn fn, void *cb_data)
@@ -1661,14 +1665,14 @@ int for_each_namespaced_ref(each_ref_fn fn, void *cb_data)
1665 int ret;
1666 strbuf_addf(&buf, "%srefs/", get_git_namespace());
1667 ret = do_for_each_ref(get_main_ref_store(the_repository),
1664 - buf.buf, fn, 0, 0, cb_data);
1668 + buf.buf, NULL, fn, 0, 0, cb_data);
1669 strbuf_release(&buf);
1670 return ret;
1671 }
1672
1673 int refs_for_each_rawref(struct ref_store *refs, each_ref_fn fn, void *cb_data)
1674 {
1671 - return do_for_each_ref(refs, "", fn, 0,
1675 + return do_for_each_ref(refs, "", NULL, fn, 0,
1676 DO_FOR_EACH_INCLUDE_BROKEN, cb_data);
1677 }
1678
@@ -1738,6 +1742,7 @@ static void find_longest_prefixes(struct string_list *out,
1742 int refs_for_each_fullref_in_prefixes(struct ref_store *ref_store,
1743 const char *namespace,
1744 const char **patterns,
1745 + const char **exclude_patterns,
1746 each_ref_fn fn, void *cb_data)
1747 {
1748 struct string_list prefixes = STRING_LIST_INIT_DUP;
@@ -1753,7 +1758,8 @@ int refs_for_each_fullref_in_prefixes(struct ref_store *ref_store,
1758
1759 for_each_string_list_item(prefix, &prefixes) {
1760 strbuf_addstr(&buf, prefix->string);
1756 - ret = refs_for_each_fullref_in(ref_store, buf.buf, fn, cb_data);
1761 + ret = refs_for_each_fullref_in(ref_store, buf.buf,
1762 + exclude_patterns, fn, cb_data);
1763 if (ret)
1764 break;
1765 strbuf_setlen(&buf, namespace_len);
@@ -2408,7 +2414,7 @@ int refs_verify_refname_available(struct ref_store *refs,
2414 strbuf_addstr(&dirname, refname + dirname.len);
2415 strbuf_addch(&dirname, '/');
2416
2411 - iter = refs_ref_iterator_begin(refs, dirname.buf, 0,
2417 + iter = refs_ref_iterator_begin(refs, dirname.buf, NULL, 0,
2418 DO_FOR_EACH_INCLUDE_BROKEN);
2419 while ((ok = ref_iterator_advance(iter)) == ITER_OK) {
2420 if (skip &&
refs.h
+7 -1
@@ -338,6 +338,7 @@ int for_each_ref(each_ref_fn fn, void *cb_data);
338 int for_each_ref_in(const char *prefix, each_ref_fn fn, void *cb_data);
339
340 int refs_for_each_fullref_in(struct ref_store *refs, const char *prefix,
341 + const char **exclude_patterns,
342 each_ref_fn fn, void *cb_data);
343 int for_each_fullref_in(const char *prefix, each_ref_fn fn, void *cb_data);
344
@@ -345,10 +346,15 @@ int for_each_fullref_in(const char *prefix, each_ref_fn fn, void *cb_data);
346 * iterate all refs in "patterns" by partitioning patterns into disjoint sets
347 * and iterating the longest-common prefix of each set.
348 *
349 + * references matching any pattern in "exclude_patterns" are omitted from the
350 + * result set on a best-effort basis.
351 + *
352 * callers should be prepared to ignore references that they did not ask for.
353 */
354 int refs_for_each_fullref_in_prefixes(struct ref_store *refs,
351 - const char *namespace, const char **patterns,
355 + const char *namespace,
356 + const char **patterns,
357 + const char **exclude_patterns,
358 each_ref_fn fn, void *cb_data);
359
360 /**
refs/debug.c
+3 -2
@@ -229,11 +229,12 @@ static struct ref_iterator_vtable debug_ref_iterator_vtable = {
229
230 static struct ref_iterator *
231 debug_ref_iterator_begin(struct ref_store *ref_store, const char *prefix,
232 - unsigned int flags)
232 + const char **exclude_patterns, unsigned int flags)
233 {
234 struct debug_ref_store *drefs = (struct debug_ref_store *)ref_store;
235 struct ref_iterator *res =
236 - drefs->refs->be->iterator_begin(drefs->refs, prefix, flags);
236 + drefs->refs->be->iterator_begin(drefs->refs, prefix,
237 + exclude_patterns, flags);
238 struct debug_ref_iterator *diter = xcalloc(1, sizeof(*diter));
239 base_ref_iterator_init(&diter->base, &debug_ref_iterator_vtable, 1);
240 diter->iter = res;
refs/files-backend.c
+3 -2
@@ -829,7 +829,8 @@ static struct ref_iterator_vtable files_ref_iterator_vtable = {
829
830 static struct ref_iterator *files_ref_iterator_begin(
831 struct ref_store *ref_store,
832 - const char *prefix, unsigned int flags)
832 + const char *prefix, const char **exclude_patterns,
833 + unsigned int flags)
834 {
835 struct files_ref_store *refs;
836 struct ref_iterator *loose_iter, *packed_iter, *overlay_iter;
@@ -874,7 +875,7 @@ static struct ref_iterator *files_ref_iterator_begin(
875 * the packed and loose references.
876 */
877 packed_iter = refs_ref_iterator_begin(
877 - refs->packed_ref_store, prefix, 0,
878 + refs->packed_ref_store, prefix, exclude_patterns, 0,
879 DO_FOR_EACH_INCLUDE_BROKEN);
880
881 overlay_iter = overlay_ref_iterator_begin(loose_iter, packed_iter);
refs/packed-backend.c
+3 -2
@@ -924,7 +924,8 @@ static struct ref_iterator_vtable packed_ref_iterator_vtable = {
924
925 static struct ref_iterator *packed_ref_iterator_begin(
926 struct ref_store *ref_store,
927 - const char *prefix, unsigned int flags)
927 + const char *prefix, const char **exclude_patterns,
928 + unsigned int flags)
929 {
930 struct packed_ref_store *refs;
931 struct snapshot *snapshot;
@@ -1149,7 +1150,7 @@ static int write_with_updates(struct packed_ref_store *refs,
1150 * list of refs is exhausted, set iter to NULL. When the list
1151 * of updates is exhausted, leave i set to updates->nr.
1152 */
1152 - iter = packed_ref_iterator_begin(&refs->base, "",
1153 + iter = packed_ref_iterator_begin(&refs->base, "", NULL,
1154 DO_FOR_EACH_INCLUDE_BROKEN);
1155 if ((ok = ref_iterator_advance(iter)) != ITER_OK)
1156 iter = NULL;
refs/refs-internal.h
+4 -3
@@ -367,8 +367,8 @@ int is_empty_ref_iterator(struct ref_iterator *ref_iterator);
367 */
368 struct ref_iterator *refs_ref_iterator_begin(
369 struct ref_store *refs,
370 - const char *prefix, int trim,
371 - enum do_for_each_ref_flags flags);
370 + const char *prefix, const char **exclude_patterns,
371 + int trim, enum do_for_each_ref_flags flags);
372
373 /*
374 * A callback function used to instruct merge_ref_iterator how to
@@ -570,7 +570,8 @@ typedef int copy_ref_fn(struct ref_store *ref_store,
570 */
571 typedef struct ref_iterator *ref_iterator_begin_fn(
572 struct ref_store *ref_store,
573 - const char *prefix, unsigned int flags);
573 + const char *prefix, const char **exclude_patterns,
574 + unsigned int flags);
575
576 /* reflog functions */
577
revision.c
+1 -1
@@ -2670,7 +2670,7 @@ static int for_each_bisect_ref(struct ref_store *refs, each_ref_fn fn,
2670 struct strbuf bisect_refs = STRBUF_INIT;
2671 int status;
2672 strbuf_addf(&bisect_refs, "refs/bisect/%s", term);
2673 - status = refs_for_each_fullref_in(refs, bisect_refs.buf, fn, cb_data);
2673 + status = refs_for_each_fullref_in(refs, bisect_refs.buf, NULL, fn, cb_data);
2674 strbuf_release(&bisect_refs);
2675 return status;
2676 }