progress: clear previous progress update dynamically
[gitweb.git] / progress.c
index 564845a36b4e514611817600d35a488d0759470e..949a2a576d41be2a96c5fba1452b7472fea0510e 100644 (file)
@@ -84,6 +84,7 @@ static void display(struct progress *progress, uint64_t n, const char *done)
        const char *tp;
        struct strbuf *counters_sb = &progress->counters_sb;
        int show_update = 0;
+       int last_count_len = counters_sb->len;
 
        if (progress->delay && (!progress_update || --progress->delay))
                return;
@@ -110,10 +111,12 @@ static void display(struct progress *progress, uint64_t n, const char *done)
 
        if (show_update) {
                if (is_foreground_fd(fileno(stderr)) || done) {
-                       const char *eol = done ? done : "   \r";
-
-                       fprintf(stderr, "%s: %s%s", progress->title,
-                               counters_sb->buf, eol);
+                       const char *eol = done ? done : "\r";
+                       size_t clear_len = counters_sb->len < last_count_len ?
+                                       last_count_len - counters_sb->len + 1 :
+                                       0;
+                       fprintf(stderr, "%s: %s%*s", progress->title,
+                               counters_sb->buf, (int) clear_len, eol);
                        fflush(stderr);
                }
                progress_update = 0;