mirror of
https://github.com/git/git.git
synced 2026-01-10 01:56:42 +00:00
diff: highlight and error out on incomplete lines
Teach "git diff" to highlight "\ No newline at end of file" message as a whitespace error when incomplete-line whitespace error class is in effect. Thanks to the previous refactoring of complete rewrite code path, we can do this at a single place. Unlike whitespace errors in the payload where we need to annotate in line, possibly using colors, the line that has whitespace problems, we have a dedicated line already that can serve as the error message, so paint it as a whitespace error message. Also teach "git diff --check" to notice incomplete lines as whitespace errors and report when incomplete-line whitespace error class is in effect. Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
29
diff.c
29
diff.c
@@ -1370,7 +1370,11 @@ static void emit_diff_symbol_from_struct(struct diff_options *o,
|
||||
emit_line(o, "", "", line, len);
|
||||
break;
|
||||
case DIFF_SYMBOL_CONTEXT_INCOMPLETE:
|
||||
set = diff_get_color_opt(o, DIFF_CONTEXT);
|
||||
if ((flags & WS_INCOMPLETE_LINE) &&
|
||||
(flags & o->ws_error_highlight))
|
||||
set = diff_get_color_opt(o, DIFF_WHITESPACE);
|
||||
else
|
||||
set = diff_get_color_opt(o, DIFF_CONTEXT);
|
||||
reset = diff_get_color_opt(o, DIFF_RESET);
|
||||
emit_line(o, set, reset, line, len);
|
||||
break;
|
||||
@@ -1666,8 +1670,14 @@ static void emit_context_line(struct emit_callback *ecbdata,
|
||||
static void emit_incomplete_line_marker(struct emit_callback *ecbdata,
|
||||
const char *line, int len)
|
||||
{
|
||||
int last_line_kind = ecbdata->last_line_kind;
|
||||
unsigned flags = (last_line_kind == '+'
|
||||
? WSEH_NEW
|
||||
: last_line_kind == '-'
|
||||
? WSEH_OLD
|
||||
: WSEH_CONTEXT) | ecbdata->ws_rule;
|
||||
emit_diff_symbol(ecbdata->opt, DIFF_SYMBOL_CONTEXT_INCOMPLETE,
|
||||
line, len, 0);
|
||||
line, len, flags);
|
||||
}
|
||||
|
||||
static void emit_hunk_header(struct emit_callback *ecbdata,
|
||||
@@ -3254,6 +3264,7 @@ struct checkdiff_t {
|
||||
struct diff_options *o;
|
||||
unsigned ws_rule;
|
||||
unsigned status;
|
||||
int last_line_kind;
|
||||
};
|
||||
|
||||
static int is_conflict_marker(const char *line, int marker_size, unsigned long len)
|
||||
@@ -3292,6 +3303,7 @@ static void checkdiff_consume_hunk(void *priv,
|
||||
static int checkdiff_consume(void *priv, char *line, unsigned long len)
|
||||
{
|
||||
struct checkdiff_t *data = priv;
|
||||
int last_line_kind;
|
||||
int marker_size = data->conflict_marker_size;
|
||||
const char *ws = diff_get_color(data->o->use_color, DIFF_WHITESPACE);
|
||||
const char *reset = diff_get_color(data->o->use_color, DIFF_RESET);
|
||||
@@ -3302,6 +3314,8 @@ static int checkdiff_consume(void *priv, char *line, unsigned long len)
|
||||
assert(data->o);
|
||||
line_prefix = diff_line_prefix(data->o);
|
||||
|
||||
last_line_kind = data->last_line_kind;
|
||||
data->last_line_kind = line[0];
|
||||
if (line[0] == '+') {
|
||||
unsigned bad;
|
||||
data->lineno++;
|
||||
@@ -3324,6 +3338,17 @@ static int checkdiff_consume(void *priv, char *line, unsigned long len)
|
||||
data->o->file, set, reset, ws);
|
||||
} else if (line[0] == ' ') {
|
||||
data->lineno++;
|
||||
} else if (line[0] == '\\') {
|
||||
/* no newline at the end of the line */
|
||||
if ((data->ws_rule & WS_INCOMPLETE_LINE) &&
|
||||
(last_line_kind == '+')) {
|
||||
unsigned bad = WS_INCOMPLETE_LINE;
|
||||
data->status |= bad;
|
||||
err = whitespace_error_string(bad);
|
||||
fprintf(data->o->file, "%s%s:%d: %s.\n",
|
||||
line_prefix, data->filename, data->lineno, err);
|
||||
free(err);
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user