diff options
author | Carlos Martín Nieto <cmn@elego.de> | 2012-10-18 04:31:03 +0200 |
---|---|---|
committer | Carlos Martín Nieto <cmn@elego.de> | 2012-10-18 04:31:03 +0200 |
commit | f0d2ddbbf86ee9a3fdb0b882077a6792d5fb5d7f (patch) | |
tree | 116133f7379f2232fa5744247ce7b21b7324f455 /src/fetch.c | |
parent | 4c47a8bcfe03c42096b74d4af06ab95fb95fd211 (diff) | |
download | libgit2-f0d2ddbbf86ee9a3fdb0b882077a6792d5fb5d7f.tar.gz |
remote: support fetch cancelation
Introduce git_remote_stop() which sets a variable that is checked by
the fetch process in a few key places. If this is variable is set, the
fetch is aborted.
Diffstat (limited to 'src/fetch.c')
-rw-r--r-- | src/fetch.c | 33 |
1 files changed, 28 insertions, 5 deletions
diff --git a/src/fetch.c b/src/fetch.c index 737a1b4cb..4f3d73d0e 100644 --- a/src/fetch.c +++ b/src/fetch.c @@ -152,7 +152,7 @@ int git_fetch_negotiate(git_remote *remote) gitno_buffer *buf = &t->buffer; git_buf data = GIT_BUF_INIT; git_revwalk *walk = NULL; - int error, pkt_type; + int error = -1, pkt_type; unsigned int i; git_oid oid; @@ -190,6 +190,12 @@ int git_fetch_negotiate(git_remote *remote) git_pkt_buffer_have(&oid, &data); i++; if (i % 20 == 0) { + if (t->cancel.val) { + giterr_set(GITERR_NET, "The fetch was cancelled by the user"); + error = GIT_EUSER; + goto on_error; + } + git_pkt_buffer_flush(&data); if (git_buf_oom(&data)) goto on_error; @@ -254,6 +260,11 @@ int git_fetch_negotiate(git_remote *remote) } git_pkt_buffer_done(&data); + if (t->cancel.val) { + giterr_set(GITERR_NET, "The fetch was cancelled by the user"); + error = GIT_EUSER; + goto on_error; + } if (t->negotiation_step(t, data.ptr, data.size) < 0) goto on_error; @@ -288,7 +299,7 @@ int git_fetch_negotiate(git_remote *remote) on_error: git_revwalk_free(walk); git_buf_free(&data); - return -1; + return error; } int git_fetch_download_pack(git_remote *remote, git_off_t *bytes, git_indexer_stats *stats) @@ -305,11 +316,16 @@ int git_fetch_download_pack(git_remote *remote, git_off_t *bytes, git_indexer_st } -static int no_sideband(git_indexer_stream *idx, gitno_buffer *buf, git_off_t *bytes, git_indexer_stats *stats) +static int no_sideband(git_transport *t, git_indexer_stream *idx, gitno_buffer *buf, git_off_t *bytes, git_indexer_stats *stats) { int recvd; do { + if (t->cancel.val) { + giterr_set(GITERR_NET, "The fetch was cancelled by the user"); + return GIT_EUSER; + } + if (git_indexer_stream_add(idx, buf->data, buf->offset, stats) < 0) return -1; @@ -337,6 +353,7 @@ int git_fetch__download_pack( git_buf path = GIT_BUF_INIT; gitno_buffer *buf = &t->buffer; git_indexer_stream *idx = NULL; + int error = -1; if (git_buf_joinpath(&path, git_repository_path(repo), "objects/pack") < 0) return -1; @@ -354,7 +371,7 @@ int git_fetch__download_pack( * check which one belongs there. */ if (!t->caps.side_band && !t->caps.side_band_64k) { - if (no_sideband(idx, buf, bytes, stats) < 0) + if (no_sideband(t, idx, buf, bytes, stats) < 0) goto on_error; git_indexer_stream_free(idx); @@ -362,6 +379,12 @@ int git_fetch__download_pack( } do { + if (t->cancel.val) { + giterr_set(GITERR_NET, "The fetch was cancelled by the user"); + error = GIT_EUSER; + goto on_error; + } + git_pkt *pkt; if (recv_pkt(&pkt, buf) < 0) goto on_error; @@ -395,7 +418,7 @@ int git_fetch__download_pack( on_error: git_buf_free(&path); git_indexer_stream_free(idx); - return -1; + return error; } int git_fetch_setup_walk(git_revwalk **out, git_repository *repo) |