From 5d46c9d41febe5fe85f94f7db2b190d8abf1e71e Mon Sep 17 00:00:00 2001 From: Daniel Barkalow Date: Sat, 12 May 2007 11:46:03 -0400 Subject: [PATCH] Add handlers for fetch-side configuration of remotes. These follow the pattern of the push side configuration, but aren't taken from anywhere else, because git-fetch is still in shell. Signed-off-by: Daniel Barkalow Signed-off-by: Junio C Hamano --- remote.c | 59 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ remote.h | 11 +++++++++++ 2 files changed, 70 insertions(+) diff --git a/remote.c b/remote.c index bc27a8e3df..46fe8d91b5 100644 --- a/remote.c +++ b/remote.c @@ -17,6 +17,15 @@ static void add_push_refspec(struct remote *remote, const char *ref) remote->push_refspec_nr = nr; } +static void add_fetch_refspec(struct remote *remote, const char *ref) +{ + int nr = remote->fetch_refspec_nr + 1; + remote->fetch_refspec = + xrealloc(remote->fetch_refspec, nr * sizeof(char *)); + remote->fetch_refspec[nr-1] = ref; + remote->fetch_refspec_nr = nr; +} + static void add_uri(struct remote *remote, const char *uri) { int nr = remote->uri_nr + 1; @@ -74,6 +83,9 @@ static void read_remotes_file(struct remote *remote) } else if (!prefixcmp(buffer, "Push:")) { value_list = 1; s = buffer + 5; + } else if (!prefixcmp(buffer, "Pull:")) { + value_list = 2; + s = buffer + 5; } else continue; @@ -93,6 +105,9 @@ static void read_remotes_file(struct remote *remote) case 1: add_push_refspec(remote, xstrdup(s)); break; + case 2: + add_fetch_refspec(remote, xstrdup(s)); + break; } } fclose(f); @@ -174,6 +189,8 @@ static int handle_config(const char *key, const char *value) add_uri(remote, xstrdup(value)); } else if (!strcmp(subkey, ".push")) { add_push_refspec(remote, xstrdup(value)); + } else if (!strcmp(subkey, ".fetch")) { + add_fetch_refspec(remote, xstrdup(value)); } else if (!strcmp(subkey, ".receivepack")) { if (!remote->receivepack) remote->receivepack = xstrdup(value); @@ -257,10 +274,52 @@ struct remote *remote_get(const char *name) add_uri(ret, name); if (!ret->uri) return NULL; + ret->fetch = parse_ref_spec(ret->fetch_refspec_nr, ret->fetch_refspec); ret->push = parse_ref_spec(ret->push_refspec_nr, ret->push_refspec); return ret; } +int remote_has_uri(struct remote *remote, const char *uri) +{ + int i; + for (i = 0; i < remote->uri_nr; i++) { + if (!strcmp(remote->uri[i], uri)) + return 1; + } + return 0; +} + +int remote_find_tracking(struct remote *remote, struct refspec *refspec) +{ + int i; + for (i = 0; i < remote->fetch_refspec_nr; i++) { + struct refspec *fetch = &remote->fetch[i]; + if (!fetch->dst) + continue; + if (fetch->pattern) { + if (!prefixcmp(refspec->src, fetch->src)) { + refspec->dst = + xmalloc(strlen(fetch->dst) + + strlen(refspec->src) - + strlen(fetch->src) + 1); + strcpy(refspec->dst, fetch->dst); + strcpy(refspec->dst + strlen(fetch->dst), + refspec->src + strlen(fetch->src)); + refspec->force = fetch->force; + return 0; + } + } else { + if (!strcmp(refspec->src, fetch->src)) { + refspec->dst = xstrdup(fetch->dst); + refspec->force = fetch->force; + return 0; + } + } + } + refspec->dst = NULL; + return -1; +} + static int count_refspec_match(const char *pattern, struct ref *refs, struct ref **matched_ref) diff --git a/remote.h b/remote.h index 3bc035b90b..01dbcef670 100644 --- a/remote.h +++ b/remote.h @@ -11,11 +11,17 @@ struct remote { struct refspec *push; int push_refspec_nr; + const char **fetch_refspec; + struct refspec *fetch; + int fetch_refspec_nr; + const char *receivepack; }; struct remote *remote_get(const char *name); +int remote_has_uri(struct remote *remote, const char *uri); + struct refspec { unsigned force : 1; unsigned pattern : 1; @@ -27,4 +33,9 @@ struct refspec { int match_refs(struct ref *src, struct ref *dst, struct ref ***dst_tail, int nr_refspec, char **refspec, int all); +/* + * For the given remote, reads the refspec's src and sets the other fields. + */ +int remote_find_tracking(struct remote *remote, struct refspec *refspec); + #endif -- 2.11.4.GIT