diff options
author | Carlos Martín Nieto <carlos@cmartin.tk> | 2012-07-24 19:03:22 +0200 |
---|---|---|
committer | Carlos Martín Nieto <carlos@cmartin.tk> | 2012-07-30 20:28:16 +0200 |
commit | b49c8f71aef574ce6606282a498627f5106220d5 (patch) | |
tree | b4a9d07716c80b48e68f36d8fb3fb6c142447ac6 /src/protocol.c | |
parent | 114dc6e14c47ff574b4c97d4519782de3f9d28b2 (diff) | |
download | libgit2-b49c8f71aef574ce6606282a498627f5106220d5.tar.gz |
remote: use the same code to control git and http
This allows us to add capabilitites to both at the same time, keeps
them in sync and removes a lot of code.
gitno_buffer now uses a callback to fill its buffer, allowing us to
use the same interface for git and http (which uses callbacks).
Diffstat (limited to 'src/protocol.c')
-rw-r--r-- | src/protocol.c | 32 |
1 files changed, 32 insertions, 0 deletions
diff --git a/src/protocol.c b/src/protocol.c index 6b3861796..d8512fde2 100644 --- a/src/protocol.c +++ b/src/protocol.c @@ -56,3 +56,35 @@ int git_protocol_store_refs(git_protocol *p, const char *data, size_t len) return 0; } + +int git_protocol_detect_caps(git_pkt_ref *pkt, git_transport_caps *caps) +{ + const char *ptr; + + /* No refs or capabilites, odd but not a problem */ + if (pkt == NULL || pkt->capabilities == NULL) + return 0; + + ptr = pkt->capabilities; + while (ptr != NULL && *ptr != '\0') { + if (*ptr == ' ') + ptr++; + + if(!git__prefixcmp(ptr, GIT_CAP_OFS_DELTA)) { + caps->common = caps->ofs_delta = 1; + ptr += strlen(GIT_CAP_OFS_DELTA); + continue; + } + + if(!git__prefixcmp(ptr, GIT_CAP_MULTI_ACK)) { + caps->common = caps->multi_ack = 1; + ptr += strlen(GIT_CAP_MULTI_ACK); + continue; + } + + /* We don't know this capability, so skip it */ + ptr = strchr(ptr, ' '); + } + + return 0; +} |