Re: [PATCH] diff: reset color before printing newline
- From
SZEDER Gábor <szeder@ira.uka.de>
- Date
- Jun 17, 2008, 00:22 UTC
- Message-ID
- <20080617002205.GD7003@neumann>
- In-Reply-To
- <1213653602-31307-1-git-send-email-szeder@ira.uka.de>
Junio,
On Tue, Jun 17, 2008 at 12:00:02AM +0200, SZEDER Gábor wrote:
> I'm not sure about putting a newline unconditionally at the end of the > line, but this was the status quo before c1795bb0.
we _must_ not print a newline when there was none, as it breaks "normal" colored diffs very badly.
Since c1795bb0, for whatever reason, checkdiff_consume() first calls emit_line() to print only the first '+' character of the line, without trailing newline, and then calls check_and_emit_line() to print the rest of the line. Now if we restore the status quo prior to c1795bb0 regarding unconditional newlines in emit_line(), then there is always a newline between the the '+' and the rest of the line, which is bad, bad, bad.
So this should be squashed to the previous patch.
--- diff.c | 9 +++++++-- 1 files changed, 7 insertions(+), 2 deletions(-)
diff --git a/diff.c b/diff.c index f23657b..722f577 100644 --- a/diff.c +++ b/diff.c @@ -514,13 +514,18 @@ const char *diff_get_color(int diff_use_color, enum color_diff ix) static void emit_line(FILE *file, const char *set, const char *reset, const char *line, int len) { - if (len > 0 && line[len-1] == '\n') + int trailing_newline = 0; + + if (len > 0 && line[len-1] == '\n') { len--; + trailing_newline = 1; + } fputs(set, file); fwrite(line, len, 1, file); fputs(reset, file); - fputc('\n', file); + if (trailing_newline) + fputc('\n', file); } static void emit_add_line(const char *reset, struct emit_callback *ecbdata, const char *line, int len)