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>
Nicolas Pitre committed
Sep 3, 2008 at 15:13 UTC
6b9c42b4daabe3d0471d9f90d2ae472c9d994e1c
1 file changed
+43
-23
sideband.c
+43
-23
@@ -25,6 +25,7 @@ int recv_sideband(const char *me, int in_stream, int out, int err)
25
unsigned sf;
26
char buf[LARGE_PACKET_MAX + 2*FIX_SIZE];
27
char *suffix, *term;
28
+ int skip_pf = 0;
29
30
memcpy(buf, PREFIX, pf);
31
term = getenv("TERM");
@@ -54,39 +55,58 @@ int recv_sideband(const char *me, int in_stream, int out, int err)
55
return SIDEBAND_REMOTE_ERROR;
56
case 2:
57
buf[pf] = ' ';
57
- len += pf+1;
58
- while (1) {
59
- int brk = pf+1;
58
+ do {
59
+ char *b = buf;
60
+ int brk = 0;
61
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 (;;) {
76
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')
83
break;
84
}
85
86
/*
87
* 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.
92
*/
74
- if (brk > pf+1 + 1) {
93
+ if (brk > (skip_pf ? 0 : (pf+1 + 1))) {
94
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
+ }
106
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);
110
continue;
111
case 1:
112
safe_write(out, buf + pf+1, len);