All of lore.kernel.org
 help / color / mirror / Atom feed
From: Jeff King <peff@peff.net>
To: Luke Mewburn <luke@mewburn.net>
Cc: gitster@pobox.com, git@vger.kernel.org
Subject: Re: [PATCH] progress: no progress in background
Date: Tue, 19 May 2015 01:17:53 -0400	[thread overview]
Message-ID: <20150519051752.GA16173@peff.net> (raw)
In-Reply-To: <20150415093418.GH23475@mewburn.net>

On Wed, Apr 15, 2015 at 07:34:18PM +1000, Luke Mewburn wrote:

> 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>
> ---
> [...]
> +static int is_foreground_fd(int fd)
> +{
> +	return getpgid(0) == tcgetpgrp(fd);
> +}

I've noticed that this patch causes a regression when we are
transmitting progress over the sideband channel of the git protocol. You
can see it pretty easily by cloning something large (like the kernel):

  git clone --no-local /path/to/linux.git

The "counting objects" phase is generated by the server side and sent
over the sideband, where we show it locally. So you'll get:

  remote: Counting objects: 499771

and so on, progressively, until we get to the final value. But with your
patch, we get silence for tens of seconds, and then the final value.
is_foreground_fd never returns true, and we print only once the "done"
flag is set.

The problem is that tcgetpgrp() returns -1 on the server side, because
of course there is no terminal. I suspect this may also break other
esoteric cases where "--progress" has been explicitly specified, but we
don't actually have a terminal (e.g., even something as simple as "ssh
host 'cd repo && git fsck --progress" exhibits the same behavior).

One reasonable fix (I think) would be to treat an error return from
tcgetpgrp() as "yes, we are the foreground", like:

diff --git a/progress.c b/progress.c
index 43d9228..2e31bec 100644
--- a/progress.c
+++ b/progress.c
@@ -74,7 +74,8 @@ static void clear_progress_signal(void)
 
 static int is_foreground_fd(int fd)
 {
-	return getpgid(0) == tcgetpgrp(fd);
+	int tpgrp = tcgetpgrp(fd);
+	return tpgrp < 0 || tpgrp == getpgid(0);
 }
 
 static int display(struct progress *progress, unsigned n, const char *done)

But I don't know if that messes up any other cases you were trying to
hit. We could also check that errno == ENOTTY, but I'm not sure it's
worth it. Whatever the reason, it probably makes sense to err on the
side of printing the progress.

-Peff

  reply	other threads:[~2015-05-19  5:18 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-04-15  9:34 [PATCH] progress: no progress in background Luke Mewburn
2015-05-19  5:17 ` Jeff King [this message]
2015-05-19  5:24   ` [PATCH] progress: treat "no terminal" as being in the foreground Jeff King
2015-05-19 16:12   ` [PATCH] progress: no progress in background Junio C Hamano

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

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20150519051752.GA16173@peff.net \
    --to=peff@peff.net \
    --cc=git@vger.kernel.org \
    --cc=gitster@pobox.com \
    --cc=luke@mewburn.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.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.