Commit 8b9e8de5ce2fa4da75bf5b27a73f6d74140c6eaf

Carlos Martín Nieto 2011-06-08T10:51:32

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>

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