summaryrefslogtreecommitdiff
path: root/src/protocol.c
diff options
context:
space:
mode:
authorCarlos Martín Nieto <carlos@cmartin.tk>2011-10-26 18:06:36 -0700
committerCarlos Martín Nieto <carlos@cmartin.tk>2011-11-18 21:03:23 +0100
commit40a40e8e9daa8187450258ba538c90d70eac12fe (patch)
tree800726fb387985bf8bb30f73aae62e0b6a0c49d8 /src/protocol.c
parente4c93a392763a006d11e1c1dd01c12f85498dad5 (diff)
downloadlibgit2-40a40e8e9daa8187450258ba538c90d70eac12fe.tar.gz
net: move the reference storage to common code
Diffstat (limited to 'src/protocol.c')
-rw-r--r--src/protocol.c50
1 files changed, 50 insertions, 0 deletions
diff --git a/src/protocol.c b/src/protocol.c
new file mode 100644
index 000000000..1f39f105b
--- /dev/null
+++ b/src/protocol.c
@@ -0,0 +1,50 @@
+/*
+ * Copyright (C) 2009-2011 the libgit2 contributors
+ *
+ * This file is part of libgit2, distributed under the GNU GPL v2 with
+ * a Linking Exception. For full terms see the included COPYING file.
+ */
+#include "common.h"
+#include "protocol.h"
+#include "pkt.h"
+#include "buffer.h"
+
+int git_protocol_store_refs(git_protocol *p, const char *data, size_t len)
+{
+ git_buf *buf = &p->buf;
+ git_vector *refs = p->refs;
+ int error;
+ const char *line_end, *ptr;
+
+ if (len == 0) { /* EOF */
+ if (buf->size != 0)
+ return p->error = git__throw(GIT_ERROR, "EOF and unprocessed data");
+ else
+ return 0;
+ }
+
+ git_buf_put(buf, data, len);
+ ptr = buf->ptr;
+ while (1) {
+ git_pkt *pkt;
+
+ if (buf->size == 0)
+ return 0;
+
+ error = git_pkt_parse_line(&pkt, ptr, &line_end, buf->size);
+ if (error == GIT_ESHORTBUFFER)
+ return 0; /* Ask for more */
+ if (error < GIT_SUCCESS)
+ return p->error = git__rethrow(error, "Failed to parse pkt-line");
+
+ git_buf_consume(buf, line_end);
+ error = git_vector_insert(refs, pkt);
+ if (error < GIT_SUCCESS)
+ return p->error = git__rethrow(error, "Failed to add pkt to list");
+
+ if (pkt->type == GIT_PKT_FLUSH)
+ p->flush = 1;
+ }
+
+ return error;
+}