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 <barkalow@iabervon.org> Signed-off-by: Junio C Hamano <junkio@cox.net>
This commit is contained in:
parent
6b62816cb1
commit
5d46c9d41f
59
remote.c
59
remote.c
@ -17,6 +17,15 @@ static void add_push_refspec(struct remote *remote, const char *ref)
|
|||||||
remote->push_refspec_nr = nr;
|
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)
|
static void add_uri(struct remote *remote, const char *uri)
|
||||||
{
|
{
|
||||||
int nr = remote->uri_nr + 1;
|
int nr = remote->uri_nr + 1;
|
||||||
@ -74,6 +83,9 @@ static void read_remotes_file(struct remote *remote)
|
|||||||
} else if (!prefixcmp(buffer, "Push:")) {
|
} else if (!prefixcmp(buffer, "Push:")) {
|
||||||
value_list = 1;
|
value_list = 1;
|
||||||
s = buffer + 5;
|
s = buffer + 5;
|
||||||
|
} else if (!prefixcmp(buffer, "Pull:")) {
|
||||||
|
value_list = 2;
|
||||||
|
s = buffer + 5;
|
||||||
} else
|
} else
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
@ -93,6 +105,9 @@ static void read_remotes_file(struct remote *remote)
|
|||||||
case 1:
|
case 1:
|
||||||
add_push_refspec(remote, xstrdup(s));
|
add_push_refspec(remote, xstrdup(s));
|
||||||
break;
|
break;
|
||||||
|
case 2:
|
||||||
|
add_fetch_refspec(remote, xstrdup(s));
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
fclose(f);
|
fclose(f);
|
||||||
@ -174,6 +189,8 @@ static int handle_config(const char *key, const char *value)
|
|||||||
add_uri(remote, xstrdup(value));
|
add_uri(remote, xstrdup(value));
|
||||||
} else if (!strcmp(subkey, ".push")) {
|
} else if (!strcmp(subkey, ".push")) {
|
||||||
add_push_refspec(remote, xstrdup(value));
|
add_push_refspec(remote, xstrdup(value));
|
||||||
|
} else if (!strcmp(subkey, ".fetch")) {
|
||||||
|
add_fetch_refspec(remote, xstrdup(value));
|
||||||
} else if (!strcmp(subkey, ".receivepack")) {
|
} else if (!strcmp(subkey, ".receivepack")) {
|
||||||
if (!remote->receivepack)
|
if (!remote->receivepack)
|
||||||
remote->receivepack = xstrdup(value);
|
remote->receivepack = xstrdup(value);
|
||||||
@ -257,10 +274,52 @@ struct remote *remote_get(const char *name)
|
|||||||
add_uri(ret, name);
|
add_uri(ret, name);
|
||||||
if (!ret->uri)
|
if (!ret->uri)
|
||||||
return NULL;
|
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);
|
ret->push = parse_ref_spec(ret->push_refspec_nr, ret->push_refspec);
|
||||||
return ret;
|
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,
|
static int count_refspec_match(const char *pattern,
|
||||||
struct ref *refs,
|
struct ref *refs,
|
||||||
struct ref **matched_ref)
|
struct ref **matched_ref)
|
||||||
|
11
remote.h
11
remote.h
@ -11,11 +11,17 @@ struct remote {
|
|||||||
struct refspec *push;
|
struct refspec *push;
|
||||||
int push_refspec_nr;
|
int push_refspec_nr;
|
||||||
|
|
||||||
|
const char **fetch_refspec;
|
||||||
|
struct refspec *fetch;
|
||||||
|
int fetch_refspec_nr;
|
||||||
|
|
||||||
const char *receivepack;
|
const char *receivepack;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct remote *remote_get(const char *name);
|
struct remote *remote_get(const char *name);
|
||||||
|
|
||||||
|
int remote_has_uri(struct remote *remote, const char *uri);
|
||||||
|
|
||||||
struct refspec {
|
struct refspec {
|
||||||
unsigned force : 1;
|
unsigned force : 1;
|
||||||
unsigned pattern : 1;
|
unsigned pattern : 1;
|
||||||
@ -27,4 +33,9 @@ struct refspec {
|
|||||||
int match_refs(struct ref *src, struct ref *dst, struct ref ***dst_tail,
|
int match_refs(struct ref *src, struct ref *dst, struct ref ***dst_tail,
|
||||||
int nr_refspec, char **refspec, int all);
|
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
|
#endif
|
||||||
|
Loading…
x
Reference in New Issue
Block a user