diff: Help "less" hide ^M from the output
When the tracked contents have CRLF line endings, colored diff output shows "^M" at the end of output lines, which is distracting, even though the pager we use by default ("less") knows to hide them. The problem is that "less" hides a carriage-return only at the end of the line, immediately before a line feed. The colored diff output does not take this into account, and emits four element sequence for each line: - force this color; - the line up to but not including the terminating line feed; - reset color - line feed. By including the carriage return at the end of the line in the second item, we are breaking the smart our pager has in order not to show "^M". This can be fixed by changing the sequence to: - force this color; - the line up to but not including the terminating end-of-line; - reset color - end-of-line. where end-of-line is either a single linefeed or a CRLF pair. When the output is not colored, "force this color" and "reset color" sequences are both empty, so we won't have this problem with or without this patch. Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
@ -500,6 +500,18 @@ static int hunk_comment_line(const char *bol)
|
||||
return (isalpha(ch) || ch == '_' || ch == '$');
|
||||
}
|
||||
|
||||
static void show_line_to_eol(const char *line, int len, const char *reset)
|
||||
{
|
||||
int saw_cr_at_eol = 0;
|
||||
if (len < 0)
|
||||
len = strlen(line);
|
||||
saw_cr_at_eol = (len && line[len-1] == '\r');
|
||||
|
||||
printf("%.*s%s%s\n", len - saw_cr_at_eol, line,
|
||||
reset,
|
||||
saw_cr_at_eol ? "\r" : "");
|
||||
}
|
||||
|
||||
static void dump_sline(struct sline *sline, unsigned long cnt, int num_parent,
|
||||
int use_color)
|
||||
{
|
||||
@ -593,7 +605,7 @@ static void dump_sline(struct sline *sline, unsigned long cnt, int num_parent,
|
||||
else
|
||||
putchar(' ');
|
||||
}
|
||||
printf("%s%s\n", ll->line, c_reset);
|
||||
show_line_to_eol(ll->line, -1, c_reset);
|
||||
ll = ll->next;
|
||||
}
|
||||
if (cnt < lno)
|
||||
@ -617,7 +629,7 @@ static void dump_sline(struct sline *sline, unsigned long cnt, int num_parent,
|
||||
putchar(' ');
|
||||
p_mask <<= 1;
|
||||
}
|
||||
printf("%.*s%s\n", sl->len, sl->bol, c_reset);
|
||||
show_line_to_eol(sl->bol, sl->len, c_reset);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user