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;
if (show_update) {
if (is_foreground_fd(fileno(stderr)) || done) {
const char *eol = done ? done : "\r";
- size_t clear_len = counters_sb->len < last_count_len ?
- last_count_len - counters_sb->len + 1 :
- 0;
- size_t progress_line_len = progress->title_len +
- counters_sb->len + 2;
- int cols = term_columns();
+ term_clear_line();
if (progress->split) {
- fprintf(stderr, " %s%*s", counters_sb->buf,
- (int) clear_len, eol);
- } else if (!done && cols < progress_line_len) {
- clear_len = progress->title_len + 1 < cols ?
- cols - progress->title_len : 0;
- fprintf(stderr, "%s:%*s\n %s%s",
- progress->title, (int) clear_len, "",
- counters_sb->buf, eol);
+ fprintf(stderr, " %s%s", counters_sb->buf,
+ eol);
+ } else if (!done &&
+ /* The "+ 2" accounts for the ": ". */
+ term_columns() < progress->title_len +
+ counters_sb->len + 2) {
+ fprintf(stderr, "%s:\n %s%s",
+ progress->title, counters_sb->buf, eol);
progress->split = 1;
} else {
- fprintf(stderr, "%s: %s%*s", progress->title,
- counters_sb->buf, (int) clear_len, eol);
+ fprintf(stderr, "%s: %s%s", progress->title,
+ counters_sb->buf, eol);
}
fflush(stderr);
}
strbuf_addstr(buf, ", ");
strbuf_humanise_bytes(buf, total);
strbuf_addstr(buf, " | ");
- strbuf_humanise_bytes(buf, rate * 1024);
- strbuf_addstr(buf, "/s");
+ strbuf_humanise_rate(buf, rate * 1024);
}
void display_throughput(struct progress *progress, uint64_t total)
now_ns = getnanotime();
if (!tp) {
- progress->throughput = tp = calloc(1, sizeof(*tp));
- if (tp) {
- tp->prev_total = tp->curr_total = total;
- tp->prev_ns = now_ns;
- strbuf_init(&tp->display, 0);
- }
+ progress->throughput = tp = xcalloc(1, sizeof(*tp));
+ tp->prev_total = tp->curr_total = total;
+ tp->prev_ns = now_ns;
+ strbuf_init(&tp->display, 0);
return;
}
tp->curr_total = total;
static struct progress *start_progress_delay(const char *title, uint64_t total,
unsigned delay, unsigned sparse)
{
- struct progress *progress = malloc(sizeof(*progress));
- if (!progress) {
- /* unlikely, but here's a good fallback */
- fprintf(stderr, "%s...\n", title);
- fflush(stderr);
- return NULL;
- }
+ struct progress *progress = xmalloc(sizeof(*progress));
progress->title = title;
progress->total = total;
progress->last_value = -1;