diff options
author | Junio C Hamano <gitster@pobox.com> | 2021-05-16 15:05:22 +0300 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2021-05-16 15:05:22 +0300 |
commit | 644f4a20468da89c1325a539c0521336f7835a64 (patch) | |
tree | 39ccb6b55222d659ab3d63d8b91e8ba549c360e5 /transport.c | |
parent | 97eea85a0a1ec66d356567808a1e4ca2367e0ce7 (diff) | |
parent | 477673d6f39b4829baa98ad88d6b65b35b79fd0f (diff) |
Merge branch 'jt/push-negotiation'
"git push" learns to discover common ancestor with the receiving
end over protocol v2.
* jt/push-negotiation:
send-pack: support push negotiation
fetch: teach independent negotiation (no packfile)
fetch-pack: refactor command and capability write
fetch-pack: refactor add_haves()
fetch-pack: refactor process_acks()
Diffstat (limited to 'transport.c')
-rw-r--r-- | transport.c | 30 |
1 files changed, 25 insertions, 5 deletions
diff --git a/transport.c b/transport.c index 62b6eeed21..6cf3da19eb 100644 --- a/transport.c +++ b/transport.c @@ -392,16 +392,29 @@ static int fetch_refs_via_pack(struct transport *transport, else if (data->version <= protocol_v1) die_if_server_options(transport); + if (data->options.acked_commits) { + if (data->version < protocol_v2) { + warning(_("--negotiate-only requires protocol v2")); + ret = -1; + } else if (!server_supports_feature("fetch", "wait-for-done", 0)) { + warning(_("server does not support wait-for-done")); + ret = -1; + } else { + negotiate_using_fetch(data->options.negotiation_tips, + transport->server_options, + transport->stateless_rpc, + data->fd, + data->options.acked_commits); + ret = 0; + } + goto cleanup; + } + refs = fetch_pack(&args, data->fd, refs_tmp ? refs_tmp : transport->remote_refs, to_fetch, nr_heads, &data->shallow, &transport->pack_lockfiles, data->version); - close(data->fd[0]); - close(data->fd[1]); - if (finish_connect(data->conn)) - ret = -1; - data->conn = NULL; data->got_remote_heads = 0; data->options.self_contained_and_connected = args.self_contained_and_connected; @@ -412,6 +425,13 @@ static int fetch_refs_via_pack(struct transport *transport, if (report_unmatched_refs(to_fetch, nr_heads)) ret = -1; +cleanup: + close(data->fd[0]); + close(data->fd[1]); + if (finish_connect(data->conn)) + ret = -1; + data->conn = NULL; + free_refs(refs_tmp); free_refs(refs); return ret; |