]> git.ipfire.org Git - thirdparty/git.git/commitdiff
clean up interface for refs_warn_dangling_symrefs
authorPhil Hord <phil.hord@gmail.com>
Wed, 2 Jul 2025 01:12:15 +0000 (18:12 -0700)
committerJunio C Hamano <gitster@pobox.com>
Wed, 2 Jul 2025 01:42:25 +0000 (18:42 -0700)
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>
builtin/fetch.c
builtin/remote.c
refs.c
refs.h

index f05530b62ee415b18607ce0f0483e8acf081bdf8..98d89d6f65214b1bd5a1d8b22f668c2437aece1b 100644 (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 strbuf err = STRBUF_INIT;
        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)
                string_list_append(&refnames, ref->name);
@@ -1418,7 +1415,7 @@ static int prune_refs(struct display_state *display_state,
                }
                string_list_sort(&refnames);
                refs_warn_dangling_symrefs(get_main_ref_store(the_repository),
-                                          stderr, dangling_msg, &refnames);
+                                          stderr, "   ", dry_run, &refnames);
        }
 
 cleanup:
index 30cf4100d4495194761f19153c3ebe0d75cf2e38..81912fed55ddcb7cc2e40d6f51257d2a2cc9e749 100644 (file)
@@ -1515,9 +1515,6 @@ static int prune_remote(const char *remote, int dry_run)
        struct ref_states states = REF_STATES_INIT;
        struct string_list refs_to_prune = STRING_LIST_INIT_NODUP;
        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);
 
@@ -1549,7 +1546,7 @@ static int prune_remote(const char *remote, int dry_run)
        }
 
        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);
        free_remote_ref_states(&states);
diff --git a/refs.c b/refs.c
index b0e67077a6c994bf2235b4acd9ba6fac44e190ec..8573310a06f863c3f32ef4fea59a3876628f99f8 100644 (file)
--- a/refs.c
+++ b/refs.c
@@ -439,7 +439,8 @@ struct warn_if_dangling_data {
        struct ref_store *refs;
        FILE *fp;
        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,
@@ -447,7 +448,7 @@ static int warn_if_dangling_symref(const char *refname, const char *referent UNU
                                   int flags, void *cb_data)
 {
        struct warn_if_dangling_data *d = cb_data;
-       const char *resolves_to;
+       const char *resolves_to, *msg;
 
        if (!(flags & REF_ISSYMREF))
                return 0;
@@ -458,19 +459,23 @@ static int warn_if_dangling_symref(const char *refname, const char *referent UNU
                return 0;
        }
 
-       fprintf(d->fp, d->msg_fmt, refname, resolves_to);
-       fputc('\n', d->fp);
+       msg = d->dry_run
+               ? _("%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;
 }
 
 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 = {
                .refs = refs,
                .fp = fp,
                .refnames = refnames,
-               .msg_fmt = msg_fmt,
+               .indent = indent,
+               .dry_run = dry_run,
        };
        refs_for_each_rawref(refs, warn_if_dangling_symref, &data);
 }
diff --git a/refs.h b/refs.h
index 60642bc24ac90a4248658c5881ff68b84366357c..6b9c6d5764d91de76984f9af0317bdda3305c548 100644 (file)
--- a/refs.h
+++ b/refs.h
@@ -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,
-                               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()