Skip to content

Commit

Permalink
improve handling of sideband message display
Browse files Browse the repository at this point in the history
Currently the code looks for line break characters in order to prepend
"remote: " to every line received as many lines can be sent in a single
chunk.  However the opposite might happen too, i.e. a single message
line split amongst multiple chunks.  This patch adds support for the
later case to avoid displays like:

	remote: Compressing objeremote: cts: 100% (313/313), done.

Signed-off-by: Nicolas Pitre <nico@cam.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
  • Loading branch information
Nicolas Pitre authored and Junio C Hamano committed Sep 3, 2008
1 parent bea005e commit 6b9c42b
Showing 1 changed file with 43 additions and 23 deletions.
66 changes: 43 additions & 23 deletions sideband.c
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ int recv_sideband(const char *me, int in_stream, int out, int err)
unsigned sf;
char buf[LARGE_PACKET_MAX + 2*FIX_SIZE];
char *suffix, *term;
int skip_pf = 0;

memcpy(buf, PREFIX, pf);
term = getenv("TERM");
Expand Down Expand Up @@ -54,39 +55,58 @@ int recv_sideband(const char *me, int in_stream, int out, int err)
return SIDEBAND_REMOTE_ERROR;
case 2:
buf[pf] = ' ';
len += pf+1;
while (1) {
int brk = pf+1;
do {
char *b = buf;
int brk = 0;

/* Break the buffer into separate lines. */
while (brk < len) {
/*
* If the last buffer didn't end with a line
* break then we should not print a prefix
* this time around.
*/
if (skip_pf) {
b += pf+1;
} else {
len += pf+1;
brk += pf+1;
}

/* Look for a line break. */
for (;;) {
brk++;
if (buf[brk-1] == '\n' ||
buf[brk-1] == '\r')
if (brk > len) {
brk = 0;
break;
}
if (b[brk-1] == '\n' ||
b[brk-1] == '\r')
break;
}

/*
* Let's insert a suffix to clear the end
* of the screen line, but only if current
* line data actually contains something.
* of the screen line if a line break was
* found. Also, if we don't skip the
* prefix, then a non-empty string must be
* present too.
*/
if (brk > pf+1 + 1) {
if (brk > (skip_pf ? 0 : (pf+1 + 1))) {
char save[FIX_SIZE];
memcpy(save, buf + brk, sf);
buf[brk + sf - 1] = buf[brk - 1];
memcpy(buf + brk - 1, suffix, sf);
safe_write(err, buf, brk + sf);
memcpy(buf + brk, save, sf);
} else
safe_write(err, buf, brk);
memcpy(save, b + brk, sf);
b[brk + sf - 1] = b[brk - 1];
memcpy(b + brk - 1, suffix, sf);
safe_write(err, b, brk + sf);
memcpy(b + brk, save, sf);
len -= brk;
} else {
int l = brk ? brk : len;
safe_write(err, b, l);
len -= l;
}

if (brk < len) {
memmove(buf + pf+1, buf + brk, len - brk);
len = len - brk + pf+1;
} else
break;
}
skip_pf = !brk;
memmove(buf + pf+1, b + brk, len);
} while (len);
continue;
case 1:
safe_write(out, buf + pf+1, len);
Expand Down

0 comments on commit 6b9c42b

Please sign in to comment.