From: Junio C Hamano Date: Thu, 25 Jun 2020 19:27:47 +0000 (-0700) Subject: Merge branch 'jt/cdn-offload' X-Git-Tag: v2.28.0-rc0~37 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=34e849b05a454a2c6487f8fbfa68c39932d22730;p=thirdparty%2Fgit.git Merge branch 'jt/cdn-offload' The "fetch/clone" protocol has been updated to allow the server to instruct the clients to grab pre-packaged packfile(s) in addition to the packed object data coming over the wire. * jt/cdn-offload: upload-pack: fix a sparse '0 as NULL pointer' warning upload-pack: send part of packfile response as uri fetch-pack: support more than one pack lockfile upload-pack: refactor reading of pack-objects out Documentation: add Packfile URIs design doc Documentation: order protocol v2 sections http-fetch: support fetching packfiles by URL http-fetch: refactor into function http: refactor finish_http_pack_request() http: use --stdin when indexing dumb HTTP pack --- 34e849b05a454a2c6487f8fbfa68c39932d22730 diff --cc fetch-pack.c index d8bbf45ee2,ca2b101b8d..acd55ba6e8 --- a/fetch-pack.c +++ b/fetch-pack.c @@@ -1569,11 -1604,13 +1616,14 @@@ static struct ref *do_fetch_pack_v2(str if (process_section_header(&reader, "wanted-refs", 1)) receive_wanted_refs(&reader, sought, nr_sought); - /* get the pack */ + /* get the pack(s) */ + if (process_section_header(&reader, "packfile-uris", 1)) + receive_packfile_uris(&reader, &packfile_uris); process_section_header(&reader, "packfile", 0); - if (get_pack(args, fd, pack_lockfile, sought, nr_sought)) + if (get_pack(args, fd, pack_lockfiles, + !packfile_uris.nr, sought, nr_sought)) die(_("git fetch-pack: fetch failed.")); + do_check_stateless_delimiter(args, &reader); state = FETCH_DONE; break; diff --cc transport.c index 7d50c502ad,a67e1990bf..6ee6771f55 --- a/transport.c +++ b/transport.c @@@ -370,15 -369,24 +370,15 @@@ static int fetch_refs_via_pack(struct t refs_tmp = handshake(transport, 0, NULL, must_list_refs); } - switch (data->version) { - case protocol_v2: - refs = fetch_pack(&args, data->fd, - refs_tmp ? refs_tmp : transport->remote_refs, - to_fetch, nr_heads, &data->shallow, - &transport->pack_lockfiles, data->version); - break; - case protocol_v1: - case protocol_v0: - die_if_server_options(transport); - refs = fetch_pack(&args, data->fd, - refs_tmp ? refs_tmp : transport->remote_refs, - to_fetch, nr_heads, &data->shallow, - &transport->pack_lockfiles, data->version); - break; - case protocol_unknown_version: + if (data->version == protocol_unknown_version) BUG("unknown protocol version"); - } + else if (data->version <= protocol_v1) + die_if_server_options(transport); + + refs = fetch_pack(&args, data->fd, + refs_tmp ? refs_tmp : transport->remote_refs, + to_fetch, nr_heads, &data->shallow, - &transport->pack_lockfile, data->version); ++ &transport->pack_lockfiles, data->version); close(data->fd[0]); close(data->fd[1]); diff --cc upload-pack.c index f899fdf46a,219e804dc1..39d0cf00be --- a/upload-pack.c +++ b/upload-pack.c @@@ -84,7 -83,7 +84,8 @@@ struct upload_pack_data /* 0 for no sideband, otherwise DEFAULT_PACKET_MAX or LARGE_PACKET_MAX */ int use_sideband; + struct string_list uri_protocols; + enum allow_uor allow_uor; struct list_objects_filter_options filter_options; @@@ -117,7 -116,7 +118,8 @@@ static void upload_pack_data_init(struc struct oid_array haves = OID_ARRAY_INIT; struct object_array shallows = OBJECT_ARRAY_INIT; struct string_list deepen_not = STRING_LIST_INIT_DUP; + struct string_list uri_protocols = STRING_LIST_INIT_DUP; + struct object_array extra_edge_obj = OBJECT_ARRAY_INIT; memset(data, 0, sizeof(*data)); data->symref = symref; @@@ -127,7 -126,7 +129,8 @@@ data->haves = haves; data->shallows = shallows; data->deepen_not = deepen_not; + data->uri_protocols = uri_protocols; + data->extra_edge_obj = extra_edge_obj; packet_writer_init(&data->writer, 1); data->keepalive = 5;