Skip to content

Commit 6b9c42b

Browse files
Nicolas Pitregitster
authored andcommitted
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>
1 parent bea005e commit 6b9c42b

File tree

1 file changed

+43
-23
lines changed

1 file changed

+43
-23
lines changed

sideband.c

Lines changed: 43 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ int recv_sideband(const char *me, int in_stream, int out, int err)
2525
unsigned sf;
2626
char buf[LARGE_PACKET_MAX + 2*FIX_SIZE];
2727
char *suffix, *term;
28+
int skip_pf = 0;
2829

2930
memcpy(buf, PREFIX, pf);
3031
term = getenv("TERM");
@@ -54,39 +55,58 @@ int recv_sideband(const char *me, int in_stream, int out, int err)
5455
return SIDEBAND_REMOTE_ERROR;
5556
case 2:
5657
buf[pf] = ' ';
57-
len += pf+1;
58-
while (1) {
59-
int brk = pf+1;
58+
do {
59+
char *b = buf;
60+
int brk = 0;
6061

61-
/* Break the buffer into separate lines. */
62-
while (brk < len) {
62+
/*
63+
* If the last buffer didn't end with a line
64+
* break then we should not print a prefix
65+
* this time around.
66+
*/
67+
if (skip_pf) {
68+
b += pf+1;
69+
} else {
70+
len += pf+1;
71+
brk += pf+1;
72+
}
73+
74+
/* Look for a line break. */
75+
for (;;) {
6376
brk++;
64-
if (buf[brk-1] == '\n' ||
65-
buf[brk-1] == '\r')
77+
if (brk > len) {
78+
brk = 0;
79+
break;
80+
}
81+
if (b[brk-1] == '\n' ||
82+
b[brk-1] == '\r')
6683
break;
6784
}
6885

6986
/*
7087
* Let's insert a suffix to clear the end
71-
* of the screen line, but only if current
72-
* line data actually contains something.
88+
* of the screen line if a line break was
89+
* found. Also, if we don't skip the
90+
* prefix, then a non-empty string must be
91+
* present too.
7392
*/
74-
if (brk > pf+1 + 1) {
93+
if (brk > (skip_pf ? 0 : (pf+1 + 1))) {
7594
char save[FIX_SIZE];
76-
memcpy(save, buf + brk, sf);
77-
buf[brk + sf - 1] = buf[brk - 1];
78-
memcpy(buf + brk - 1, suffix, sf);
79-
safe_write(err, buf, brk + sf);
80-
memcpy(buf + brk, save, sf);
81-
} else
82-
safe_write(err, buf, brk);
95+
memcpy(save, b + brk, sf);
96+
b[brk + sf - 1] = b[brk - 1];
97+
memcpy(b + brk - 1, suffix, sf);
98+
safe_write(err, b, brk + sf);
99+
memcpy(b + brk, save, sf);
100+
len -= brk;
101+
} else {
102+
int l = brk ? brk : len;
103+
safe_write(err, b, l);
104+
len -= l;
105+
}
83106

84-
if (brk < len) {
85-
memmove(buf + pf+1, buf + brk, len - brk);
86-
len = len - brk + pf+1;
87-
} else
88-
break;
89-
}
107+
skip_pf = !brk;
108+
memmove(buf + pf+1, b + brk, len);
109+
} while (len);
90110
continue;
91111
case 1:
92112
safe_write(out, buf + pf+1, len);

0 commit comments

Comments
 (0)