From 8b9e8de5ce2fa4da75bf5b27a73f6d74140c6eaf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Carlos=20Mart=C3=ADn=20Nieto?= Date: Wed, 8 Jun 2011 10:51:32 +0200 Subject: [PATCH] pkt-line: read capabilities MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Try to read the server capabilities and add them to the git_pkt_ref struct. Signed-off-by: Carlos Martín Nieto --- include/git2/pkt.h | 1 + src/pkt.c | 21 ++++++++++++++++++++- src/util.h | 3 +++ 3 files changed, 24 insertions(+), 1 deletion(-) diff --git a/include/git2/pkt.h b/include/git2/pkt.h index 680dcc618..0b933abff 100644 --- a/include/git2/pkt.h +++ b/include/git2/pkt.h @@ -48,4 +48,5 @@ struct git_pkt_cmd { struct git_pkt_ref { enum git_pkt_type type; git_remote_head head; + char *capabilities; }; diff --git a/src/pkt.c b/src/pkt.c index a7562c455..612a43154 100644 --- a/src/pkt.c +++ b/src/pkt.c @@ -57,6 +57,7 @@ int ref_pkt(git_pkt **out, const char *line, size_t len) if (pkt == NULL) return GIT_ENOMEM; + memset(pkt, 0x0, sizeof(git_pkt_ref)); pkt->type = GIT_PKT_REF; error = git_oid_fromstr(&pkt->head.oid, line); if (error < GIT_SUCCESS) { @@ -70,9 +71,11 @@ int ref_pkt(git_pkt **out, const char *line, size_t len) goto out; } + /* Jump from the name */ line += GIT_OID_HEXSZ + 1; + len -= (GIT_OID_HEXSZ + 1); - name_len = len - (GIT_OID_HEXSZ + 1); + name_len = min(strlen(line), len); if (line[name_len - 1] == '\n') --name_len; @@ -82,6 +85,22 @@ int ref_pkt(git_pkt **out, const char *line, size_t len) goto out; } + /* Try to get the capabilities */ + line += name_len + 1; /* + \0 */ + len -= (name_len + 1); + if (line[len - 1] == '\n') + --len; + + if (len > 0) { /* capatilities */ + pkt->capabilities = git__malloc(len); + if (pkt->capabilities == NULL) { + error = GIT_ENOMEM; + goto out; + } + + memcpy(pkt->capabilities, line, len); + } + out: if (error < GIT_SUCCESS) free(pkt); diff --git a/src/util.h b/src/util.h index 0b423ac08..fdc6b85f1 100644 --- a/src/util.h +++ b/src/util.h @@ -4,6 +4,9 @@ #define ARRAY_SIZE(x) (sizeof(x)/sizeof(x[0])) #define bitsizeof(x) (CHAR_BIT * sizeof(x)) #define MSB(x, bits) ((x) & (~0ULL << (bitsizeof(x) - (bits)))) +#ifndef min +# define min(a,b) ((a) < (b) ? (a) : (b)) +#endif /* * Custom memory allocation wrappers