clean up interface for refs_warn_dangling_symrefs

The refs_warn_dangling_symrefs interface is a bit fragile as it passes
in printf-formatting strings with expectations about the number of
arguments. This patch series made it worse by adding a 2nd positional
argument. But there are only two call sites, and they both use almost
identical display options.

Make this safer by moving the format strings into the function that uses
them to make it easier to see when the arguments don't match. Pass a
prefix string and a dry_run flag so the decision logic can be handled
where needed.

Signed-off-by: Phil Hord <phil.hord@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Phil Hord
2025-07-01 18:12:15 -07:00
committed by Junio C Hamano
parent 0f84695499
commit 87d8d8c5d0
4 changed files with 15 additions and 15 deletions

View File

@@ -1385,9 +1385,6 @@ static int prune_refs(struct display_state *display_state,
struct ref *ref, *stale_refs = get_stale_heads(rs, ref_map); struct ref *ref, *stale_refs = get_stale_heads(rs, ref_map);
struct strbuf err = STRBUF_INIT; struct strbuf err = STRBUF_INIT;
struct string_list refnames = STRING_LIST_INIT_NODUP; struct string_list refnames = STRING_LIST_INIT_NODUP;
const char *dangling_msg = dry_run
? _(" %s will become dangling after %s is deleted")
: _(" %s has become dangling after %s was deleted");
for (ref = stale_refs; ref; ref = ref->next) for (ref = stale_refs; ref; ref = ref->next)
string_list_append(&refnames, ref->name); string_list_append(&refnames, ref->name);
@@ -1418,7 +1415,7 @@ static int prune_refs(struct display_state *display_state,
} }
string_list_sort(&refnames); string_list_sort(&refnames);
refs_warn_dangling_symrefs(get_main_ref_store(the_repository), refs_warn_dangling_symrefs(get_main_ref_store(the_repository),
stderr, dangling_msg, &refnames); stderr, " ", dry_run, &refnames);
} }
cleanup: cleanup:

View File

@@ -1515,9 +1515,6 @@ static int prune_remote(const char *remote, int dry_run)
struct ref_states states = REF_STATES_INIT; struct ref_states states = REF_STATES_INIT;
struct string_list refs_to_prune = STRING_LIST_INIT_NODUP; struct string_list refs_to_prune = STRING_LIST_INIT_NODUP;
struct string_list_item *item; struct string_list_item *item;
const char *dangling_msg = dry_run
? _(" %s will become dangling after %s is deleted!")
: _(" %s has become dangling after %s was deleted!");
get_remote_ref_states(remote, &states, GET_REF_STATES); get_remote_ref_states(remote, &states, GET_REF_STATES);
@@ -1549,7 +1546,7 @@ static int prune_remote(const char *remote, int dry_run)
} }
refs_warn_dangling_symrefs(get_main_ref_store(the_repository), refs_warn_dangling_symrefs(get_main_ref_store(the_repository),
stdout, dangling_msg, &refs_to_prune); stdout, " ", dry_run, &refs_to_prune);
string_list_clear(&refs_to_prune, 0); string_list_clear(&refs_to_prune, 0);
free_remote_ref_states(&states); free_remote_ref_states(&states);

17
refs.c
View File

@@ -439,7 +439,8 @@ struct warn_if_dangling_data {
struct ref_store *refs; struct ref_store *refs;
FILE *fp; FILE *fp;
const struct string_list *refnames; const struct string_list *refnames;
const char *msg_fmt; const char *indent;
int dry_run;
}; };
static int warn_if_dangling_symref(const char *refname, const char *referent UNUSED, static int warn_if_dangling_symref(const char *refname, const char *referent UNUSED,
@@ -447,7 +448,7 @@ static int warn_if_dangling_symref(const char *refname, const char *referent UNU
int flags, void *cb_data) int flags, void *cb_data)
{ {
struct warn_if_dangling_data *d = cb_data; struct warn_if_dangling_data *d = cb_data;
const char *resolves_to; const char *resolves_to, *msg;
if (!(flags & REF_ISSYMREF)) if (!(flags & REF_ISSYMREF))
return 0; return 0;
@@ -458,19 +459,23 @@ static int warn_if_dangling_symref(const char *refname, const char *referent UNU
return 0; return 0;
} }
fprintf(d->fp, d->msg_fmt, refname, resolves_to); msg = d->dry_run
fputc('\n', d->fp); ? _("%s%s will become dangling after %s is deleted\n")
: _("%s%s has become dangling after %s was deleted\n");
fprintf(d->fp, msg, d->indent, refname, resolves_to);
return 0; return 0;
} }
void refs_warn_dangling_symrefs(struct ref_store *refs, FILE *fp, void refs_warn_dangling_symrefs(struct ref_store *refs, FILE *fp,
const char *msg_fmt, const struct string_list *refnames) const char *indent, int dry_run,
const struct string_list *refnames)
{ {
struct warn_if_dangling_data data = { struct warn_if_dangling_data data = {
.refs = refs, .refs = refs,
.fp = fp, .fp = fp,
.refnames = refnames, .refnames = refnames,
.msg_fmt = msg_fmt, .indent = indent,
.dry_run = dry_run,
}; };
refs_for_each_rawref(refs, warn_if_dangling_symref, &data); refs_for_each_rawref(refs, warn_if_dangling_symref, &data);
} }

3
refs.h
View File

@@ -436,7 +436,8 @@ static inline const char *has_glob_specials(const char *pattern)
} }
void refs_warn_dangling_symrefs(struct ref_store *refs, FILE *fp, void refs_warn_dangling_symrefs(struct ref_store *refs, FILE *fp,
const char *msg_fmt, const struct string_list *refnames); const char *indent, int dry_run,
const struct string_list *refnames);
/* /*
* Flags for controlling behaviour of pack_refs() * Flags for controlling behaviour of pack_refs()