protocol.con commit Merge branch 'ab/drop-contrib-examples' (cd94dd0)
   1#include "cache.h"
   2#include "config.h"
   3#include "protocol.h"
   4
   5static enum protocol_version parse_protocol_version(const char *value)
   6{
   7        if (!strcmp(value, "0"))
   8                return protocol_v0;
   9        else if (!strcmp(value, "1"))
  10                return protocol_v1;
  11        else
  12                return protocol_unknown_version;
  13}
  14
  15enum protocol_version get_protocol_version_config(void)
  16{
  17        const char *value;
  18        if (!git_config_get_string_const("protocol.version", &value)) {
  19                enum protocol_version version = parse_protocol_version(value);
  20
  21                if (version == protocol_unknown_version)
  22                        die("unknown value for config 'protocol.version': %s",
  23                            value);
  24
  25                return version;
  26        }
  27
  28        return protocol_v0;
  29}
  30
  31enum protocol_version determine_protocol_version_server(void)
  32{
  33        const char *git_protocol = getenv(GIT_PROTOCOL_ENVIRONMENT);
  34        enum protocol_version version = protocol_v0;
  35
  36        /*
  37         * Determine which protocol version the client has requested.  Since
  38         * multiple 'version' keys can be sent by the client, indicating that
  39         * the client is okay to speak any of them, select the greatest version
  40         * that the client has requested.  This is due to the assumption that
  41         * the most recent protocol version will be the most state-of-the-art.
  42         */
  43        if (git_protocol) {
  44                struct string_list list = STRING_LIST_INIT_DUP;
  45                const struct string_list_item *item;
  46                string_list_split(&list, git_protocol, ':', -1);
  47
  48                for_each_string_list_item(item, &list) {
  49                        const char *value;
  50                        enum protocol_version v;
  51
  52                        if (skip_prefix(item->string, "version=", &value)) {
  53                                v = parse_protocol_version(value);
  54                                if (v > version)
  55                                        version = v;
  56                        }
  57                }
  58
  59                string_list_clear(&list, 0);
  60        }
  61
  62        return version;
  63}
  64
  65enum protocol_version determine_protocol_version_client(const char *server_response)
  66{
  67        enum protocol_version version = protocol_v0;
  68
  69        if (skip_prefix(server_response, "version ", &server_response)) {
  70                version = parse_protocol_version(server_response);
  71
  72                if (version == protocol_unknown_version)
  73                        die("server is speaking an unknown protocol");
  74                if (version == protocol_v0)
  75                        die("protocol error: server explicitly said version 0");
  76        }
  77
  78        return version;
  79}