progress: no progress in background

Disable the display of the progress if stderr is not the
current foreground process.
Still display the final result when done.

Signed-off-by: Luke Mewburn <luke@mewburn.net>
Acked-by: Nicolas Pitre <nico@fluxnic.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Luke Mewburn 2015-04-13 23:30:51 +10:00 committed by Junio C Hamano
parent 4e6d207c45
commit 85cb8906f0

View File

@ -72,6 +72,11 @@ static void clear_progress_signal(void)
progress_update = 0;
}
static int is_foreground_fd(int fd)
{
return getpgid(0) == tcgetpgrp(fd);
}
static int display(struct progress *progress, unsigned n, const char *done)
{
const char *eol, *tp;
@ -98,16 +103,21 @@ static int display(struct progress *progress, unsigned n, const char *done)
unsigned percent = n * 100 / progress->total;
if (percent != progress->last_percent || progress_update) {
progress->last_percent = percent;
fprintf(stderr, "%s: %3u%% (%u/%u)%s%s",
progress->title, percent, n,
progress->total, tp, eol);
fflush(stderr);
if (is_foreground_fd(fileno(stderr)) || 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);
if (is_foreground_fd(fileno(stderr)) || done) {
fprintf(stderr, "%s: %u%s%s",
progress->title, n, tp, eol);
fflush(stderr);
}
progress_update = 0;
return 1;
}