From: Junio C Hamano <gitster@pobox.com>
To: Nicolas Pitre <nico@fluxnic.net>
Cc: Lukas Fleischer <lfleischer@lfos.de>,
git@vger.kernel.org,
Johannes Schindelin <Johannes.Schindelin@gmx.de>,
Jeff King <peff@peff.net>
Subject: Re: [PATCH v4] Refactor recv_sideband()
Date: Tue, 28 Jun 2016 11:13:19 -0700 [thread overview]
Message-ID: <xmqqlh1p89mo.fsf@gitster.mtv.corp.google.com> (raw)
In-Reply-To: <alpine.LFD.2.20.1606281334030.24439@knanqh.ubzr> (Nicolas Pitre's message of "Tue, 28 Jun 2016 13:46:45 -0400 (EDT)")
Nicolas Pitre <nico@fluxnic.net> writes:
>> When we exit the loop because we set retval to a non-zero value,
>> should we still drain the outbuf?
>
> I would think so. Anything that the remote sent before any error should
> be printed nevertheless. The clue for the error might be in the pending
> buffer.
>
> However in this case the actual error printout and the pending buffer
> will appear reversed.
>
> So what I'd suggest is actually something like this:
>
> if (len < 1) {
> strbuf_addf(&outbuf, "\n%s: protocol error: no band designator\n", me);
> retval = SIDEBAND_PROTOCOL_ERROR;
> break;
>
> And so on for the other error cases.
Makes sense.
Here is what I have as a "SQUASH" on top of Lukas's change to be
queued on 'pu'.
It appears that a few tests get their expectations broken, with or
without this "SQUASH" change, though X-<.
sideband.c | 30 +++++++++++++++---------------
1 file changed, 15 insertions(+), 15 deletions(-)
diff --git a/sideband.c b/sideband.c
index 226a8c2..082dfc6 100644
--- a/sideband.c
+++ b/sideband.c
@@ -33,13 +33,15 @@ int recv_sideband(const char *me, int in_stream, int out)
else
suffix = DUMB_SUFFIX;
- while (retval == 0) {
+ while (!retval) {
int band, len;
len = packet_read(in_stream, NULL, NULL, buf, LARGE_PACKET_MAX, 0);
if (len == 0)
break;
if (len < 1) {
- fprintf(stderr, "%s: protocol error: no band designator\n", me);
+ strbuf_addf(&outbuf,
+ "\n%s: protocol error: no band designator\n",
+ me);
retval = SIDEBAND_PROTOCOL_ERROR;
break;
}
@@ -48,7 +50,7 @@ int recv_sideband(const char *me, int in_stream, int out)
len--;
switch (band) {
case 3:
- fprintf(stderr, "%s%s\n", PREFIX, buf + 1);
+ strbuf_addf(&outbuf, "\n%s%s\n", PREFIX, buf + 1);
retval = SIDEBAND_REMOTE_ERROR;
break;
case 2:
@@ -58,13 +60,12 @@ int recv_sideband(const char *me, int in_stream, int out)
* Append a suffix to each nonempty line to clear the
* end of the screen line.
*
- * The output is accumulated in a buffer and each line
- * is printed to stderr using fprintf() with a single
- * conversion specifier. This is a "best effort"
- * approach to supporting both inter-process atomicity
- * (single conversion specifiers are likely to end up
- * in single atomic write() system calls) and the ANSI
- * control code emulation under Windows.
+ * The output is accumulated in a buffer and
+ * each line is printed to stderr using
+ * fwrite(3). This is a "best effort"
+ * approach to support inter-process atomicity
+ * (single fwrite(3) call is likely to end up
+ * in single atomic write() system calls).
*/
while ((brk = strpbrk(b, "\n\r"))) {
int linelen = brk - b;
@@ -75,8 +76,7 @@ int recv_sideband(const char *me, int in_stream, int out)
} else {
strbuf_addf(&outbuf, "%c", *brk);
}
- fprintf(stderr, "%.*s", (int)outbuf.len,
- outbuf.buf);
+ fwrite(outbuf.buf, 1, outbuf.len, stderr);
strbuf_reset(&outbuf);
strbuf_addf(&outbuf, "%s", PREFIX);
@@ -90,15 +90,15 @@ int recv_sideband(const char *me, int in_stream, int out)
write_or_die(out, buf + 1, len);
break;
default:
- fprintf(stderr, "%s: protocol error: bad band #%d\n",
+ strbuf_addf(&outbuf, "\n%s: protocol error: bad band #%d\n",
me, band);
retval = SIDEBAND_PROTOCOL_ERROR;
break;
}
}
- if (outbuf.len > 0)
- fprintf(stderr, "%.*s", (int)outbuf.len, outbuf.buf);
+ if (outbuf.len)
+ fwrite(outbuf.buf, 1, outbuf.len, stderr);
strbuf_release(&outbuf);
return retval;
}
next prev parent reply other threads:[~2016-06-28 18:19 UTC|newest]
Thread overview: 60+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-06-13 19:52 [PATCH] Refactor recv_sideband() Lukas Fleischer
2016-06-13 21:07 ` Nicolas Pitre
2016-06-14 13:44 ` Johannes Schindelin
2016-06-14 15:04 ` Nicolas Pitre
2016-06-14 15:30 ` Johannes Schindelin
[not found] ` <Cq7rbYgOpb0CVCq7sbGmpL@videotron.ca>
2016-06-14 16:43 ` Nicolas Pitre
2016-06-14 17:09 ` Nicolas Pitre
[not found] ` <CsLdb3qLMBok7CsLebwX38@videotron.ca>
2016-06-14 17:55 ` Nicolas Pitre
2016-06-14 18:11 ` Junio C Hamano
2016-06-14 19:11 ` Lukas Fleischer
2016-06-14 19:16 ` Junio C Hamano
[not found] ` <Ct7VbfLfTHEALCt7Wbh8Xs@videotron.ca>
2016-06-14 20:10 ` Nicolas Pitre
2016-06-14 21:00 ` [PATCH v2] " Lukas Fleischer
2016-06-14 21:11 ` Lukas Fleischer
2016-06-14 21:25 ` Junio C Hamano
2016-06-15 3:44 ` Jeff King
[not found] ` <146597489449.32143.1327156804178869158@s-8d3a2dc3.on.site.uni-stuttgart.de>
2016-06-19 10:48 ` Lukas Fleischer
2016-06-24 15:31 ` Jeff King
2016-06-24 17:45 ` Johannes Schindelin
2016-06-24 18:14 ` Jeff King
2016-06-24 18:32 ` Junio C Hamano
2016-06-27 10:58 ` Lukas Fleischer
2016-06-27 15:54 ` Junio C Hamano
2016-06-27 16:16 ` Jeff King
2016-06-27 17:50 ` Junio C Hamano
2016-06-27 20:34 ` Lukas Fleischer
2016-06-27 20:47 ` Nicolas Pitre
2016-06-28 4:01 ` Lukas Fleischer
2016-06-28 5:20 ` Junio C Hamano
2016-06-28 10:04 ` Johannes Schindelin
2016-06-28 10:05 ` Johannes Schindelin
2016-06-28 15:13 ` Junio C Hamano
2016-06-28 16:21 ` Johannes Schindelin
2016-06-24 20:07 ` Dennis Kaarsemaker
2016-06-22 5:29 ` [PATCH v3] " Lukas Fleischer
2016-06-22 15:02 ` Nicolas Pitre
2016-06-22 22:47 ` Nicolas Pitre
2016-06-23 17:35 ` Lukas Fleischer
2016-06-23 18:59 ` Nicolas Pitre
2016-06-28 4:35 ` [PATCH v4] " Lukas Fleischer
2016-06-28 16:57 ` Junio C Hamano
2016-06-28 17:24 ` Junio C Hamano
2016-06-28 17:46 ` Nicolas Pitre
2016-06-28 18:13 ` Junio C Hamano [this message]
2016-06-28 18:28 ` Nicolas Pitre
2016-06-28 19:51 ` Junio C Hamano
2016-06-28 20:36 ` Nicolas Pitre
2016-06-28 21:09 ` Junio C Hamano
2016-06-28 21:44 ` Nicolas Pitre
2016-06-28 22:33 ` Junio C Hamano
2016-06-28 22:47 ` Junio C Hamano
2016-06-29 3:00 ` Junio C Hamano
2016-06-29 3:41 ` Nicolas Pitre
2016-06-29 2:02 ` Nicolas Pitre
2016-06-29 16:40 ` Junio C Hamano
2016-06-30 6:16 ` Lukas Fleischer
2016-07-01 20:01 ` Junio C Hamano
2016-07-05 20:35 ` Nicolas Pitre
2016-07-06 21:11 ` Junio C Hamano
2016-07-07 0:56 ` Nicolas Pitre
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=xmqqlh1p89mo.fsf@gitster.mtv.corp.google.com \
--to=gitster@pobox.com \
--cc=Johannes.Schindelin@gmx.de \
--cc=git@vger.kernel.org \
--cc=lfleischer@lfos.de \
--cc=nico@fluxnic.net \
--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.
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.