progress API: unify stop_progress{,_msg}(), fix trace2 bug

Fix a bug that's been with us ever since 98a1364740 (trace2: log
progress time and throughput, 2020-05-12), when the
stop_progress_msg() API was used we didn't log a "region_leave" for
the "region_enter" we start in "start_progress_delay()".

The only user of the "stop_progress_msg()" function is
"index-pack". Let's add a previously failing test to check that we
have the same number of "region_enter" and "region_leave" events, with
"-v" we'll log progress even in the test environment.

In addition to that we've had a submarine bug here introduced with
9d81ecb52b (progress: add sparse mode to force 100% complete message,
2019-03-21). The "start_sparse_progress()" API would only do the right
thing if the progress was ended with "stop_progress()", not
"stop_progress_msg()".

The only user of that API uses "stop_progress()", but let's still fix
that along with the trace2 issue by making "stop_progress()" a trivial
wrapper for "stop_progress_msg()".

We can also drop the "if (progress)" test from
"finish_if_sparse()". It's now a helper for the small
"stop_progress_msg()" function. We'll already have returned from it if
"progress" is "NULL".

Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Ævar Arnfjörð Bjarmason 2022-02-03 22:40:18 +01:00 committed by Junio C Hamano
parent accf1eb1d0
commit 74900a6b35
3 changed files with 13 additions and 20 deletions

View File

@ -311,8 +311,7 @@ struct progress *start_delayed_sparse_progress(const char *title,
static void finish_if_sparse(struct progress *progress) static void finish_if_sparse(struct progress *progress)
{ {
if (progress && if (progress->sparse &&
progress->sparse &&
progress->last_value != progress->total) progress->last_value != progress->total)
display_progress(progress, progress->total); display_progress(progress, progress->total);
} }
@ -347,22 +346,6 @@ static void log_trace2(struct progress *progress)
trace2_region_leave("progress", progress->title, the_repository); trace2_region_leave("progress", progress->title, the_repository);
} }
void stop_progress(struct progress **p_progress)
{
struct progress *progress;
if (!p_progress)
BUG("don't provide NULL to stop_progress");
progress = *p_progress;
finish_if_sparse(progress);
if (progress)
log_trace2(*p_progress);
stop_progress_msg(p_progress, _("done"));
}
void stop_progress_msg(struct progress **p_progress, const char *msg) void stop_progress_msg(struct progress **p_progress, const char *msg)
{ {
struct progress *progress; struct progress *progress;
@ -375,8 +358,10 @@ void stop_progress_msg(struct progress **p_progress, const char *msg)
return; return;
*p_progress = NULL; *p_progress = NULL;
finish_if_sparse(progress);
if (progress->last_value != -1) if (progress->last_value != -1)
force_last_update(progress, msg); force_last_update(progress, msg);
log_trace2(progress);
clear_progress_signal(); clear_progress_signal();
strbuf_release(&progress->counters_sb); strbuf_release(&progress->counters_sb);

View File

@ -1,5 +1,6 @@
#ifndef PROGRESS_H #ifndef PROGRESS_H
#define PROGRESS_H #define PROGRESS_H
#include "gettext.h"
struct progress; struct progress;
@ -19,5 +20,8 @@ struct progress *start_delayed_progress(const char *title, uint64_t total);
struct progress *start_delayed_sparse_progress(const char *title, struct progress *start_delayed_sparse_progress(const char *title,
uint64_t total); uint64_t total);
void stop_progress_msg(struct progress **p_progress, const char *msg); void stop_progress_msg(struct progress **p_progress, const char *msg);
void stop_progress(struct progress **p_progress); static inline void stop_progress(struct progress **p_progress)
{
stop_progress_msg(p_progress, _("done"));
}
#endif #endif

View File

@ -61,7 +61,11 @@ test_expect_success 'create series of packs' '
echo $cur echo $cur
echo "$(git rev-parse :file) file" echo "$(git rev-parse :file) file"
} | git pack-objects --stdout >tmp && } | git pack-objects --stdout >tmp &&
git index-pack --stdin --fix-thin <tmp || return 1 GIT_TRACE2_EVENT=$PWD/trace \
git index-pack -v --stdin --fix-thin <tmp || return 1 &&
grep -c region_enter.*progress trace >enter &&
grep -c region_leave.*progress trace >leave &&
test_cmp enter leave &&
prev=$cur prev=$cur
done done
' '