aboutsummaryrefslogtreecommitdiff
path: root/ls-refs.c
diff options
context:
space:
mode:
authorPatrick Steinhardt <ps@pks.im>2026-02-23 12:59:43 +0100
committerJunio C Hamano <gitster@pobox.com>2026-02-23 13:21:18 -0800
commitf503bb7dc96ee92623ade8d60eed401ecfddae0f (patch)
tree789daac4e90fe93e908969d2201982874770e972 /ls-refs.c
parent5387919327574b5067f7efd986fca8793c95c71a (diff)
downloadgit-f503bb7dc96ee92623ade8d60eed401ecfddae0f.tar.xz
refs: generalize `refs_for_each_fullref_in_prefixes()`
The function `refs_for_each_fullref_in_prefixes()` can be used to iterate over all references part of any of the user-provided prefixes. In contrast to the `prefix` parameter of `refs_for_each_ref_ext()` it knows to handle the case well where multiple of the passed-in prefixes start with a common prefix by computing longest common prefixes and then iterating over those. While we could move this logic into `refs_for_each_ref_ext()`, this one feels somewhat special as we perform multiple iterations. But what we _can_ do is to generalize how this function works: instead of accepting only a small handful of parameters, we can have it accept the full options structure. One obvious exception is that the caller must not provide a prefix via the options. But this case can be easily detected. Refactor the code accordingly. Signed-off-by: Patrick Steinhardt <ps@pks.im> Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 'ls-refs.c')
-rw-r--r--ls-refs.c11
1 files changed, 7 insertions, 4 deletions
diff --git a/ls-refs.c b/ls-refs.c
index 8641281b86..9759826ca7 100644
--- a/ls-refs.c
+++ b/ls-refs.c
@@ -160,6 +160,7 @@ static int ls_refs_config(const char *var, const char *value,
int ls_refs(struct repository *r, struct packet_reader *request)
{
+ struct refs_for_each_ref_options opts = { 0 };
struct ls_refs_data data;
memset(&data, 0, sizeof(data));
@@ -201,10 +202,12 @@ int ls_refs(struct repository *r, struct packet_reader *request)
send_possibly_unborn_head(&data);
if (!data.prefixes.nr)
strvec_push(&data.prefixes, "");
- refs_for_each_fullref_in_prefixes(get_main_ref_store(r),
- get_git_namespace(), data.prefixes.v,
- hidden_refs_to_excludes(&data.hidden_refs),
- send_ref, &data);
+
+ opts.exclude_patterns = hidden_refs_to_excludes(&data.hidden_refs);
+ opts.namespace = get_git_namespace();
+
+ refs_for_each_ref_in_prefixes(get_main_ref_store(r), data.prefixes.v,
+ &opts, send_ref, &data);
packet_fflush(stdout);
strvec_clear(&data.prefixes);
strbuf_release(&data.buf);