]> git.ipfire.org Git - thirdparty/git.git/commitdiff
refactor format_branch_comparison in preparation
authorHarald Nordgren <haraldnordgren@gmail.com>
Tue, 13 Jan 2026 12:11:55 +0000 (12:11 +0000)
committerJunio C Hamano <gitster@pobox.com>
Tue, 13 Jan 2026 14:08:39 +0000 (06:08 -0800)
Refactor format_branch_comparison function in preparation for showing
comparison with push remote tracking branch.

Signed-off-by: Harald Nordgren <haraldnordgren@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
remote.c

index 59b371512084eb8c7cb56ee7663da2b3f04df779..d5a648602644c2730b4395a309166dcdf2d8bc1f 100644 (file)
--- a/remote.c
+++ b/remote.c
@@ -2237,42 +2237,21 @@ int stat_tracking_info(struct branch *branch, int *num_ours, int *num_theirs,
        return stat_branch_pair(branch->refname, base, num_ours, num_theirs, abf);
 }
 
-/*
- * Return true when there is anything to report, otherwise false.
- */
-int format_tracking_info(struct branch *branch, struct strbuf *sb,
-                        enum ahead_behind_flags abf,
-                        int show_divergence_advice)
-{
-       int ours, theirs, sti;
-       const char *full_base;
-       char *base;
-       int upstream_is_gone = 0;
-
-       sti = stat_tracking_info(branch, &ours, &theirs, &full_base, 0, abf);
-       if (sti < 0) {
-               if (!full_base)
-                       return 0;
-               upstream_is_gone = 1;
-       }
-
-       base = refs_shorten_unambiguous_ref(get_main_ref_store(the_repository),
-                                           full_base, 0);
-       if (upstream_is_gone) {
-               strbuf_addf(sb,
-                       _("Your branch is based on '%s', but the upstream is gone.\n"),
-                       base);
-               if (advice_enabled(ADVICE_STATUS_HINTS))
-                       strbuf_addstr(sb,
-                               _("  (use \"git branch --unset-upstream\" to fixup)\n"));
-       } else if (!sti) {
+static void format_branch_comparison(struct strbuf *sb,
+                                    bool up_to_date,
+                                    int ours, int theirs,
+                                    const char *branch_name,
+                                    enum ahead_behind_flags abf,
+                                    bool show_divergence_advice)
+{
+       if (up_to_date) {
                strbuf_addf(sb,
                        _("Your branch is up to date with '%s'.\n"),
-                       base);
+                       branch_name);
        } else if (abf == AHEAD_BEHIND_QUICK) {
                strbuf_addf(sb,
                            _("Your branch and '%s' refer to different commits.\n"),
-                           base);
+                           branch_name);
                if (advice_enabled(ADVICE_STATUS_HINTS))
                        strbuf_addf(sb, _("  (use \"%s\" for details)\n"),
                                    "git status --ahead-behind");
@@ -2281,7 +2260,7 @@ int format_tracking_info(struct branch *branch, struct strbuf *sb,
                        Q_("Your branch is ahead of '%s' by %d commit.\n",
                           "Your branch is ahead of '%s' by %d commits.\n",
                           ours),
-                       base, ours);
+                       branch_name, ours);
                if (advice_enabled(ADVICE_STATUS_HINTS))
                        strbuf_addstr(sb,
                                _("  (use \"git push\" to publish your local commits)\n"));
@@ -2292,7 +2271,7 @@ int format_tracking_info(struct branch *branch, struct strbuf *sb,
                           "Your branch is behind '%s' by %d commits, "
                               "and can be fast-forwarded.\n",
                           theirs),
-                       base, theirs);
+                       branch_name, theirs);
                if (advice_enabled(ADVICE_STATUS_HINTS))
                        strbuf_addstr(sb,
                                _("  (use \"git pull\" to update your local branch)\n"));
@@ -2305,12 +2284,47 @@ int format_tracking_info(struct branch *branch, struct strbuf *sb,
                               "and have %d and %d different commits each, "
                               "respectively.\n",
                           ours + theirs),
-                       base, ours, theirs);
+                       branch_name, ours, theirs);
                if (show_divergence_advice &&
                    advice_enabled(ADVICE_STATUS_HINTS))
                        strbuf_addstr(sb,
                                _("  (use \"git pull\" if you want to integrate the remote branch with yours)\n"));
        }
+}
+
+/*
+ * Return true when there is anything to report, otherwise false.
+ */
+int format_tracking_info(struct branch *branch, struct strbuf *sb,
+                        enum ahead_behind_flags abf,
+                        int show_divergence_advice)
+{
+       int ours, theirs, cmp_fetch;
+       const char *full_base;
+       char *base;
+       int upstream_is_gone = 0;
+
+       cmp_fetch = stat_tracking_info(branch, &ours, &theirs, &full_base, 0, abf);
+       if (cmp_fetch < 0) {
+               if (!full_base)
+                       return 0;
+               upstream_is_gone = 1;
+       }
+
+       base = refs_shorten_unambiguous_ref(get_main_ref_store(the_repository),
+                                           full_base, 0);
+
+       if (upstream_is_gone) {
+               strbuf_addf(sb,
+                       _("Your branch is based on '%s', but the upstream is gone.\n"),
+                       base);
+               if (advice_enabled(ADVICE_STATUS_HINTS))
+                       strbuf_addstr(sb,
+                               _("  (use \"git branch --unset-upstream\" to fixup)\n"));
+       } else {
+               format_branch_comparison(sb, !cmp_fetch, ours, theirs, base, abf, show_divergence_advice);
+       }
+
        free(base);
        return 1;
 }