summaryrefslogtreecommitdiff
path: root/src/indexer.c
diff options
context:
space:
mode:
authorJameson Miller <jamill@microsoft.com>2013-12-02 14:09:12 -0500
committerJameson Miller <jamill@microsoft.com>2013-12-02 23:05:10 -0500
commitdb4cbfe5041d2dca342b123c14259d1860ed4c8c (patch)
treec64ba57b75a99a7cf0a7877fcf70ca02f83bfdff /src/indexer.c
parent14984af6cb9906746d2c64c5df7542ecd7406b16 (diff)
downloadlibgit2-db4cbfe5041d2dca342b123c14259d1860ed4c8c.tar.gz
Updates to cancellation logic during download and indexing of packfile.
Diffstat (limited to 'src/indexer.c')
-rw-r--r--src/indexer.c28
1 files changed, 17 insertions, 11 deletions
diff --git a/src/indexer.c b/src/indexer.c
index df1ce7cfb..852a04120 100644
--- a/src/indexer.c
+++ b/src/indexer.c
@@ -386,8 +386,13 @@ on_error:
static int do_progress_callback(git_indexer *idx, git_transfer_progress *stats)
{
- if (!idx->progress_cb) return 0;
- return idx->progress_cb(stats, idx->progress_payload);
+ if (idx->progress_cb &&
+ idx->progress_cb(stats, idx->progress_payload)) {
+ giterr_clear();
+ return GIT_EUSER;
+ }
+
+ return 0;
}
/* Hash everything but the last 20B of input */
@@ -491,7 +496,9 @@ int git_indexer_append(git_indexer *idx, const void *data, size_t size, git_tran
stats->indexed_deltas = 0;
processed = stats->indexed_objects = 0;
stats->total_objects = total_objects;
- do_progress_callback(idx, stats);
+
+ if ((error = do_progress_callback(idx, stats)) < 0)
+ return error;
}
/* Now that we have data in the pack, let's try to parse it */
@@ -573,11 +580,8 @@ int git_indexer_append(git_indexer *idx, const void *data, size_t size, git_tran
}
stats->received_objects++;
- if (do_progress_callback(idx, stats) != 0) {
- giterr_clear();
- error = GIT_EUSER;
+ if ((error = do_progress_callback(idx, stats)) < 0)
goto on_error;
- }
}
return 0;
@@ -749,7 +753,7 @@ static int resolve_deltas(git_indexer *idx, git_transfer_progress *stats)
{
unsigned int i;
struct delta_info *delta;
- int progressed = 0;
+ int progressed = 0, progress_cb_result;
while (idx->deltas.length > 0) {
progressed = 0;
@@ -767,7 +771,8 @@ static int resolve_deltas(git_indexer *idx, git_transfer_progress *stats)
stats->indexed_objects++;
stats->indexed_deltas++;
progressed = 1;
- do_progress_callback(idx, stats);
+ if ((progress_cb_result = do_progress_callback(idx, stats)) < 0)
+ return progress_cb_result;
/*
* Remove this delta from the list and
@@ -841,6 +846,7 @@ int git_indexer_commit(git_indexer *idx, git_transfer_progress *stats)
{
git_mwindow *w = NULL;
unsigned int i, long_offsets = 0, left;
+ int error;
struct git_pack_idx_header hdr;
git_buf filename = GIT_BUF_INIT;
struct entry *entry;
@@ -877,8 +883,8 @@ int git_indexer_commit(git_indexer *idx, git_transfer_progress *stats)
/* Freeze the number of deltas */
stats->total_deltas = stats->total_objects - stats->indexed_objects;
- if (resolve_deltas(idx, stats) < 0)
- return -1;
+ if ((error = resolve_deltas(idx, stats)) < 0)
+ return error;
if (stats->indexed_objects != stats->total_objects) {
giterr_set(GITERR_INDEXER, "early EOF");