status: always show tracking branch even no change
authorJiang Xin <worldhello.net@gmail.com>
Mon, 26 Aug 2013 07:02:49 +0000 (15:02 +0800)
committerJunio C Hamano <gitster@pobox.com>
Mon, 26 Aug 2013 16:07:53 +0000 (09:07 -0700)
In order to see what the current branch is tracking, one way is using
"git branch -v -v", but branches other than the current are also
reported. Another way is using "git status", such as:

$ git status
# On branch master
# Your branch is ahead of 'origin/master' by 1 commit.
...

But this will not work if there is no change between the current
branch and its upstream. Always report upstream tracking info
even if there is no difference, so that "git status" is consistent
for checking tracking info for current branch. E.g.

$ git status
# On branch feature1
# Your branch is up-to-date with 'github/feature1'.
...

$ git status -bs
## feature1...github/feature1
...

$ git checkout feature1
Already on 'feature1'
Your branch is up-to-date with 'github/feature1'.
...

Also add some test cases in t6040.

Signed-off-by: Jiang Xin <worldhello.net@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
remote.c
t/t6040-tracking-info.sh
wt-status.c
index 87c8dd35be50a825cbb7ae6b5232fee9b43586d4..c972bf39e40d9f2c1c46d27831ef2a3a908a976b 100644 (file)
--- a/remote.c
+++ b/remote.c
@@ -1788,9 +1788,6 @@ int format_tracking_info(struct branch *branch, struct strbuf *sb)
                upstream_is_gone = 1;
                break;
        default:
-               /* Nothing to report if neither side has changes. */
-               if (!ours && !theirs)
-                       return 0;
                /* with base */
                break;
        }
@@ -1804,6 +1801,10 @@ int format_tracking_info(struct branch *branch, struct strbuf *sb)
                if (advice_status_hints)
                        strbuf_addf(sb,
                                _("  (use \"git branch --unset-upstream\" to fixup)\n"));
+       } else if (!ours && !theirs) {
+               strbuf_addf(sb,
+                       _("Your branch is up-to-date with '%s'.\n"),
+                       base);
        } else if (!theirs) {
                strbuf_addf(sb,
                        Q_("Your branch is ahead of '%s' by %d commit.\n",
index 6f678a4dc27f2983d8613411c3de00068370ddd6..ba26cfe9239306035c2496f922055eaea6b46a31 100755 (executable)
@@ -32,7 +32,8 @@ test_expect_success setup '
                git checkout -b brokenbase origin &&
                git checkout -b b5 --track brokenbase &&
                advance g &&
-               git branch -d brokenbase
+               git branch -d brokenbase &&
+               git checkout -b b6 origin
        ) &&
        git checkout -b follower --track master &&
        advance h
@@ -61,6 +62,7 @@ b2 origin/master: ahead 1, behind 1
 b3 origin/master: behind 1
 b4 origin/master: ahead 2
 b5 brokenbase: gone
+b6 origin/master
 EOF
 
 test_expect_success 'branch -vv' '
@@ -93,6 +95,13 @@ test_expect_success 'checkout (upstream is gone)' '
        test_i18ngrep "is based on .*, but the upstream is gone." actual
 '
 
+test_expect_success 'checkout (up-to-date with upstream)' '
+       (
+               cd test && git checkout b6
+       ) >actual &&
+       test_i18ngrep "Your branch is up-to-date with .origin/master" actual
+'
+
 test_expect_success 'status (diverged from upstream)' '
        (
                cd test &&
@@ -113,6 +122,16 @@ test_expect_success 'status (upstream is gone)' '
        test_i18ngrep "is based on .*, but the upstream is gone." actual
 '
 
+test_expect_success 'status (up-to-date with upstream)' '
+       (
+               cd test &&
+               git checkout b6 >/dev/null &&
+               # reports nothing to commit
+               test_must_fail git commit --dry-run
+       ) >actual &&
+       test_i18ngrep "Your branch is up-to-date with .origin/master" actual
+'
+
 cat >expect <<\EOF
 ## b1...origin/master [ahead 1, behind 1]
 EOF
@@ -139,6 +158,19 @@ test_expect_success 'status -s -b (upstream is gone)' '
        test_i18ncmp expect actual
 '
 
+cat >expect <<\EOF
+## b6...origin/master
+EOF
+
+test_expect_success 'status -s -b (up-to-date with upstream)' '
+       (
+               cd test &&
+               git checkout b6 >/dev/null &&
+               git status -s -b | head -1
+       ) >actual &&
+       test_i18ncmp expect actual
+'
+
 test_expect_success 'fail to track lightweight tags' '
        git checkout master &&
        git tag light &&
index 4b1713efb81d0edfea9abe05d7d34714eeca2186..c5e68174f97bd3f46b7aac2a65daea333a58851b 100644 (file)
@@ -1396,11 +1396,6 @@ static void wt_shortstatus_print_tracking(struct wt_status *s)
                upstream_is_gone = 1;
                break;
        default:
-               /* Stop reporting if neither side has changes. */
-               if (!num_ours && !num_theirs) {
-                       fputc(s->null_termination ? '\0' : '\n', s->fp);
-                       return;
-               }
                /* with base */
                break;
        }
@@ -1410,6 +1405,11 @@ static void wt_shortstatus_print_tracking(struct wt_status *s)
        color_fprintf(s->fp, header_color, "...");
        color_fprintf(s->fp, branch_color_remote, "%s", base);
 
+       if (!upstream_is_gone && !num_ours && !num_theirs) {
+               fputc(s->null_termination ? '\0' : '\n', s->fp);
+               return;
+       }
+
        color_fprintf(s->fp, header_color, " [");
        if (upstream_is_gone) {
                color_fprintf(s->fp, header_color, _("gone"));