The function for_each_remote() does exactly what the name suggests. The function remote_find_tracking() was extended to be able to search remote refs for a given local ref. You have to set the parameter "reverse" to true for that behavior. Both changes are required for the next step: simplification of git-branch's --track functionality. Signed-off-by: Johannes Schindelin <johannes.schindelin@xxxxxx> --- You're right. I completely missed that functionality. Well, a few tweaks were needed. If this clashes too seriously with Daniel's work, I will gladly redo it after his changes are in "next". remote.c | 42 ++++++++++++++++++++++++++++++++---------- remote.h | 7 ++++++- send-pack.c | 3 +-- 3 files changed, 39 insertions(+), 13 deletions(-) diff --git a/remote.c b/remote.c index cf98a44..21adb0d 100644 --- a/remote.c +++ b/remote.c @@ -279,6 +279,26 @@ struct remote *remote_get(const char *name) return ret; } +int for_each_remote(each_remote_fn fn, void *priv) +{ + int i, result = 0; + read_config(); + for (i = 0; i < allocated_remotes; i++) { + struct remote *r = remotes[i]; + if (!r) + continue; + if (!r->fetch) + r->fetch = parse_ref_spec(r->fetch_refspec_nr, + r->fetch_refspec); + if (!r->push) + r->push = parse_ref_spec(r->push_refspec_nr, + r->push_refspec); + if ((result = fn(r, priv))) + break; + } + return result; +} + int remote_has_uri(struct remote *remote, const char *uri) { int i; @@ -289,34 +309,36 @@ int remote_has_uri(struct remote *remote, const char *uri) return 0; } -int remote_find_tracking(struct remote *remote, struct refspec *refspec) +int remote_find_tracking(struct remote *remote, struct refspec *refspec, + int reverse) { int i; for (i = 0; i < remote->fetch_refspec_nr; i++) { struct refspec *fetch = &remote->fetch[i]; + const char *src = reverse ? fetch->dst : fetch->src; + const char *dst = reverse ? fetch->src : fetch->dst; if (!fetch->dst) continue; if (fetch->pattern) { - if (!prefixcmp(refspec->src, fetch->src)) { + if (!prefixcmp(refspec->src, src)) { refspec->dst = - xmalloc(strlen(fetch->dst) + + xmalloc(strlen(dst) + strlen(refspec->src) - - strlen(fetch->src) + 1); - strcpy(refspec->dst, fetch->dst); - strcpy(refspec->dst + strlen(fetch->dst), - refspec->src + strlen(fetch->src)); + strlen(src) + 1); + strcpy(refspec->dst, dst); + strcpy(refspec->dst + strlen(dst), + refspec->src + strlen(src)); refspec->force = fetch->force; return 0; } } else { - if (!strcmp(refspec->src, fetch->src)) { - refspec->dst = xstrdup(fetch->dst); + if (!strcmp(refspec->src, src)) { + refspec->dst = xstrdup(dst); refspec->force = fetch->force; return 0; } } } - refspec->dst = NULL; return -1; } diff --git a/remote.h b/remote.h index 01dbcef..9ab7eb6 100644 --- a/remote.h +++ b/remote.h @@ -20,6 +20,9 @@ struct remote { struct remote *remote_get(const char *name); +typedef int each_remote_fn(struct remote *remote, void *priv); +int for_each_remote(each_remote_fn fn, void *priv); + int remote_has_uri(struct remote *remote, const char *uri); struct refspec { @@ -35,7 +38,9 @@ int match_refs(struct ref *src, struct ref *dst, struct ref ***dst_tail, /* * For the given remote, reads the refspec's src and sets the other fields. + * If reverse is 1, the given src is the local ref, and we want the remote. */ -int remote_find_tracking(struct remote *remote, struct refspec *refspec); +int remote_find_tracking(struct remote *remote, struct refspec *refspec, + int reverse); #endif diff --git a/send-pack.c b/send-pack.c index fecbda9..9fdd7b4 100644 --- a/send-pack.c +++ b/send-pack.c @@ -305,8 +305,7 @@ static int send_pack(int in, int out, struct remote *remote, int nr_refspec, cha if (remote) { struct refspec rs; rs.src = ref->name; - remote_find_tracking(remote, &rs); - if (rs.dst) { + if (!remote_find_tracking(remote, &rs, 0)) { struct ref_lock *lock; fprintf(stderr, " Also local %s\n", rs.dst); if (will_delete_ref) { -- 1.5.3.rc0.2769.gd9be2 - 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