]> git.ipfire.org Git - thirdparty/git.git/blobdiff - transport.c
Sync with 2.31.5
[thirdparty/git.git] / transport.c
index f357ffc06c125531423b5320c5300c8137c997ac..99363a422c3900b42b89d1f503c8eed4bc9791fd 100644 (file)
@@ -108,11 +108,11 @@ static void set_upstreams(struct transport *transport, struct ref *refs,
                if (!remotename || !starts_with(remotename, "refs/heads/"))
                        continue;
 
-               if (!pretend)
-                       install_branch_config(BRANCH_CONFIG_VERBOSE,
-                               localname + 11, transport->remote->name,
-                               remotename);
-               else
+               if (!pretend) {
+                       int flag = transport->verbose < 0 ? 0 : BRANCH_CONFIG_VERBOSE;
+                       install_branch_config(flag, localname + 11,
+                               transport->remote->name, remotename);
+               } else if (transport->verbose >= 0)
                        printf(_("Would set upstream of '%s' to '%s' of '%s'\n"),
                                localname + 11, remotename + 11,
                                transport->remote->name);
@@ -236,6 +236,9 @@ static int set_git_option(struct git_transport_options *opts,
                list_objects_filter_die_if_populated(&opts->filter_options);
                parse_list_objects_filter(&opts->filter_options, value);
                return 0;
+       } else if (!strcmp(name, TRANS_OPT_REJECT_SHALLOW)) {
+               opts->reject_shallow = !!value;
+               return 0;
        }
        return 1;
 }
@@ -370,6 +373,7 @@ static int fetch_refs_via_pack(struct transport *transport,
        args.stateless_rpc = transport->stateless_rpc;
        args.server_options = transport->server_options;
        args.negotiation_tips = data->options.negotiation_tips;
+       args.reject_shallow_remote = transport->smart_options->reject_shallow;
 
        if (!data->got_remote_heads) {
                int i;
@@ -388,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;
@@ -408,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;
@@ -1451,6 +1475,8 @@ int transport_disconnect(struct transport *transport)
        int ret = 0;
        if (transport->vtable->disconnect)
                ret = transport->vtable->disconnect(transport);
+       if (transport->got_remote_refs)
+               free_refs((void *)transport->remote_refs);
        free(transport);
        return ret;
 }