]> git.ipfire.org Git - thirdparty/git.git/commitdiff
fetch-pack: parse and advertise the object-format capability
authorbrian m. carlson <sandals@crustytoothpaste.net>
Mon, 25 May 2020 19:59:07 +0000 (19:59 +0000)
committerJunio C Hamano <gitster@pobox.com>
Wed, 27 May 2020 17:07:06 +0000 (10:07 -0700)
Parse the server's object-format capability and respond accordingly,
dying if there is a mismatch.

Signed-off-by: brian m. carlson <sandals@crustytoothpaste.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
fetch-pack.c

index 1d277190e7c546cfe774d7f5ad900101d4031f51..d5a919f2aaa4d5af95c9a3bd6662e928b0a0ea46 100644 (file)
@@ -1179,6 +1179,7 @@ static int send_fetch_request(struct fetch_negotiator *negotiator, int fd_out,
                              int sideband_all, int seen_ack)
 {
        int ret = 0;
+       const char *hash_name;
        struct strbuf req_buf = STRBUF_INIT;
 
        if (server_supports_v2("fetch", 1))
@@ -1193,6 +1194,17 @@ static int send_fetch_request(struct fetch_negotiator *negotiator, int fd_out,
                                         args->server_options->items[i].string);
        }
 
+       if (server_feature_v2("object-format", &hash_name)) {
+               int hash_algo = hash_algo_by_name(hash_name);
+               if (hash_algo_by_ptr(the_hash_algo) != hash_algo)
+                       die(_("mismatched algorithms: client %s; server %s"),
+                           the_hash_algo->name, hash_name);
+               packet_write_fmt(fd_out, "object-format=%s", the_hash_algo->name);
+       } else if (hash_algo_by_ptr(the_hash_algo) != GIT_HASH_SHA1) {
+               die(_("the server does not support algorithm '%s'"),
+                   the_hash_algo->name);
+       }
+
        packet_buf_delim(&req_buf);
        if (args->use_thin_pack)
                packet_buf_write(&req_buf, "thin-pack");