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 <barkalow@xxxxxxxxxxxx> --- remote.c | 59 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ remote.h | 10 ++++++++++ 2 files changed, 69 insertions(+), 0 deletions(-) diff --git a/remote.c b/remote.c index 2ac7bc8..8070803 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; } } } @@ -154,6 +169,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); @@ -237,10 +254,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->dest) + continue; + if (fetch->pattern) { + if (!prefixcmp(refspec->src, fetch->src)) { + refspec->dest = + xmalloc(strlen(fetch->dest) + + strlen(refspec->src) - + strlen(fetch->src) + 1); + strcpy(refspec->dest, fetch->dest); + strcpy(refspec->dest + strlen(fetch->dest), + refspec->src + strlen(fetch->src)); + refspec->force = fetch->force; + return 0; + } + } else { + if (!strcmp(refspec->src, fetch->src)) { + refspec->dest = xstrdup(fetch->dest); + refspec->force = fetch->force; + return 0; + } + } + } + refspec->dest = 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 79cedde..3608119 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,8 @@ 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 -- 1.5.2.rc2.45.g3d9b43-dirty - 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