status: always show tracking branch even no change

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>
This commit is contained in:
Jiang Xin 2013-08-26 15:02:49 +08:00 committed by Junio C Hamano
parent f2e087395b
commit f223459bec
3 changed files with 42 additions and 9 deletions

View File

@ -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",

View File

@ -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 &&

View 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"));