diff --git a/builtin/branch.c b/builtin/branch.c
index 0836890..359e75d 100644
--- a/builtin/branch.c
+++ b/builtin/branch.c
@@ -424,19 +424,8 @@ static void fill_tracking_info(struct strbuf *stat, const char *branch_name,
struct branch *branch = branch_get(branch_name);
struct strbuf fancy = STRBUF_INIT;
- if (!stat_tracking_info(branch, &ours, &theirs)) {
- if (branch && branch->merge && branch->merge[0]->dst &&
- show_upstream_ref) {
- ref = shorten_unambiguous_ref(branch->merge[0]->dst, 0);
- if (want_color(branch_use_color))
- strbuf_addf(stat, "[%s%s%s] ",
- branch_get_color(BRANCH_COLOR_UPSTREAM),
- ref, branch_get_color(BRANCH_COLOR_RESET));
- else
- strbuf_addf(stat, "[%s] ", ref);
- }
+ if (!stat_tracking_info(branch, &ours, &theirs))
return;
- }
if (show_upstream_ref) {
ref = shorten_unambiguous_ref(branch->merge[0]->dst, 0);@@ -448,7 +437,10 @@ static void fill_tracking_info(struct strbuf *stat, const char *branch_name,
strbuf_addstr(&fancy, ref);
}
- if (!ours) {
+ if (!ours && !theirs) {
+ if (ref)
+ strbuf_addf(stat, _("[%s]"), fancy.buf);
+ } else if (!ours) {
if (ref)
strbuf_addf(stat, _("[%s: behind %d]"), fancy.buf, theirs);
elsediff --git a/remote.c b/remote.c
index 2433467..79766df 100644
--- a/remote.c
+++ b/remote.c
@@ -1740,6 +1740,10 @@ int stat_tracking_info(struct branch *branch, int *num_ours, int *num_theirs)
const char *rev_argv[10], *base;
int rev_argc;
+ /* Set both num_theirs and num_ours as undetermined. */
+ *num_theirs = -1;
+ *num_ours = -1;
+
/*
* Nothing to report unless we are marked to build on top of
* somebody else.
@@ -1758,16 +1762,18 @@ int stat_tracking_info(struct branch *branch, int *num_ours, int *num_theirs)
theirs = lookup_commit_reference(sha1);
if (!theirs)
return 0;
+ *num_theirs = 0;
if (read_ref(branch->refname, sha1))
return 0;
ours = lookup_commit_reference(sha1);
if (!ours)
return 0;
+ *num_ours = 0;
- /* are we the same? */
+ /* are we the same? both num_theirs and num_ours have been set to 0. */
if (theirs == ours)
- return 0;
+ return 1;
/* Run "rev-list --left-right ours...theirs" internally... */
rev_argc = 0;
@@ -1786,8 +1792,6 @@ int stat_tracking_info(struct branch *branch, int *num_ours, int *num_theirs)
prepare_revision_walk(&revs);
/* ... and count the commits on each side. */
- *num_ours = 0;
- *num_theirs = 0;
while (1) {
struct commit *c = get_revision(&revs);
if (!c)@@ -1817,7 +1821,11 @@ int format_tracking_info(struct branch *branch, struct strbuf *sb)
base = branch->merge[0]->dst;
base = shorten_unambiguous_ref(base, 0);
- if (!num_theirs) {
+ if (!num_ours && !num_theirs) {
+ strbuf_addf(sb,
+ _("Your branch is identical to '%s'.\n"),
+ base);
+ } else if (!num_theirs) {
strbuf_addf(sb,
Q_("Your branch is ahead of '%s' by %d commit.\n",
"Your branch is ahead of '%s' by %d commits.\n",diff --git a/t/t6040-tracking-info.sh b/t/t6040-tracking-info.sh
index ec2b516..eafce7d 100755
--- a/t/t6040-tracking-info.sh
+++ b/t/t6040-tracking-info.sh
@@ -28,18 +28,20 @@ test_expect_success setup '
git reset --hard HEAD^ &&
git checkout -b b4 origin &&
advance e &&
- advance f
+ advance f &&
+ git checkout -b b5 origin
) &&
git checkout -b follower --track master &&
advance g
'
-script='s/^..\(b.\)[ 0-9a-f]*\[\([^]]*\)\].*/\1 \2/p'
+script='s/^..\(b.\)[ 0-9a-f]*\(\[\([^]]*\)\]\)\{0,1\}.*/\1 \3/p'
cat >expect <<\EOF
b1 ahead 1, behind 1
b2 ahead 1, behind 1
b3 behind 1
b4 ahead 2
+b5
EOF
test_expect_success 'branch -v' '@@ -56,6 +58,7 @@ b1 origin/master: ahead 1, behind 1
b2 origin/master: ahead 1, behind 1
b3 origin/master: behind 1
b4 origin/master: ahead 2
+b5 origin/master
EOF
test_expect_success 'branch -vv' '
@@ -67,20 +70,27 @@ test_expect_success 'branch -vv' '
test_i18ncmp expect actual
'
-test_expect_success 'checkout' '
+test_expect_success 'checkout (diverged from upstream)' '
(
cd test && git checkout b1
) >actual &&
test_i18ngrep "have 1 and 1 different" actual
'
+test_expect_success 'checkout (identical to upstream)' '
+ (
+ cd test && git checkout b5
+ ) >actual &&
+ test_i18ngrep "Your branch is identical to .origin/master" actual
+'
+
test_expect_success 'checkout with local tracked branch' '
git checkout master &&
git checkout follower >actual &&
test_i18ngrep "is ahead of" actual
'
-test_expect_success 'status' '
+test_expect_success 'status (diverged from upstream)' '
(
cd test &&
git checkout b1 >/dev/null &&
@@ -90,6 +100,42 @@ test_expect_success 'status' '
test_i18ngrep "have 1 and 1 different" actual
'
+test_expect_success 'status (identical to upstream)' '
+ (
+ cd test &&
+ git checkout b5 >/dev/null &&
+ # reports nothing to commit
+ test_must_fail git commit --dry-run
+ ) >actual &&
+ test_i18ngrep "Your branch is identical to .origin/master" actual
+'
+
+cat >expect <<\EOF
+## b1...origin/master [ahead 1, behind 1]
+EOF
+
+test_expect_success 'status -s -b (diverged from upstream)' '
+ (
+ cd test &&
+ git checkout b1 >/dev/null &&
+ git status -s -b | head -1
+ ) >actual &&
+ test_i18ncmp expect actual
+'
+
+cat >expect <<\EOF
+## b5...origin/master
+EOF
+
+test_expect_success 'status -s -b (identical to upstream)' '
+ (
+ cd test &&
+ git checkout b5 >/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 &&
diff --git a/wt-status.c b/wt-status.c
index ff4b324..39742ff 100644
--- a/wt-status.c
+++ b/wt-status.c
@@ -1392,6 +1392,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 (!num_ours && !num_theirs) {
+ fputc(s->null_termination ? '\0' : '\n', s->fp);
+ return;
+ }
+
color_fprintf(s->fp, header_color, " [");
if (!num_ours) {
color_fprintf(s->fp, header_color, _("behind "));--
1.8.4.rc1.430.g417e2f3