Browse Source

Merge branch 'lf/recv-sideband-cleanup' into maint

Code simplification.

* lf/recv-sideband-cleanup:
  sideband.c: small optimization of strbuf usage
  sideband.c: refactor recv_sideband()
maint
Junio C Hamano 9 years ago
parent
commit
ee7fd70edf
  1. 132
      sideband.c

132
sideband.c

@ -13,111 +13,95 @@
* the remote died unexpectedly. A flush() concludes the stream. * the remote died unexpectedly. A flush() concludes the stream.
*/ */


#define PREFIX "remote:" #define PREFIX "remote: "


#define ANSI_SUFFIX "\033[K" #define ANSI_SUFFIX "\033[K"
#define DUMB_SUFFIX " " #define DUMB_SUFFIX " "


#define FIX_SIZE 10 /* large enough for any of the above */

int recv_sideband(const char *me, int in_stream, int out) int recv_sideband(const char *me, int in_stream, int out)
{ {
unsigned pf = strlen(PREFIX); const char *term, *suffix;
unsigned sf; char buf[LARGE_PACKET_MAX + 1];
char buf[LARGE_PACKET_MAX + 2*FIX_SIZE]; struct strbuf outbuf = STRBUF_INIT;
char *suffix, *term; int retval = 0;
int skip_pf = 0;


memcpy(buf, PREFIX, pf);
term = getenv("TERM"); term = getenv("TERM");
if (isatty(2) && term && strcmp(term, "dumb")) if (isatty(2) && term && strcmp(term, "dumb"))
suffix = ANSI_SUFFIX; suffix = ANSI_SUFFIX;
else else
suffix = DUMB_SUFFIX; suffix = DUMB_SUFFIX;
sf = strlen(suffix);


while (1) { while (!retval) {
const char *b, *brk;
int band, len; int band, len;
len = packet_read(in_stream, NULL, NULL, buf + pf, LARGE_PACKET_MAX, 0); len = packet_read(in_stream, NULL, NULL, buf, LARGE_PACKET_MAX, 0);
if (len == 0) if (len == 0)
break; break;
if (len < 1) { if (len < 1) {
fprintf(stderr, "%s: protocol error: no band designator\n", me); strbuf_addf(&outbuf,
return SIDEBAND_PROTOCOL_ERROR; "%s%s: protocol error: no band designator",
outbuf.len ? "\n" : "", me);
retval = SIDEBAND_PROTOCOL_ERROR;
break;
} }
band = buf[pf] & 0xff; band = buf[0] & 0xff;
buf[len] = '\0';
len--; len--;
switch (band) { switch (band) {
case 3: case 3:
buf[pf] = ' '; strbuf_addf(&outbuf, "%s%s%s", outbuf.len ? "\n" : "",
buf[pf+1+len] = '\0'; PREFIX, buf + 1);
fprintf(stderr, "%s\n", buf); retval = SIDEBAND_REMOTE_ERROR;
return SIDEBAND_REMOTE_ERROR; break;
case 2: case 2:
buf[pf] = ' '; b = buf + 1;
do {
char *b = buf;
int brk = 0;


/* /*
* If the last buffer didn't end with a line * Append a suffix to each nonempty line to clear the
* break then we should not print a prefix * end of the screen line.
* this time around. *
*/ * The output is accumulated in a buffer and
if (skip_pf) { * each line is printed to stderr using
b += pf+1; * write(2) to ensure inter-process atomicity.
} else { */
len += pf+1; while ((brk = strpbrk(b, "\n\r"))) {
brk += pf+1; int linelen = brk - b;
}

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


/* if (!outbuf.len)
* Let's insert a suffix to clear the end strbuf_addstr(&outbuf, PREFIX);
* of the screen line if a line break was if (linelen > 0) {
* found. Also, if we don't skip the strbuf_addf(&outbuf, "%.*s%s%c",
* prefix, then a non-empty string must be linelen, b, suffix, *brk);
* present too.
*/
if (brk > (skip_pf ? 0 : (pf+1 + 1))) {
char save[FIX_SIZE];
memcpy(save, b + brk, sf);
b[brk + sf - 1] = b[brk - 1];
memcpy(b + brk - 1, suffix, sf);
fprintf(stderr, "%.*s", brk + sf, b);
memcpy(b + brk, save, sf);
len -= brk;
} else { } else {
int l = brk ? brk : len; strbuf_addch(&outbuf, *brk);
fprintf(stderr, "%.*s", l, b);
len -= l;
} }
xwrite(2, outbuf.buf, outbuf.len);
strbuf_reset(&outbuf);


skip_pf = !brk; b = brk + 1;
memmove(buf + pf+1, b + brk, len); }
} while (len);
continue; if (*b)
strbuf_addf(&outbuf, "%s%s",
outbuf.len ? "" : PREFIX, b);
break;
case 1: case 1:
write_or_die(out, buf + pf+1, len); write_or_die(out, buf + 1, len);
continue; break;
default: default:
fprintf(stderr, "%s: protocol error: bad band #%d\n", strbuf_addf(&outbuf, "%s%s: protocol error: bad band #%d",
me, band); outbuf.len ? "\n" : "", me, band);
return SIDEBAND_PROTOCOL_ERROR; retval = SIDEBAND_PROTOCOL_ERROR;
break;
} }
} }
return 0;
if (outbuf.len) {
strbuf_addch(&outbuf, '\n');
xwrite(2, outbuf.buf, outbuf.len);
}
strbuf_release(&outbuf);
return retval;
} }


/* /*

Loading…
Cancel
Save