We had to fix two buggy progress lines in the past, where stop_progress calls were added at the wrong place [1], resulting in "done" progress lines appearing in the wrong order. Extend GIT_TEST_CHECK_PROGRESS to catch these cases as well, i.e. trigger a BUG() when a progress has already been running when start_progress() or one of its variants is called to start a new one. Running the test suite with GIT_TEST_CHECK_PROGRESS enabled doesn't reveal any new issues [2]. Note that this will trigger even in cases where the output is not visibly wrong, e.g. consider this simplified sequence of calls: progress1 = start_delayed_progress(); progress2 = start_delayed_progress(); for (i = 0; ...) display_progress(progress2, i + 1); stop_progres(&progress2); for (j = 0; ...) display_progress(progress1, j + 1); stop_progres(&progress1); This doesn't produce bogus output like what is shown in those two fixes [1], because 'progress2' is already "done" before the first display_progress(progress1, ...) call. Btw, this is not just a pathological example, we do have two progress lines arranged like this, but they are only shown when standard error is a terminal, and thus aren't caught by GIT_TEST_CHECK_PROGRESS in its current form. [1] 6f9d5f2fda (commit-graph: fix progress of reachable commits, 2020-07-09) 862aead24e (commit-graph: fix "Collecting commits from input" progress line, 2020-07-10) [2] This patch series applies with a minor conflict on top of 6f9d5f2fda^, and makes 37 tests fail because of that bug. Signed-off-by: SZEDER Gábor <szeder.dev@xxxxxxxxx> --- progress.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/progress.c b/progress.c index 255995406f..549e8d1fe7 100644 --- a/progress.c +++ b/progress.c @@ -48,6 +48,8 @@ struct progress { static volatile sig_atomic_t progress_update; static int test_check_progress; +/* Used to catch nested/overlapping progresses with GIT_TEST_CHECK_PROGRESS. */ +static struct progress *current_progress = NULL; /* * These are only intended for testing the progress output, i.e. exclusively @@ -258,8 +260,12 @@ static struct progress *start_progress_delay(const char *title, uint64_t total, struct progress *progress; test_check_progress = git_env_bool("GIT_TEST_CHECK_PROGRESS", 0); + if (test_check_progress && current_progress) + BUG("progress \"%s\" is still active when starting new progress \"%s\"", + current_progress->title, title); progress = xmalloc(sizeof(*progress)); + current_progress = progress; progress->title = title; progress->total = total; progress->last_value = -1; @@ -383,6 +389,7 @@ void stop_progress_msg(struct progress **p_progress, const char *msg) strbuf_release(&progress->counters_sb); if (progress->throughput) strbuf_release(&progress->throughput->display); + current_progress = NULL; free(progress->throughput); free(progress); } -- 2.32.0.289.g44fbea0957