pkt-line: read capabilities Try to read the server capabilities and add them to the git_pkt_ref struct. Signed-off-by: Carlos Martín Nieto <carlos@cmartin.tk>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72
diff --git a/include/git2/pkt.h b/include/git2/pkt.h
index 680dcc6..0b933ab 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 a7562c4..612a431 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 0b423ac..fdc6b85 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