summaryrefslogtreecommitdiff
path: root/transport.c
diff options
context:
space:
mode:
authorJunio C Hamano <gitster@pobox.com>2019-09-18 18:50:10 (GMT)
committerJunio C Hamano <gitster@pobox.com>2019-09-18 18:50:10 (GMT)
commitf67bf53300ac7bd57a593a3ec2338050ea8343f1 (patch)
tree7ac1de9cf0721a943487ca41eac96d926623a124 /transport.c
parent627b82683447e299fc2e20140318c276efbf7de2 (diff)
parentfddf2ebe388f3a11013c14ebe012dee520caa9ff (diff)
downloadgit-f67bf53300ac7bd57a593a3ec2338050ea8343f1.zip
git-f67bf53300ac7bd57a593a3ec2338050ea8343f1.tar.gz
git-f67bf53300ac7bd57a593a3ec2338050ea8343f1.tar.bz2
Merge branch 'jt/avoid-ls-refs-with-http'
The http transport lacked some optimization the native transports learned to avoid unnecessary ref advertisement, which has been corrected. * jt/avoid-ls-refs-with-http: transport: teach all vtables to allow fetch first transport-helper: skip ls-refs if unnecessary
Diffstat (limited to 'transport.c')
-rw-r--r--transport.c18
1 files changed, 6 insertions, 12 deletions
diff --git a/transport.c b/transport.c
index 6324cfc..ae558af 100644
--- a/transport.c
+++ b/transport.c
@@ -122,6 +122,7 @@ static void set_upstreams(struct transport *transport, struct ref *refs,
struct bundle_transport_data {
int fd;
struct bundle_header header;
+ unsigned get_refs_from_bundle_called : 1;
};
static struct ref *get_refs_from_bundle(struct transport *transport,
@@ -135,6 +136,8 @@ static struct ref *get_refs_from_bundle(struct transport *transport,
if (for_push)
return NULL;
+ data->get_refs_from_bundle_called = 1;
+
if (data->fd > 0)
close(data->fd);
data->fd = read_bundle_header(transport->url, &data->header);
@@ -154,6 +157,9 @@ static int fetch_refs_from_bundle(struct transport *transport,
int nr_heads, struct ref **to_fetch)
{
struct bundle_transport_data *data = transport->data;
+
+ if (!data->get_refs_from_bundle_called)
+ get_refs_from_bundle(transport, 0, NULL);
return unbundle(the_repository, &data->header, data->fd,
transport->progress ? BUNDLE_VERBOSE : 0);
}
@@ -743,7 +749,6 @@ static int disconnect_git(struct transport *transport)
}
static struct transport_vtable taken_over_vtable = {
- 1,
NULL,
get_refs_via_connect,
fetch_refs_via_pack,
@@ -893,7 +898,6 @@ void transport_check_allowed(const char *type)
}
static struct transport_vtable bundle_vtable = {
- 0,
NULL,
get_refs_from_bundle,
fetch_refs_from_bundle,
@@ -903,7 +907,6 @@ static struct transport_vtable bundle_vtable = {
};
static struct transport_vtable builtin_smart_vtable = {
- 1,
NULL,
get_refs_via_connect,
fetch_refs_via_pack,
@@ -1286,15 +1289,6 @@ int transport_fetch_refs(struct transport *transport, struct ref *refs)
struct ref **heads = NULL;
struct ref *rm;
- if (!transport->vtable->fetch_without_list)
- /*
- * Some transports (e.g. the built-in bundle transport and the
- * transport helper interface) do not work when fetching is
- * done immediately after transport creation. List the remote
- * refs anyway (if not already listed) as a workaround.
- */
- transport_get_remote_refs(transport, NULL);
-
for (rm = refs; rm; rm = rm->next) {
nr_refs++;
if (rm->peer_ref &&