From c500352e0de75db34b1a071a9e250b815d10f95b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Carlos=20Mart=C3=ADn=20Nieto?= Date: Sat, 15 Oct 2011 07:04:24 +0200 Subject: [PATCH] remote: separate out the remote_find_tracking logic into query_refspecs MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Move the body of remote_find_tracking() to a new helper query_refspecs() that finds a refspec that matches and applies the transformation, but explicitly takes the list of refspecs, and make remote_find_tracking() a thin wrapper of it. Make apply_refspecs() also use query_refspecs(). Signed-off-by: Carlos Martín Nieto Signed-off-by: Junio C Hamano --- remote.c | 69 +++++++++++++++++++++++++++----------------------------- 1 file changed, 33 insertions(+), 36 deletions(-) diff --git a/remote.c b/remote.c index b8ecfa5d95..823c82ab7e 100644 --- a/remote.c +++ b/remote.c @@ -828,59 +828,56 @@ static int match_name_with_pattern(const char *key, const char *name, return ret; } -char *apply_refspecs(struct refspec *refspecs, int nr_refspec, - const char *name) +static int query_refspecs(struct refspec *refs, int ref_count, struct refspec *query) { int i; - char *ret = NULL; - for (i = 0; i < nr_refspec; i++) { - struct refspec *refspec = refspecs + i; - if (refspec->pattern) { - if (match_name_with_pattern(refspec->src, name, - refspec->dst, &ret)) - return ret; - } else if (!strcmp(refspec->src, name)) - return strdup(refspec->dst); - } - return NULL; -} + int find_src = !query->src; -int remote_find_tracking(struct remote *remote, struct refspec *refspec) -{ - int find_src = refspec->src == NULL; - char *needle, **result; - int i; + if (find_src && !query->dst) + return error("query_refspecs: need either src or dst"); - if (find_src) { - if (!refspec->dst) - return error("find_tracking: need either src or dst"); - needle = refspec->dst; - result = &refspec->src; - } else { - needle = refspec->src; - result = &refspec->dst; - } + for (i = 0; i < ref_count; i++) { + struct refspec *refspec = &refs[i]; + const char *key = find_src ? refspec->dst : refspec->src; + const char *value = find_src ? refspec->src : refspec->dst; + const char *needle = find_src ? query->dst : query->src; + char **result = find_src ? &query->src : &query->dst; - for (i = 0; i < remote->fetch_refspec_nr; i++) { - struct refspec *fetch = &remote->fetch[i]; - const char *key = find_src ? fetch->dst : fetch->src; - const char *value = find_src ? fetch->src : fetch->dst; - if (!fetch->dst) + if (!refspec->dst) continue; - if (fetch->pattern) { + if (refspec->pattern) { if (match_name_with_pattern(key, needle, value, result)) { - refspec->force = fetch->force; + query->force = refspec->force; return 0; } } else if (!strcmp(needle, key)) { *result = xstrdup(value); - refspec->force = fetch->force; + query->force = refspec->force; return 0; } } return -1; } +char *apply_refspecs(struct refspec *refspecs, int nr_refspec, + const char *name) +{ + struct refspec query; + + memset(&query, 0, sizeof(struct refspec)); + query.src = (char *)name; + + if (query_refspecs(refspecs, nr_refspec, &query)) + return NULL; + + return query.dst; +} + +int remote_find_tracking(struct remote *remote, struct refspec *refspec) +{ + return query_refspecs(remote->fetch, remote->fetch_refspec_nr, refspec); +} + static struct ref *alloc_ref_with_prefix(const char *prefix, size_t prefixlen, const char *name) {