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

Re: [PATCH] push: Learn to set up branch tracking with '--track'

From
Jeff King <peff@peff.net>
Date
Jan 29, 2009, 23:17 UTC
Message-ID
<20090129231715.GA17399@coredump.intra.peff.net>
In-Reply-To
<20090129223308.GB12871@coredump.intra.peff.net>
On Thu, Jan 29, 2009 at 05:33:08PM -0500, Jeff King wrote:
Show 8 quoted lines
> So I think this patch is going about it the wrong way. Instead of
> parsing the refspec, I think you actually want to look at what we _do_
> push (or at least try to push -- probably even uptodate refs should also
> have tracking established), and use that. Then you will have wildcards
> expanded, --all handled, etc. And I suspect all you have to do is
> iterate over the result of match_refs (which we call later), which
> should be even easier (because you don't have to parse the refspecs
> yourself). But I haven't looked carefully.

Something like the patch below (which is obviously missing all of the infrastructure for doing this optionally, but is meant to illustrate what I'm talking about).

The downside of this is that it only works for the git protocol transport, making dumb push even more of a second class citizen (it looks like this is already the case for updating tracking refs). But I think this is the right place to do it, since we have detailed information on the matched refs. If other transports want to do the same thing, we should abstract setup_tracking (and update_tracking_ref while we're at it) and call them from those transports.

---
diff --git a/builtin-send-pack.c b/builtin-send-pack.c
index d65d019..23b326a 100644
--- a/builtin-send-pack.c
+++ b/builtin-send-pack.c
@@ -247,6 +247,31 @@ static void update_tracking_ref(struct remote *remote, struct ref *ref)
 	}
 }
 
+static void setup_tracking(const char *remote, struct ref *ref)
+{
+	const char *name;
+	struct strbuf key = STRBUF_INIT;
+
+	if (ref->status != REF_STATUS_OK && ref->status != REF_STATUS_UPTODATE)
+		return;
+	if (!ref->peer_ref)
+		return;
+
+	name = ref->peer_ref->name;
+	if (prefixcmp(name, "refs/heads/"))
+		return;
+	name += 11;
+
+	strbuf_addf(&key, "branch.%s.remote", name);
+	git_config_set(key.buf, remote);
+
+	strbuf_reset(&key);
+	strbuf_addf(&key, "branch.%s.merge", name);
+	git_config_set(key.buf, ref->name);
+
+	strbuf_release(&key);
+}
+
 static const char *prettify_ref(const struct ref *ref)
 {
 	const char *name = ref->name;
@@ -523,6 +548,10 @@ static int do_send_pack(int in, int out, struct remote *remote, const char *dest
 		for (ref = remote_refs; ref; ref = ref->next)
 			update_tracking_ref(remote, ref);
 	}
+	if (/* args.track && */ !args.dry_run) {
+		for (ref = remote_refs; ref; ref = ref->next)
+			setup_tracking(remote ? remote->name : dest, ref);
+	}
 
 	if (!refs_pushed(remote_refs))
 		fprintf(stderr, "Everything up-to-date\n");
Previous: Jeff KingNext: Johannes Schindelin
Message 6 of 15 in “push: Learn to set up branch tracking with '--track'”
  1. push: Learn to set up branch tracking with '--track'Johannes Schindelin, Jan 29, 2009
  2. Sverre RabbelierJan 29, 2009
  3. Johannes SchindelinJan 29, 2009
  4. Johannes SchindelinJan 29, 2009
  5. Jeff KingJan 29, 2009
  6. Jeff KingJan 29, 2009
  7. Johannes SchindelinJan 30, 2009
  8. Jeff KingJan 30, 2009
  9. Johannes SchindelinJan 30, 2009
  10. Jeff KingJan 30, 2009
  11. Johannes SchindelinJan 30, 2009
  12. Jeff KingFeb 2, 2009
  13. Johannes SchindelinFeb 2, 2009
  14. Jeff KingFeb 6, 2009
  15. Johannes SchindelinFeb 6, 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.