@matheusbsbs / matheus-bagliano / commits / 6b9c42b4da
Fork 0

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);