improve handling of sideband message display
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>
This commit is contained in:
parent
bea005e21b
commit
6b9c42b4da
66
sideband.c
66
sideband.c
@ -25,6 +25,7 @@ int recv_sideband(const char *me, int in_stream, int out, int err)
|
|||||||
unsigned sf;
|
unsigned sf;
|
||||||
char buf[LARGE_PACKET_MAX + 2*FIX_SIZE];
|
char buf[LARGE_PACKET_MAX + 2*FIX_SIZE];
|
||||||
char *suffix, *term;
|
char *suffix, *term;
|
||||||
|
int skip_pf = 0;
|
||||||
|
|
||||||
memcpy(buf, PREFIX, pf);
|
memcpy(buf, PREFIX, pf);
|
||||||
term = getenv("TERM");
|
term = getenv("TERM");
|
||||||
@ -54,39 +55,58 @@ int recv_sideband(const char *me, int in_stream, int out, int err)
|
|||||||
return SIDEBAND_REMOTE_ERROR;
|
return SIDEBAND_REMOTE_ERROR;
|
||||||
case 2:
|
case 2:
|
||||||
buf[pf] = ' ';
|
buf[pf] = ' ';
|
||||||
len += pf+1;
|
do {
|
||||||
while (1) {
|
char *b = buf;
|
||||||
int brk = pf+1;
|
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++;
|
brk++;
|
||||||
if (buf[brk-1] == '\n' ||
|
if (brk > len) {
|
||||||
buf[brk-1] == '\r')
|
brk = 0;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (b[brk-1] == '\n' ||
|
||||||
|
b[brk-1] == '\r')
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Let's insert a suffix to clear the end
|
* Let's insert a suffix to clear the end
|
||||||
* of the screen line, but only if current
|
* of the screen line if a line break was
|
||||||
* line data actually contains something.
|
* 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];
|
char save[FIX_SIZE];
|
||||||
memcpy(save, buf + brk, sf);
|
memcpy(save, b + brk, sf);
|
||||||
buf[brk + sf - 1] = buf[brk - 1];
|
b[brk + sf - 1] = b[brk - 1];
|
||||||
memcpy(buf + brk - 1, suffix, sf);
|
memcpy(b + brk - 1, suffix, sf);
|
||||||
safe_write(err, buf, brk + sf);
|
safe_write(err, b, brk + sf);
|
||||||
memcpy(buf + brk, save, sf);
|
memcpy(b + brk, save, sf);
|
||||||
} else
|
len -= brk;
|
||||||
safe_write(err, buf, brk);
|
} else {
|
||||||
|
int l = brk ? brk : len;
|
||||||
|
safe_write(err, b, l);
|
||||||
|
len -= l;
|
||||||
|
}
|
||||||
|
|
||||||
if (brk < len) {
|
skip_pf = !brk;
|
||||||
memmove(buf + pf+1, buf + brk, len - brk);
|
memmove(buf + pf+1, b + brk, len);
|
||||||
len = len - brk + pf+1;
|
} while (len);
|
||||||
} else
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
continue;
|
continue;
|
||||||
case 1:
|
case 1:
|
||||||
safe_write(out, buf + pf+1, len);
|
safe_write(out, buf + pf+1, len);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user