Git fork
at reftables-rust 99 lines 2.7 kB view raw
1#define USE_THE_REPOSITORY_VARIABLE 2 3#include "git-compat-util.h" 4#include "config.h" 5#include "environment.h" 6#include "protocol.h" 7#include "trace2.h" 8 9static enum protocol_version parse_protocol_version(const char *value) 10{ 11 if (!strcmp(value, "0")) 12 return protocol_v0; 13 else if (!strcmp(value, "1")) 14 return protocol_v1; 15 else if (!strcmp(value, "2")) 16 return protocol_v2; 17 else 18 return protocol_unknown_version; 19} 20 21enum protocol_version get_protocol_version_config(void) 22{ 23 const char *value; 24 const char *git_test_k = "GIT_TEST_PROTOCOL_VERSION"; 25 const char *git_test_v; 26 27 if (!repo_config_get_string_tmp(the_repository, "protocol.version", &value)) { 28 enum protocol_version version = parse_protocol_version(value); 29 30 if (version == protocol_unknown_version) 31 die("unknown value for config 'protocol.version': %s", 32 value); 33 34 return version; 35 } 36 37 git_test_v = getenv(git_test_k); 38 if (git_test_v && *git_test_v) { 39 enum protocol_version env = parse_protocol_version(git_test_v); 40 41 if (env == protocol_unknown_version) 42 die("unknown value for %s: %s", git_test_k, git_test_v); 43 return env; 44 } 45 46 return protocol_v2; 47} 48 49enum protocol_version determine_protocol_version_server(void) 50{ 51 const char *git_protocol = getenv(GIT_PROTOCOL_ENVIRONMENT); 52 enum protocol_version version = protocol_v0; 53 54 /* 55 * Determine which protocol version the client has requested. Since 56 * multiple 'version' keys can be sent by the client, indicating that 57 * the client is okay to speak any of them, select the greatest version 58 * that the client has requested. This is due to the assumption that 59 * the most recent protocol version will be the most state-of-the-art. 60 */ 61 if (git_protocol) { 62 struct string_list list = STRING_LIST_INIT_DUP; 63 const struct string_list_item *item; 64 string_list_split(&list, git_protocol, ":", -1); 65 66 for_each_string_list_item(item, &list) { 67 const char *value; 68 enum protocol_version v; 69 70 if (skip_prefix(item->string, "version=", &value)) { 71 v = parse_protocol_version(value); 72 if (v > version) 73 version = v; 74 } 75 } 76 77 string_list_clear(&list, 0); 78 } 79 80 trace2_data_intmax("transfer", NULL, "negotiated-version", version); 81 82 return version; 83} 84 85enum protocol_version determine_protocol_version_client(const char *server_response) 86{ 87 enum protocol_version version = protocol_v0; 88 89 if (skip_prefix(server_response, "version ", &server_response)) { 90 version = parse_protocol_version(server_response); 91 92 if (version == protocol_unknown_version) 93 die("server is speaking an unknown protocol"); 94 if (version == protocol_v0) 95 die("protocol error: server explicitly said version 0"); 96 } 97 98 return version; 99}