git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[RFC] status: show tracking branch even no difference

From
Jiang Xin <worldhello.net@gmail.com>
Date
Aug 7, 2013, 15:42 UTC
Message-ID
<46fb1948a57990b0ea737401f2d60f654da4bb4f.1375890091.git.worldhello.net@gmail.com>

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.net@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 && !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.429.g46fb194
Next: Matthieu Moy
Message 1 of 36 in “[RFC] status: show tracking branch even no difference”
  1. Jiang XinAug 7, 2013
  2. Matthieu MoyAug 7, 2013
  3. Jiang XinAug 7, 2013
  4. status: always show tracking branch even no changeJiang Xin, Aug 8, 2013
  5. status: always show tracking branch even no changeJiang Xin, Aug 8, 2013
  6. status: always show tracking branch even no changeJiang Xin, Aug 8, 2013
  7. Junio C HamanoAug 9, 2013
  8. Jiang XinAug 10, 2013
  9. Junio C HamanoAug 12, 2013
  10. Jiang XinAug 13, 2013
  11. 1/2 branch: not report invalid tracking branchJiang Xin, Aug 13, 2013
  12. 2/2 status: always show tracking branch even no changeJiang Xin, Aug 13, 2013
  13. Junio C HamanoAug 14, 2013
  14. Jiang XinAug 15, 2013
  15. Junio C HamanoAug 14, 2013
  16. 1/3 branch: not report invalid tracking branchJiang Xin, Aug 15, 2013
  17. 2/3 branch: report invalid tracking branch as brokenJiang Xin, Aug 15, 2013
  18. Junio C HamanoAug 15, 2013
  19. Junio C HamanoAug 15, 2013
  20. 0/3 some enhancements for reporting branch tracking infoJiang Xin, Aug 16, 2013
  21. 1/3 branch: not report invalid tracking branchJiang Xin, Aug 16, 2013
  22. 2/3 branch: mark missing tracking branch as goneJiang Xin, Aug 16, 2013
  23. Matthieu MoyAug 21, 2013
  24. Jiang XinAug 22, 2013
  25. 3/3 status: always show tracking branch even no changeJiang Xin, Aug 16, 2013
  26. Junio C HamanoAug 18, 2013
  27. Jiang XinAug 19, 2013
  28. 0/2 some enhancements for reporting branch tracking infoJiang Xin, Aug 26, 2013
  29. 1/2 branch: report invalid tracking branch as goneJiang Xin, Aug 26, 2013
  30. 2/2 status: always show tracking branch even no changeJiang Xin, Aug 26, 2013
  31. Jeremy RosenAug 26, 2013
  32. Jiang XinAug 26, 2013
  33. Junio C HamanoAug 26, 2013
  34. Junio C HamanoAug 26, 2013
  35. 3/3 status: always show tracking branch even no changeJiang Xin, Aug 15, 2013
  36. Junio C HamanoAug 15, 2013

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.