[RFC] status: show tracking branch even no difference

2013-08-07 Thread Jiang Xin
If the current branch has an upstream branch, and there are differences
between the current branch and its upstream, some commands (such as
git status, git status -bs, and git checkout) will report their
relationship. E.g.

$ git status
# On branch master
# Your branch is ahead of 'origin/master' by 1 commit.
#   (use git push to publish your local commits)
#
...

$ git status -bs
## master...origin/master [ahead 1]
...

$ git checkout master
Already on 'master'
Your branch is ahead of 'origin/master' by 1 commit.
  (use git push to publish your local commits)

But if there is no difference between the current branch and its
upstream, the relationship will not be reported, and it's hard to
tell whether the current branch has a tracking branch or not. And
what's worse, when the 'push.default' config variable is set to
`matching`, it's hard to tell whether current branch is pushed out
or not [1].

With this patch, git status will report relationship between current
branch and its upstream counterpart even if there is no difference.

$ git status
# On branch master
# Your branch is identical to its tracking branch: 'origin/master'.
#
...

$ git status -bs
## master...origin/master
...

$ git checkout master
Already on 'master'
Your branch is identical to its tracking branch: 'origin/master'.

[1]: http://thread.gmane.org/gmane.comp.version-control.git/198703

Signed-off-by: Jiang Xin worldhello@gmail.com
---
 remote.c| 22 --
 wt-status.c | 13 ++---
 2 files changed, 26 insertions(+), 9 deletions(-)

diff --git a/remote.c b/remote.c
index 2433467..8d6f278 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,14 +1762,16 @@ 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 are set to 0. */
if (theirs == ours)
return 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)
@@ -1812,12 +1816,18 @@ int format_tracking_info(struct branch *branch, struct 
strbuf *sb)
int num_ours, num_theirs;
const char *base;
 
-   if (!stat_tracking_info(branch, num_ours, num_theirs))
-   return 0;
+   if (!stat_tracking_info(branch, num_ours, num_theirs)) {
+   if (num_ours || num_theirs)
+   return 0;
+   }
 
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 its tracking branch: 
'%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/wt-status.c b/wt-status.c
index ff4b324..56f3c19 100644
--- a/wt-status.c
+++ b/wt-status.c
@@ -1381,9 +1381,11 @@ static void wt_shortstatus_print_tracking(struct 
wt_status *s)
if (s-is_initial)
color_fprintf(s-fp, header_color, _(Initial commit on ));
if (!stat_tracking_info(branch, num_ours, num_theirs)) {
-   color_fprintf(s-fp, branch_color_local, %s, branch_name);
-   fputc(s-null_termination ? '\0' : '\n', s-fp);
-   return;
+   if (num_ours || num_theirs) {
+   color_fprintf(s-fp, branch_color_local, %s, 
branch_name);
+   fputc(s-null_termination ? '\0' : '\n', s-fp);
+   return;
+   }
}
 
base = branch-merge[0]-dst;
@@ -1392,6 +1394,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  

Re: [RFC] status: show tracking branch even no difference

2013-08-07 Thread Matthieu Moy
Jiang Xin worldhello@gmail.com writes:

 With this patch, git status will report relationship between current
 branch and its upstream counterpart even if there is no difference.

 $ git status
 # On branch master
 # Your branch is identical to its tracking branch: 'origin/master'.

Why not, but we try to say remote-tracking branch instead of just
tracking. Adding remote- in your wording may make the line a bit
long, but it may be sufficient to say

# Your branch is identical to 'origin/master'

That's consistant with other messages like

# Your branch is ahead of '%s' by %d commits

(And this would deserve a test)

-- 
Matthieu Moy
http://www-verimag.imag.fr/~moy/
--
To unsubscribe from this list: send the line unsubscribe git in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [RFC] status: show tracking branch even no difference

2013-08-07 Thread Jiang Xin
2013/8/7 Matthieu Moy matthieu@grenoble-inp.fr:
 Jiang Xin worldhello@gmail.com writes:

 With this patch, git status will report relationship between current
 branch and its upstream counterpart even if there is no difference.

 $ git status
 # On branch master
 # Your branch is identical to its tracking branch: 'origin/master'.

 Why not, but we try to say remote-tracking branch instead of just
 tracking. Adding remote- in your wording may make the line a bit
 long, but it may be sufficient to say

 # Your branch is identical to 'origin/master'

That's better. Thanks.


 That's consistant with other messages like

 # Your branch is ahead of '%s' by %d commits

 (And this would deserve a test)

Will add some test cases in t6040 if this patch has value.

-- 
Jiang Xin
--
To unsubscribe from this list: send the line unsubscribe git in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html