From: "SZEDER Gábor" <szeder.dev@gmail.com>
To: Junio C Hamano <gitster@pobox.com>
Cc: "Ævar Arnfjörð Bjarmason" <avarab@gmail.com>,
"Jeff King" <peff@peff.net>, "Duy Nguyen" <pclouds@gmail.com>,
"Luke Mewburn" <luke@mewburn.net>,
git@vger.kernel.org, "SZEDER Gábor" <szeder.dev@gmail.com>
Subject: [PATCH v4 0/4] Progress display fixes
Date: Fri, 12 Apr 2019 21:45:11 +0200 [thread overview]
Message-ID: <20190412194515.6244-1-szeder.dev@gmail.com> (raw)
In-Reply-To: <20190405004539.31467-1-szeder.dev@gmail.com>
This patch series fixes two progress display issues by breaking
progress bars longer than the width of the terminal and by properly
cleaning up the previously shown progress bar. Hopefully for good
this time...
This "properly cleaning up" part, i.e. mainly patch 3, was buggy in
previous versions, because:
- It used the wrong format flag and the '\r' was padded on the
right, but should have been padded to the left.
- The padding was one space shorter than necessary, because I didn't
account for the '\r' included in the field width as well.
SZEDER Gábor (4):
progress: make display_progress() return void
progress: assemble percentage and counters in a strbuf before printing
progress: clear previous progress update dynamically
progress: break too long progress bar lines
progress.c | 74 ++++++++++++++++++++++++++++++++++++++----------------
progress.h | 2 +-
2 files changed, 54 insertions(+), 22 deletions(-)
Interdiff:
diff --git a/progress.c b/progress.c
index 97e18671e5..2d8022a622 100644
--- a/progress.c
+++ b/progress.c
@@ -116,23 +116,24 @@ static void display(struct progress *progress, uint64_t n, const char *done)
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 : 0;
+ last_count_len - counters_sb->len + 1 :
+ 0;
size_t progress_line_len = progress->title_len +
counters_sb->len + 2;
int cols = term_columns();
if (progress->split) {
- fprintf(stderr, " %s%-*s", counters_sb->buf,
+ 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 - 1 : 0;
+ cols - progress->title_len : 0;
fprintf(stderr, "%s:%*s\n %s%s",
progress->title, (int) clear_len, "",
counters_sb->buf, eol);
progress->split = 1;
} else {
- fprintf(stderr, "%s: %s%-*s", progress->title,
+ fprintf(stderr, "%s: %s%*s", progress->title,
counters_sb->buf, (int) clear_len, eol);
}
fflush(stderr);
Range-diff:
1: cb68e5b0ec = 1: cb68e5b0ec progress: make display_progress() return void
2: 017d095142 = 2: 017d095142 progress: assemble percentage and counters in a strbuf before printing
3: c5a4def5ac ! 3: ec9c96d102 progress: clear previous progress update dynamically
@@ -49,8 +49,9 @@
- 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 : 0;
-+ fprintf(stderr, "%s: %s%-*s", progress->title,
++ last_count_len - counters_sb->len + 1 :
++ 0;
++ fprintf(stderr, "%s: %s%*s", progress->title,
+ counters_sb->buf, (int) clear_len, eol);
fflush(stderr);
}
4: 2f44dff84e ! 4: 8fc8e3cf94 progress: break too long progress bar lines
@@ -69,27 +69,27 @@
static volatile sig_atomic_t progress_update;
@@
- const char *eol = done ? done : "\r";
size_t clear_len = counters_sb->len < last_count_len ?
- last_count_len - counters_sb->len : 0;
-- fprintf(stderr, "%s: %s%-*s", progress->title,
+ last_count_len - counters_sb->len + 1 :
+ 0;
+- fprintf(stderr, "%s: %s%*s", progress->title,
- counters_sb->buf, (int) clear_len, eol);
+ size_t progress_line_len = progress->title_len +
+ counters_sb->len + 2;
+ int cols = term_columns();
+
+ if (progress->split) {
-+ fprintf(stderr, " %s%-*s", counters_sb->buf,
++ 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 - 1 : 0;
++ cols - progress->title_len : 0;
+ fprintf(stderr, "%s:%*s\n %s%s",
+ progress->title, (int) clear_len, "",
+ counters_sb->buf, eol);
+ progress->split = 1;
+ } else {
-+ fprintf(stderr, "%s: %s%-*s", progress->title,
++ fprintf(stderr, "%s: %s%*s", progress->title,
+ counters_sb->buf, (int) clear_len, eol);
+ }
fflush(stderr);
--
2.21.0.746.gd74f1657d3
next prev parent reply other threads:[~2019-04-12 19:45 UTC|newest]
Thread overview: 38+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-03-25 10:38 [PATCH 0/5] Progress display fixes SZEDER Gábor
2019-03-25 10:38 ` [PATCH 1/5] progress: make display_progress() return void SZEDER Gábor
2019-03-25 10:38 ` [PATCH 2/5] progress: return early when in the background SZEDER Gábor
2019-03-25 11:08 ` Ævar Arnfjörð Bjarmason
2019-03-25 11:39 ` SZEDER Gábor
2019-03-26 6:28 ` Luke Mewburn
2019-03-26 5:38 ` Jeff King
2019-03-25 10:38 ` [PATCH 3/5] progress: assemble percentage and counters in a strbuf before printing SZEDER Gábor
2019-03-26 5:45 ` Jeff King
2019-03-27 10:24 ` SZEDER Gábor
2019-03-28 2:12 ` Jeff King
2019-03-25 10:38 ` [PATCH 4/5] progress: clear previous progress update dynamically SZEDER Gábor
2019-03-25 10:38 ` [PATCH 5/5] progress: break too long progress bar lines SZEDER Gábor
2019-03-25 11:02 ` Duy Nguyen
2019-03-25 11:12 ` SZEDER Gábor
2019-03-26 5:52 ` [PATCH 0/5] Progress display fixes Jeff King
2019-04-01 11:52 ` [PATCH v2 0/4] " SZEDER Gábor
2019-04-01 11:52 ` [PATCH v2 1/4] progress: make display_progress() return void SZEDER Gábor
2019-04-02 5:42 ` Eric Sunshine
2019-04-01 11:52 ` [PATCH v2 2/4] progress: assemble percentage and counters in a strbuf before printing SZEDER Gábor
2019-04-02 5:45 ` Eric Sunshine
2019-04-02 5:50 ` Eric Sunshine
2019-04-01 11:52 ` [PATCH v2 3/4] progress: clear previous progress update dynamically SZEDER Gábor
2019-04-01 13:30 ` Jeff King
2019-04-01 14:15 ` SZEDER Gábor
2019-04-02 14:27 ` Jeff King
2019-04-01 11:52 ` [PATCH v2 4/4] progress: break too long progress bar lines SZEDER Gábor
2019-04-05 0:45 ` [PATCH v3 0/4] Progress display fixes SZEDER Gábor
2019-04-05 0:45 ` [PATCH v3 1/4] progress: make display_progress() return void SZEDER Gábor
2019-04-05 0:45 ` [PATCH v3 2/4] progress: assemble percentage and counters in a strbuf before printing SZEDER Gábor
2019-04-05 0:45 ` [PATCH v3 3/4] progress: clear previous progress update dynamically SZEDER Gábor
2019-04-05 0:45 ` [PATCH v3 4/4] progress: break too long progress bar lines SZEDER Gábor
2019-04-05 22:21 ` [PATCH v3 0/4] Progress display fixes Jeff King
2019-04-12 19:45 ` SZEDER Gábor [this message]
2019-04-12 19:45 ` [PATCH v4 1/4] progress: make display_progress() return void SZEDER Gábor
2019-04-12 19:45 ` [PATCH v4 2/4] progress: assemble percentage and counters in a strbuf before printing SZEDER Gábor
2019-04-12 19:45 ` [PATCH v4 3/4] progress: clear previous progress update dynamically SZEDER Gábor
2019-04-12 19:45 ` [PATCH v4 4/4] progress: break too long progress bar lines SZEDER Gábor
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
List information: http://vger.kernel.org/majordomo-info.html
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20190412194515.6244-1-szeder.dev@gmail.com \
--to=szeder.dev@gmail.com \
--cc=avarab@gmail.com \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
--cc=luke@mewburn.net \
--cc=pclouds@gmail.com \
--cc=peff@peff.net \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this public inbox
https://80x24.org/mirrors/git.git
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).