Code

diff --check: do not discard error status upon seeing a good line
[git.git] / progress.c
index 0700dcf24a58732be8237d62cb29af4e129b41cf..55a8687ad15788f8ea5a5beb463d216908f618b2 100644 (file)
@@ -69,9 +69,9 @@ static void clear_progress_signal(void)
        progress_update = 0;
 }
 
-static int display(struct progress *progress, unsigned n, int done)
+static int display(struct progress *progress, unsigned n, const char *done)
 {
-       char *eol, *tp;
+       const char *eol, *tp;
 
        if (progress->delay) {
                if (!progress_update || --progress->delay)
@@ -90,7 +90,7 @@ static int display(struct progress *progress, unsigned n, int done)
 
        progress->last_value = n;
        tp = (progress->throughput) ? progress->throughput->display : "";
-       eol = done ? ", done.   \n" : "   \r";
+       eol = done ? done : "   \r";
        if (progress->total) {
                unsigned percent = n * 100 / progress->total;
                if (percent != progress->last_percent || progress_update) {
@@ -98,11 +98,13 @@ static int display(struct progress *progress, unsigned n, int done)
                        fprintf(stderr, "%s: %3u%% (%u/%u)%s%s",
                                progress->title, percent, n,
                                progress->total, tp, eol);
+                       fflush(stderr);
                        progress_update = 0;
                        return 1;
                }
        } else if (progress_update) {
                fprintf(stderr, "%s: %u%s%s", progress->title, n, tp, eol);
+               fflush(stderr);
                progress_update = 0;
                return 1;
        }
@@ -191,13 +193,13 @@ void display_throughput(struct progress *progress, off_t total)
 
                throughput_string(tp, total, rate);
                if (progress->last_value != -1 && progress_update)
-                       display(progress, progress->last_value, 0);
+                       display(progress, progress->last_value, NULL);
        }
 }
 
 int display_progress(struct progress *progress, unsigned n)
 {
-       return progress ? display(progress, n, 0) : 0;
+       return progress ? display(progress, n, NULL) : 0;
 }
 
 struct progress *start_progress_delay(const char *title, unsigned total,
@@ -207,6 +209,7 @@ struct progress *start_progress_delay(const char *title, unsigned total,
        if (!progress) {
                /* unlikely, but here's a good fallback */
                fprintf(stderr, "%s...\n", title);
+               fflush(stderr);
                return NULL;
        }
        progress->title = title;
@@ -226,6 +229,11 @@ struct progress *start_progress(const char *title, unsigned total)
 }
 
 void stop_progress(struct progress **p_progress)
+{
+       stop_progress_msg(p_progress, "done");
+}
+
+void stop_progress_msg(struct progress **p_progress, const char *msg)
 {
        struct progress *progress = *p_progress;
        if (!progress)
@@ -233,14 +241,21 @@ void stop_progress(struct progress **p_progress)
        *p_progress = NULL;
        if (progress->last_value != -1) {
                /* Force the last update */
+               char buf[128], *bufp;
+               size_t len = strlen(msg) + 5;
                struct throughput *tp = progress->throughput;
+
+               bufp = (len < sizeof(buf)) ? buf : xmalloc(len + 1);
                if (tp) {
                        unsigned int rate = !tp->avg_misecs ? 0 :
                                        tp->avg_bytes / tp->avg_misecs;
                        throughput_string(tp, tp->curr_total, rate);
                }
                progress_update = 1;
-               display(progress, progress->last_value, 1);
+               sprintf(bufp, ", %s.\n", msg);
+               display(progress, progress->last_value, bufp);
+               if (buf != bufp)
+                       free(bufp);
        }
        clear_progress_signal();
        free(progress->throughput);