diff options
| author | Chris Young <chris@unsatisfactorysoftware.co.uk> | 2012-06-07 20:29:22 +0100 |
|---|---|---|
| committer | Chris Young <chris@unsatisfactorysoftware.co.uk> | 2012-06-07 20:29:22 +0100 |
| commit | c3f35902f3f951de5ce5193409f336ee45c682b6 (patch) | |
| tree | e7329cc1496e676a65fb108bb9e830437e5ced7f /src/protocol.c | |
| parent | cada414a8044307b28f7a4c75986e5473bb4bc1c (diff) | |
| parent | cddb8efe564738873a4cf9ac63b7976d74035ae9 (diff) | |
| download | libgit2-c3f35902f3f951de5ce5193409f336ee45c682b6.tar.gz | |
Merge remote-tracking branch 'source/development' into update-test
Merging main libgit2!
Conflicts:
CMakeLists.txt
src/unix/map.c
Diffstat (limited to 'src/protocol.c')
| -rw-r--r-- | src/protocol.c | 58 |
1 files changed, 58 insertions, 0 deletions
diff --git a/src/protocol.c b/src/protocol.c new file mode 100644 index 000000000..6b3861796 --- /dev/null +++ b/src/protocol.c @@ -0,0 +1,58 @@ +/* + * Copyright (C) 2009-2012 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 (git_buf_len(buf) != 0) { + giterr_set(GITERR_NET, "Unexpected EOF"); + return p->error = -1; + } else { + return 0; + } + } + + git_buf_put(buf, data, len); + ptr = buf->ptr; + while (1) { + git_pkt *pkt; + + if (git_buf_len(buf) == 0) + return 0; + + error = git_pkt_parse_line(&pkt, ptr, &line_end, git_buf_len(buf)); + if (error == GIT_EBUFS) + return 0; /* Ask for more */ + if (error < 0) + return p->error = -1; + + git_buf_consume(buf, line_end); + + if (pkt->type == GIT_PKT_ERR) { + giterr_set(GITERR_NET, "Remote error: %s", ((git_pkt_err *)pkt)->error); + git__free(pkt); + return -1; + } + + if (git_vector_insert(refs, pkt) < 0) + return p->error = -1; + + if (pkt->type == GIT_PKT_FLUSH) + p->flush = 1; + } + + return 0; +} |
