Remove unnecessary 'fetch' argument from transport_get API
We don't actually need to know at the time of transport_get if the caller wants to fetch, push, or do both on the returned object. It is easier to just delay the initialization of the HTTP walker until we know we will need it by providing a CURL specific fetch function in the curl_transport that makes sure the walker instance is initialized before use. Signed-off-by: Shawn O. Pearce <spearce@spearce.org> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
parent
be6042cfa5
commit
e5f4e21463
@ -496,7 +496,7 @@ int cmd_fetch(int argc, const char **argv, const char *prefix)
|
|||||||
else
|
else
|
||||||
remote = remote_get(argv[i++]);
|
remote = remote_get(argv[i++]);
|
||||||
|
|
||||||
transport = transport_get(remote, remote->uri[0], 1);
|
transport = transport_get(remote, remote->uri[0]);
|
||||||
if (verbose >= 2)
|
if (verbose >= 2)
|
||||||
transport->verbose = 1;
|
transport->verbose = 1;
|
||||||
if (quiet)
|
if (quiet)
|
||||||
|
@ -59,7 +59,7 @@ static int do_push(const char *repo, int flags)
|
|||||||
errs = 0;
|
errs = 0;
|
||||||
for (i = 0; i < remote->uri_nr; i++) {
|
for (i = 0; i < remote->uri_nr; i++) {
|
||||||
struct transport *transport =
|
struct transport *transport =
|
||||||
transport_get(remote, remote->uri[i], 0);
|
transport_get(remote, remote->uri[i]);
|
||||||
int err;
|
int err;
|
||||||
if (receivepack)
|
if (receivepack)
|
||||||
transport_set_option(transport,
|
transport_set_option(transport,
|
||||||
|
23
transport.c
23
transport.c
@ -174,6 +174,14 @@ static struct ref *get_refs_via_curl(const struct transport *transport)
|
|||||||
return refs;
|
return refs;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int fetch_objs_via_curl(struct transport *transport,
|
||||||
|
int nr_objs, struct ref **to_fetch)
|
||||||
|
{
|
||||||
|
if (!transport->data)
|
||||||
|
transport->data = get_http_walker(transport->url);
|
||||||
|
return fetch_objs_via_walker(transport, nr_objs, to_fetch);
|
||||||
|
}
|
||||||
|
|
||||||
#else
|
#else
|
||||||
|
|
||||||
static struct ref *get_refs_via_curl(const struct transport *transport)
|
static struct ref *get_refs_via_curl(const struct transport *transport)
|
||||||
@ -182,12 +190,19 @@ static struct ref *get_refs_via_curl(const struct transport *transport)
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int fetch_objs_via_curl(struct transport *transport,
|
||||||
|
int nr_objs, struct ref **to_fetch)
|
||||||
|
{
|
||||||
|
die("Cannot fetch from '%s' without curl ...", transport->url);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static const struct transport_ops curl_transport = {
|
static const struct transport_ops curl_transport = {
|
||||||
/* set_option */ NULL,
|
/* set_option */ NULL,
|
||||||
/* get_refs_list */ get_refs_via_curl,
|
/* get_refs_list */ get_refs_via_curl,
|
||||||
/* fetch */ fetch_objs_via_walker,
|
/* fetch */ fetch_objs_via_curl,
|
||||||
/* push */ curl_transport_push,
|
/* push */ curl_transport_push,
|
||||||
/* disconnect */ disconnect_walker
|
/* disconnect */ disconnect_walker
|
||||||
};
|
};
|
||||||
@ -408,14 +423,12 @@ static int is_file(const char *url)
|
|||||||
return S_ISREG(buf.st_mode);
|
return S_ISREG(buf.st_mode);
|
||||||
}
|
}
|
||||||
|
|
||||||
struct transport *transport_get(struct remote *remote, const char *url,
|
struct transport *transport_get(struct remote *remote, const char *url)
|
||||||
int fetch)
|
|
||||||
{
|
{
|
||||||
struct transport *ret = xcalloc(1, sizeof(*ret));
|
struct transport *ret = xcalloc(1, sizeof(*ret));
|
||||||
|
|
||||||
ret->remote = remote;
|
ret->remote = remote;
|
||||||
ret->url = url;
|
ret->url = url;
|
||||||
ret->fetch = !!fetch;
|
|
||||||
|
|
||||||
if (!prefixcmp(url, "rsync://")) {
|
if (!prefixcmp(url, "rsync://")) {
|
||||||
ret->ops = &rsync_transport;
|
ret->ops = &rsync_transport;
|
||||||
@ -423,8 +436,6 @@ struct transport *transport_get(struct remote *remote, const char *url,
|
|||||||
|| !prefixcmp(url, "https://")
|
|| !prefixcmp(url, "https://")
|
||||||
|| !prefixcmp(url, "ftp://")) {
|
|| !prefixcmp(url, "ftp://")) {
|
||||||
ret->ops = &curl_transport;
|
ret->ops = &curl_transport;
|
||||||
if (fetch)
|
|
||||||
ret->data = get_http_walker(url);
|
|
||||||
} else if (is_local(url) && is_file(url)) {
|
} else if (is_local(url) && is_file(url)) {
|
||||||
struct bundle_transport_data *data = xcalloc(1, sizeof(*data));
|
struct bundle_transport_data *data = xcalloc(1, sizeof(*data));
|
||||||
ret->data = data;
|
ret->data = data;
|
||||||
|
@ -6,7 +6,6 @@
|
|||||||
|
|
||||||
struct transport {
|
struct transport {
|
||||||
unsigned verbose : 1;
|
unsigned verbose : 1;
|
||||||
unsigned fetch : 1;
|
|
||||||
struct remote *remote;
|
struct remote *remote;
|
||||||
const char *url;
|
const char *url;
|
||||||
|
|
||||||
@ -38,8 +37,7 @@ struct transport_ops {
|
|||||||
};
|
};
|
||||||
|
|
||||||
/* Returns a transport suitable for the url */
|
/* Returns a transport suitable for the url */
|
||||||
struct transport *transport_get(struct remote *remote, const char *url,
|
struct transport *transport_get(struct remote *, const char *);
|
||||||
int fetch);
|
|
||||||
|
|
||||||
/* Transport options which apply to git:// and scp-style URLs */
|
/* Transport options which apply to git:// and scp-style URLs */
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user