diff options
author | Junio C Hamano <gitster@pobox.com> | 2008-09-03 16:08:23 -0700 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2008-09-03 16:08:23 -0700 |
commit | 9b8ae93ad92efef59649a3a7c4bed162d2051059 (patch) | |
tree | 0661cd870dec63e098efef7e1fb7db31505dbbb2 /sideband.c | |
parent | 01914577ed42498d9e268684949d699e0272e964 (diff) | |
parent | de5d560c99c96e2955fb4d1d8a8fa6b469926292 (diff) | |
download | git-9b8ae93ad92efef59649a3a7c4bed162d2051059.tar.gz git-9b8ae93ad92efef59649a3a7c4bed162d2051059.tar.xz |
Merge branch 'maint'
* maint:
Start 1.6.0.2 maintenance cycle
tests: use "git xyzzy" form (t7200 - t9001)
tests: use "git xyzzy" form (t7000 - t7199)
Fix passwd(5) ref and reflect that commit doens't use commit-tree
improve handling of sideband message display
tests: use "git xyzzy" form (t3600 - t6999)
tests: use "git xyzzy" form (t0000 - t3599)
checkout: fix message when leaving detached HEAD
clone: fix creation of explicitly named target directory
'git foo' program identifies itself without dash in die() messages
setup_git_directory(): fix move to worktree toplevel directory
update-index: fix worktree setup
Start conforming code to "git subcmd" style
read-tree: setup worktree if merge is required
grep: fix worktree setup
diff*: fix worktree setup
Conflicts:
RelNotes
t/t3900-i18n-commit.sh
t/t7003-filter-branch.sh
Diffstat (limited to 'sideband.c')
-rw-r--r-- | sideband.c | 66 |
1 files changed, 43 insertions, 23 deletions
diff --git a/sideband.c b/sideband.c index b6777812c..cca336054 100644 --- a/sideband.c +++ b/sideband.c @@ -25,6 +25,7 @@ int recv_sideband(const char *me, int in_stream, int out, int err) unsigned sf; char buf[LARGE_PACKET_MAX + 2*FIX_SIZE]; char *suffix, *term; + int skip_pf = 0; memcpy(buf, PREFIX, pf); term = getenv("TERM"); @@ -54,39 +55,58 @@ int recv_sideband(const char *me, int in_stream, int out, int err) return SIDEBAND_REMOTE_ERROR; case 2: buf[pf] = ' '; - len += pf+1; - while (1) { - int brk = pf+1; + do { + char *b = buf; + 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++; - if (buf[brk-1] == '\n' || - buf[brk-1] == '\r') + if (brk > len) { + brk = 0; + break; + } + if (b[brk-1] == '\n' || + b[brk-1] == '\r') break; } /* * Let's insert a suffix to clear the end - * of the screen line, but only if current - * line data actually contains something. + * of the screen line if a line break was + * 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]; - memcpy(save, buf + brk, sf); - buf[brk + sf - 1] = buf[brk - 1]; - memcpy(buf + brk - 1, suffix, sf); - safe_write(err, buf, brk + sf); - memcpy(buf + brk, save, sf); - } else - safe_write(err, buf, brk); + memcpy(save, b + brk, sf); + b[brk + sf - 1] = b[brk - 1]; + memcpy(b + brk - 1, suffix, sf); + safe_write(err, b, brk + sf); + memcpy(b + brk, save, sf); + len -= brk; + } else { + int l = brk ? brk : len; + safe_write(err, b, l); + len -= l; + } - if (brk < len) { - memmove(buf + pf+1, buf + brk, len - brk); - len = len - brk + pf+1; - } else - break; - } + skip_pf = !brk; + memmove(buf + pf+1, b + brk, len); + } while (len); continue; case 1: safe_write(out, buf + pf+1, len); |