On Thu, Jan 29, 2009 at 05:33:08PM -0500, Jeff King wrote: > 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"); -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html