Re: [PATCH 3/5] remote: separate out the remote_find_tracking logic into query_refspecs
- From
Junio C Hamano <gitster@pobox.com>
- Date
- Oct 16, 2011, 04:45 UTC
- Message-ID
- <7vobxhtugo.fsf@alter.siamese.dyndns.org>
- In-Reply-To
- <1318655066-29001-4-git-send-email-cmn@elego.de>
Carlos Martín Nieto <cmn@elego.de> writes:
Show 10 quoted lines
> Move the body of remote_find_tracking to a new function query_refspecs > which does the same (find a refspec that matches and apply the > transformation) but explicitly wants the list of refspecs. > > Make remote_find_tracking and apply_refspecs use query_refspecs. > > Signed-off-by: Carlos Martín Nieto <cmn@elego.de> > --- > remote.c | 70 ++++++++++++++++++++++++++++++------------------------------- > 1 files changed, 34 insertions(+), 36 deletions(-)
Looks very sensible, especially knowing what you want to do in the next patch ;-).
Thanks.
Show 99 quoted lines
>
> diff --git a/remote.c b/remote.c
> index b8ecfa5..e94c6d2 100644
> --- a/remote.c
> +++ b/remote.c
> @@ -828,59 +828,57 @@ 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 == NULL;
>
> -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, 0x0, 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)
> {