pretty-print: add format-string version of draw_progress_bar() (#34939)
We often format the prefix string via asprintf() before, let's hence add a helper for that.
This commit is contained in:
+8
-11
@@ -124,17 +124,14 @@ static void raw_export_report_progress(RawExport *e) {
|
||||
|
||||
sd_notifyf(false, "X_IMPORT_PROGRESS=%u%%", percent);
|
||||
|
||||
if (isatty_safe(STDERR_FILENO)) {
|
||||
_cleanup_free_ char *s = NULL;
|
||||
|
||||
if (asprintf(&s, "%s %s/%s",
|
||||
special_glyph(SPECIAL_GLYPH_ARROW_RIGHT),
|
||||
FORMAT_BYTES(e->written_uncompressed),
|
||||
FORMAT_BYTES(e->st.st_size)) < 0)
|
||||
return;
|
||||
|
||||
draw_progress_bar(s, percent);
|
||||
} else
|
||||
if (isatty_safe(STDERR_FILENO))
|
||||
(void) draw_progress_barf(
|
||||
percent,
|
||||
"%s %s/%s",
|
||||
special_glyph(SPECIAL_GLYPH_ARROW_RIGHT),
|
||||
FORMAT_BYTES(e->written_uncompressed),
|
||||
FORMAT_BYTES(e->st.st_size));
|
||||
else
|
||||
log_info("Exported %u%%.", percent);
|
||||
|
||||
e->last_percent = percent;
|
||||
|
||||
+8
-11
@@ -134,17 +134,14 @@ static void tar_export_report_progress(TarExport *e) {
|
||||
|
||||
sd_notifyf(false, "X_IMPORT_PROGRESS=%u%%", percent);
|
||||
|
||||
if (isatty_safe(STDERR_FILENO)) {
|
||||
_cleanup_free_ char *s = NULL;
|
||||
|
||||
if (asprintf(&s, "%s %s/%s",
|
||||
special_glyph(SPECIAL_GLYPH_ARROW_RIGHT),
|
||||
FORMAT_BYTES(e->written_uncompressed),
|
||||
FORMAT_BYTES(e->quota_referenced)) < 0)
|
||||
return;
|
||||
|
||||
draw_progress_bar(s, percent);
|
||||
} else
|
||||
if (isatty_safe(STDERR_FILENO))
|
||||
(void) draw_progress_barf(
|
||||
percent,
|
||||
"%s %s/%s",
|
||||
special_glyph(SPECIAL_GLYPH_ARROW_RIGHT),
|
||||
FORMAT_BYTES(e->written_uncompressed),
|
||||
FORMAT_BYTES(e->quota_referenced));
|
||||
else
|
||||
log_info("Exported %u%%.", percent);
|
||||
|
||||
e->last_percent = percent;
|
||||
|
||||
+8
-11
@@ -151,17 +151,14 @@ static void raw_import_report_progress(RawImport *i) {
|
||||
|
||||
sd_notifyf(false, "X_IMPORT_PROGRESS=%u%%", percent);
|
||||
|
||||
if (isatty_safe(STDERR_FILENO)) {
|
||||
_cleanup_free_ char *s = NULL;
|
||||
|
||||
if (asprintf(&s, "%s %s/%s",
|
||||
special_glyph(SPECIAL_GLYPH_ARROW_RIGHT),
|
||||
FORMAT_BYTES(i->written_compressed),
|
||||
FORMAT_BYTES(i->input_stat.st_size)) < 0)
|
||||
return;
|
||||
|
||||
draw_progress_bar(s, percent);
|
||||
} else
|
||||
if (isatty_safe(STDERR_FILENO))
|
||||
(void) draw_progress_barf(
|
||||
percent,
|
||||
"%s %s/%s",
|
||||
special_glyph(SPECIAL_GLYPH_ARROW_RIGHT),
|
||||
FORMAT_BYTES(i->written_compressed),
|
||||
FORMAT_BYTES(i->input_stat.st_size));
|
||||
else
|
||||
log_info("Imported %u%%.", percent);
|
||||
|
||||
i->last_percent = percent;
|
||||
|
||||
+8
-11
@@ -152,17 +152,14 @@ static void tar_import_report_progress(TarImport *i) {
|
||||
|
||||
sd_notifyf(false, "X_IMPORT_PROGRESS=%u%%", percent);
|
||||
|
||||
if (isatty_safe(STDERR_FILENO)) {
|
||||
_cleanup_free_ char *s = NULL;
|
||||
|
||||
if (asprintf(&s, "%s %s/%s",
|
||||
special_glyph(SPECIAL_GLYPH_ARROW_RIGHT),
|
||||
FORMAT_BYTES(i->written_compressed),
|
||||
FORMAT_BYTES(i->input_stat.st_size)) < 0)
|
||||
return;
|
||||
|
||||
draw_progress_bar(s, percent);
|
||||
} else
|
||||
if (isatty_safe(STDERR_FILENO))
|
||||
(void) draw_progress_barf(
|
||||
percent,
|
||||
"%s %s/%s",
|
||||
special_glyph(SPECIAL_GLYPH_ARROW_RIGHT),
|
||||
FORMAT_BYTES(i->written_compressed),
|
||||
FORMAT_BYTES(i->input_stat.st_size));
|
||||
else
|
||||
log_info("Imported %u%%.", percent);
|
||||
|
||||
i->last_percent = percent;
|
||||
|
||||
+9
-11
@@ -5085,21 +5085,19 @@ static int partition_format_verity_sig(Context *context, Partition *p) {
|
||||
|
||||
static int progress_bytes(uint64_t n_bytes, void *userdata) {
|
||||
Partition *p = ASSERT_PTR(userdata);
|
||||
_cleanup_free_ char *s = NULL;
|
||||
|
||||
p->copy_blocks_done += n_bytes;
|
||||
|
||||
if (asprintf(&s, "%s %s %s %s/%s",
|
||||
strna(p->copy_blocks_path),
|
||||
special_glyph(SPECIAL_GLYPH_ARROW_RIGHT),
|
||||
strna(p->definition_path),
|
||||
FORMAT_BYTES(p->copy_blocks_done),
|
||||
FORMAT_BYTES(p->copy_blocks_size)) < 0)
|
||||
return log_oom();
|
||||
(void) draw_progress_barf(
|
||||
p->copy_blocks_done >= p->copy_blocks_size ? 100.0 : /* catch division be zero */
|
||||
100.0 * (double) p->copy_blocks_done / (double) p->copy_blocks_size,
|
||||
"%s %s %s %s/%s",
|
||||
strna(p->copy_blocks_path),
|
||||
special_glyph(SPECIAL_GLYPH_ARROW_RIGHT),
|
||||
strna(p->definition_path),
|
||||
FORMAT_BYTES(p->copy_blocks_done),
|
||||
FORMAT_BYTES(p->copy_blocks_size));
|
||||
|
||||
draw_progress_bar(s,
|
||||
p->copy_blocks_done >= p->copy_blocks_size ? 100.0 : /* catch division be zero */
|
||||
100.0 * (double) p->copy_blocks_done / (double) p->copy_blocks_size);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -461,7 +461,7 @@ bool shall_tint_background(void) {
|
||||
return cache != 0;
|
||||
}
|
||||
|
||||
void draw_progress_bar_impl(const char *prefix, double percentage) {
|
||||
void draw_progress_bar_unbuffered(const char *prefix, double percentage) {
|
||||
fputc('\r', stderr);
|
||||
if (prefix) {
|
||||
fputs(prefix, stderr);
|
||||
@@ -522,10 +522,9 @@ void draw_progress_bar_impl(const char *prefix, double percentage) {
|
||||
fputs(ANSI_ERASE_TO_END_OF_LINE, stderr);
|
||||
|
||||
fputc('\r', stderr);
|
||||
|
||||
}
|
||||
|
||||
void clear_progress_bar_impl(const char *prefix) {
|
||||
void clear_progress_bar_unbuffered(const char *prefix) {
|
||||
fputc('\r', stderr);
|
||||
|
||||
if (terminal_is_dumb())
|
||||
@@ -546,10 +545,26 @@ void draw_progress_bar(const char *prefix, double percentage) {
|
||||
* unbuffered by default. Let's temporarily turn on full buffering, so that this is passed to the tty
|
||||
* as a single buffer, to make things more efficient. */
|
||||
WITH_BUFFERED_STDERR;
|
||||
draw_progress_bar_impl(prefix, percentage);
|
||||
draw_progress_bar_unbuffered(prefix, percentage);
|
||||
}
|
||||
|
||||
int draw_progress_barf(double percentage, const char *prefixf, ...) {
|
||||
_cleanup_free_ char *s = NULL;
|
||||
va_list ap;
|
||||
int r;
|
||||
|
||||
va_start(ap, prefixf);
|
||||
r = vasprintf(&s, prefixf, ap);
|
||||
va_end(ap);
|
||||
|
||||
if (r < 0)
|
||||
return -ENOMEM;
|
||||
|
||||
draw_progress_bar(s, percentage);
|
||||
return 0;
|
||||
}
|
||||
|
||||
void clear_progress_bar(const char *prefix) {
|
||||
WITH_BUFFERED_STDERR;
|
||||
clear_progress_bar_impl(prefix);
|
||||
clear_progress_bar_unbuffered(prefix);
|
||||
}
|
||||
|
||||
@@ -54,9 +54,10 @@ int terminal_tint_color(double hue, char **ret);
|
||||
bool shall_tint_background(void);
|
||||
|
||||
void draw_progress_bar(const char *prefix, double percentage);
|
||||
int draw_progress_barf(double percentage, const char *prefixf, ...) _printf_(2, 3);
|
||||
void clear_progress_bar(const char *prefix);
|
||||
void draw_progress_bar_impl(const char *prefix, double percentage);
|
||||
void clear_progress_bar_impl(const char *prefix);
|
||||
void draw_progress_bar_unbuffered(const char *prefix, double percentage);
|
||||
void clear_progress_bar_unbuffered(const char *prefix);
|
||||
|
||||
static inline FILE* enable_buffering(FILE *f, char *buffer, size_t size) {
|
||||
assert(f);
|
||||
|
||||
@@ -843,23 +843,23 @@ static int update_render_progress(sd_event_source *source, void *userdata) {
|
||||
int progress = PTR_TO_INT(p);
|
||||
|
||||
if (progress == UPDATE_PROGRESS_FAILED) {
|
||||
clear_progress_bar_impl(target);
|
||||
clear_progress_bar_unbuffered(target);
|
||||
fprintf(stderr, "%s: %s Unknown failure\n", target, RED_CROSS_MARK());
|
||||
total += 100;
|
||||
} else if (progress == -EALREADY) {
|
||||
clear_progress_bar_impl(target);
|
||||
clear_progress_bar_unbuffered(target);
|
||||
fprintf(stderr, "%s: %s Already up-to-date\n", target, GREEN_CHECK_MARK());
|
||||
n--; /* Don't consider this target in the total */
|
||||
} else if (progress < 0) {
|
||||
clear_progress_bar_impl(target);
|
||||
clear_progress_bar_unbuffered(target);
|
||||
fprintf(stderr, "%s: %s %s\n", target, RED_CROSS_MARK(), STRERROR(progress));
|
||||
total += 100;
|
||||
} else if (progress == UPDATE_PROGRESS_DONE) {
|
||||
clear_progress_bar_impl(target);
|
||||
clear_progress_bar_unbuffered(target);
|
||||
fprintf(stderr, "%s: %s Done\n", target, GREEN_CHECK_MARK());
|
||||
total += 100;
|
||||
} else {
|
||||
draw_progress_bar_impl(target, progress);
|
||||
draw_progress_bar_unbuffered(target, progress);
|
||||
fputs("\n", stderr);
|
||||
total += progress;
|
||||
}
|
||||
@@ -867,9 +867,9 @@ static int update_render_progress(sd_event_source *source, void *userdata) {
|
||||
|
||||
if (n > 1) {
|
||||
if (exiting)
|
||||
clear_progress_bar_impl(target);
|
||||
clear_progress_bar_unbuffered(target);
|
||||
else {
|
||||
draw_progress_bar_impl("Total", (double) total / n);
|
||||
draw_progress_bar_unbuffered("Total", (double) total / n);
|
||||
if (terminal_is_dumb())
|
||||
fputs("\n", stderr);
|
||||
}
|
||||
|
||||
@@ -14,7 +14,7 @@ TEST(progress_bar) {
|
||||
|
||||
for (double d = 0; d <= 100; d += 0.5) {
|
||||
usleep_safe(random_u64_range(20 * USEC_PER_MSEC));
|
||||
draw_progress_bar(PROGRESS_PREFIX, d);
|
||||
draw_progress_barf(d, PROGRESS_PREFIX "[" PID_FMT "]", getpid_cached());
|
||||
|
||||
if (!paused && d >= 50) {
|
||||
clear_progress_bar(PROGRESS_PREFIX);
|
||||
@@ -25,9 +25,9 @@ TEST(progress_bar) {
|
||||
}
|
||||
}
|
||||
|
||||
draw_progress_bar(PROGRESS_PREFIX, 100);
|
||||
draw_progress_barf(100, PROGRESS_PREFIX "[" PID_FMT "]", getpid_cached());
|
||||
usleep_safe(300 * MSEC_PER_SEC);
|
||||
clear_progress_bar(PROGRESS_PREFIX);
|
||||
clear_progress_bar(PROGRESS_PREFIX "[0123456789]" );
|
||||
fputs("Done.\n", stdout);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user