diff options
author | Carlos Martín Nieto <cmn@dwim.me> | 2015-05-06 13:09:00 +0200 |
---|---|---|
committer | Carlos Martín Nieto <cmn@dwim.me> | 2015-05-13 15:52:13 +0200 |
commit | 3c337a5d3720f524387307bf443e7d7c6380a2e3 (patch) | |
tree | b6db3bb972bb7fa68fb0b622a312bbe136b33d9a | |
parent | 8cec2b8ae9b1fdf4638cb405cbd8c17454c1c076 (diff) | |
download | libgit2-3c337a5d3720f524387307bf443e7d7c6380a2e3.tar.gz |
packbuilder: report progress during deltificationcmn/pack-objects-report
This is useful to send to the client while we're performing the work.
The reporting function has a force parameter which makes sure that we
do send out the message of 100% completed, even if this comes before the
next udpate window.
-rw-r--r-- | src/pack-objects.c | 28 | ||||
-rw-r--r-- | src/pack-objects.h | 1 |
2 files changed, 29 insertions, 0 deletions
diff --git a/src/pack-objects.c b/src/pack-objects.c index 932764698..e287e3306 100644 --- a/src/pack-objects.c +++ b/src/pack-objects.c @@ -893,6 +893,29 @@ static unsigned long free_unpacked(struct unpacked *n) return freed_mem; } +static int report_delta_progress(git_packbuilder *pb, uint32_t count, bool force) +{ + int ret; + + if (pb->progress_cb) { + double current_time = git__timer(); + double elapsed = current_time - pb->last_progress_report_time; + + if (force || elapsed >= MIN_PROGRESS_UPDATE_INTERVAL) { + pb->last_progress_report_time = current_time; + + ret = pb->progress_cb( + GIT_PACKBUILDER_DELTAFICATION, + count, pb->nr_objects, pb->progress_cb_payload); + + if (ret) + return giterr_set_after_callback(ret); + } + } + + return 0; +} + static int find_deltas(git_packbuilder *pb, git_pobject **list, unsigned int *list_size, unsigned int window, int depth) @@ -918,6 +941,9 @@ static int find_deltas(git_packbuilder *pb, git_pobject **list, break; } + pb->nr_deltified += 1; + report_delta_progress(pb, pb->nr_deltified, false); + po = *list++; (*list_size)--; git_packbuilder__progress_unlock(pb); @@ -1290,6 +1316,8 @@ static int prepare_pack(git_packbuilder *pb) } } + report_delta_progress(pb, pb->nr_objects, true); + pb->done = true; git__free(delta_list); return 0; diff --git a/src/pack-objects.h b/src/pack-objects.h index 9af5c0b09..82dea81f5 100644 --- a/src/pack-objects.h +++ b/src/pack-objects.h @@ -65,6 +65,7 @@ struct git_packbuilder { git_zstream zstream; uint32_t nr_objects, + nr_deltified, nr_alloc, nr_written, nr_remaining; |