| /* |
| * 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; |
| } |