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

[PATCHv2 2/2] Make local branches behave like remote branches when --tracked

From
Michael J Gruber <git@drmicha.warpmail.net>
Date
Apr 1, 2009, 21:42 UTC
Message-ID
<1238622169-5238-3-git-send-email-git@drmicha.warpmail.net>
In-Reply-To
<1238622169-5238-2-git-send-email-git@drmicha.warpmail.net>

This makes sure that local branches, when followed using --track, behave the same as remote ones (e.g. differences being reported by git status and git checkout). This fixes 1 known failure.

The fix is done within branch_get(): The first natural candidate, namely remote_find_tracking(), does not have all the necessary info because in general there is no remote struct for '.', and we don't want one because it would show up in other places as well.

branch_get(), on the other hand, has access to merge_names[] (in addition to merge[]) and therefore can set up the followed branch easily.

Signed-off-by: Michael J Gruber <git@drmicha.warpmail.net>
---
 remote.c                 |    7 +++++--
 t/t6040-tracking-info.sh |    2 +-
 2 files changed, 6 insertions(+), 3 deletions(-)
diff --git a/remote.c b/remote.c
index 2b037f1..d12140e 100644
--- a/remote.c
+++ b/remote.c
@@ -1170,8 +1170,9 @@ struct branch *branch_get(const char *name)
 			for (i = 0; i < ret->merge_nr; i++) {
 				ret->merge[i] = xcalloc(1, sizeof(**ret->merge));
 				ret->merge[i]->src = xstrdup(ret->merge_name[i]);
-				remote_find_tracking(ret->remote,
-						     ret->merge[i]);
+				if (remote_find_tracking(ret->remote, ret->merge[i])
+				    && !strcmp(ret->remote_name, "."))
+					ret->merge[i]->dst = xstrdup(ret->merge_name[i]);
 			}
 		}
 	}
@@ -1451,6 +1452,8 @@ int format_tracking_info(struct branch *branch, struct strbuf *sb)
 	base = branch->merge[0]->dst;
 	if (!prefixcmp(base, "refs/remotes/")) {
 		base += strlen("refs/remotes/");
+	} else if (!prefixcmp(base, "refs/heads/")) {
+		base += strlen("refs/heads/");
 	}
 	if (!num_theirs)
 		strbuf_addf(sb, "Your branch is ahead of '%s' "
diff --git a/t/t6040-tracking-info.sh b/t/t6040-tracking-info.sh
index 2a2b6b6..3d6db4d 100755
--- a/t/t6040-tracking-info.sh
+++ b/t/t6040-tracking-info.sh
@@ -58,7 +58,7 @@ test_expect_success 'checkout' '
 	grep "have 1 and 1 different" actual
 '
 
-test_expect_failure 'checkout with local tracked branch' '
+test_expect_success 'checkout with local tracked branch' '
 	git checkout master &&
 	git checkout follower >actual
 	grep "is ahead of" actual
-- 
1.6.2.1.507.g0e68d
Previous: Michael J GruberNext: Michael J Gruber
Message 14 of 15 in “Tracking of local branches”
  1. Michael J GruberMar 20, 2009
  2. Michael J GruberMar 20, 2009
  3. Junio C HamanoMar 20, 2009
  4. Daniel BarkalowMar 20, 2009
  5. 0/2 Make local branches behave like remote branches when --trackedMichael J Gruber, Mar 26, 2009
  6. 1/2 Test for local branches being followed with --trackMichael J Gruber, Mar 26, 2009
  7. 2/2 Make local branches behave like remote branches when --trackedMichael J Gruber, Mar 26, 2009
  8. Junio C HamanoMar 27, 2009
  9. Michael J GruberMar 27, 2009
  10. Junio C HamanoMar 27, 2009
  11. Michael J GruberMar 27, 2009
  12. 0/2 Make local branches behave like remote branches when --trackedMichael J Gruber, Apr 1, 2009
  13. 1/2 Test for local branches being followed with --trackMichael J Gruber, Apr 1, 2009
  14. 2/2 Make local branches behave like remote branches when --trackedMichael J Gruber, Apr 1, 2009
  15. Michael J GruberMar 26, 2009

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.