Skip to content

Commit 9f1fd84

Browse files
szedergitster
authored andcommitted
progress: clear previous progress update dynamically
When the progress bar includes throughput, its length can shorten as the unit of display changes from KiB to MiB. To cover up remnants of the previous progress bar when such a change of units happens we always print three spaces at the end of the progress bar. Alas, covering only three characters is not quite enough: when both the total and the throughput happen to change units from KiB to MiB in the same update, then the progress bar's length is shortened by four characters (or maybe even more!): Receiving objects: 25% (2901/11603), 772.01 KiB | 733.00 KiB/s Receiving objects: 27% (3133/11603), 1.43 MiB | 1.16 MiB/s s and a stray 's' is left behind. So instead of hard-coding the three characters to cover, let's compare the length of the current progress bar with the previous one, and cover up as many characters as needed. Sure, it would be much simpler to just print more spaces at the end of the progress bar, but this approach is more future-proof, and it won't print extra spaces when none are needed, notably when the progress bar doesn't show throughput and thus never shrinks. Signed-off-by: SZEDER Gábor <[email protected]> Signed-off-by: Junio C Hamano <[email protected]>
1 parent d53ba84 commit 9f1fd84

File tree

1 file changed

+7
-4
lines changed

1 file changed

+7
-4
lines changed

progress.c

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,7 @@ static void display(struct progress *progress, uint64_t n, const char *done)
8484
const char *tp;
8585
struct strbuf *counters_sb = &progress->counters_sb;
8686
int show_update = 0;
87+
int last_count_len = counters_sb->len;
8788

8889
if (progress->delay && (!progress_update || --progress->delay))
8990
return;
@@ -110,10 +111,12 @@ static void display(struct progress *progress, uint64_t n, const char *done)
110111

111112
if (show_update) {
112113
if (is_foreground_fd(fileno(stderr)) || done) {
113-
const char *eol = done ? done : " \r";
114-
115-
fprintf(stderr, "%s: %s%s", progress->title,
116-
counters_sb->buf, eol);
114+
const char *eol = done ? done : "\r";
115+
size_t clear_len = counters_sb->len < last_count_len ?
116+
last_count_len - counters_sb->len + 1 :
117+
0;
118+
fprintf(stderr, "%s: %s%*s", progress->title,
119+
counters_sb->buf, (int) clear_len, eol);
117120
fflush(stderr);
118121
}
119122
progress_update = 0;

0 commit comments

Comments
 (0)