Skip to content

Commit

Permalink
whitespace: add tab-in-indent error class
Browse files Browse the repository at this point in the history
Some projects and languages use coding style where no tab character is used to
indent the lines.

This only adds support and documentation for "apply --whitespace=warn" and
"diff --check"; later patches add "apply --whitespace=fix" and tests.

Signed-off-by: Chris Webb <chris@arachsys.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
  • Loading branch information
Chris Webb authored and Junio C Hamano committed Apr 3, 2010
1 parent 727c371 commit 3e3ec2a
Show file tree
Hide file tree
Showing 3 changed files with 25 additions and 5 deletions.
2 changes: 2 additions & 0 deletions Documentation/config.txt
Original file line number Diff line number Diff line change
Expand Up @@ -481,6 +481,8 @@ core.whitespace::
error (enabled by default).
* `indent-with-non-tab` treats a line that is indented with 8 or more
space characters as an error (not enabled by default).
* `tab-in-indent` treats a tab character in the initial indent part of
the line as an error (not enabled by default).
* `blank-at-eof` treats blank lines added at the end of file as an error
(enabled by default).
* `trailing-space` is a short-hand to cover both `blank-at-eol` and
Expand Down
1 change: 1 addition & 0 deletions cache.h
Original file line number Diff line number Diff line change
Expand Up @@ -1040,6 +1040,7 @@ void shift_tree_by(const unsigned char *, const unsigned char *, unsigned char *
#define WS_INDENT_WITH_NON_TAB 04
#define WS_CR_AT_EOL 010
#define WS_BLANK_AT_EOF 020
#define WS_TAB_IN_INDENT 040
#define WS_TRAILING_SPACE (WS_BLANK_AT_EOL|WS_BLANK_AT_EOF)
#define WS_DEFAULT_RULE (WS_TRAILING_SPACE|WS_SPACE_BEFORE_TAB)
extern unsigned whitespace_rule_cfg;
Expand Down
27 changes: 22 additions & 5 deletions ws.c
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ static struct whitespace_rule {
{ "cr-at-eol", WS_CR_AT_EOL, 1 },
{ "blank-at-eol", WS_BLANK_AT_EOL, 0 },
{ "blank-at-eof", WS_BLANK_AT_EOF, 0 },
{ "tab-in-indent", WS_TAB_IN_INDENT, 0, 1 },
};

unsigned parse_whitespace_rule(const char *string)
Expand Down Expand Up @@ -57,6 +58,9 @@ unsigned parse_whitespace_rule(const char *string)
}
string = ep;
}

if (rule & WS_TAB_IN_INDENT && rule & WS_INDENT_WITH_NON_TAB)
die("cannot enforce both tab-in-indent and indent-with-non-tab");
return rule;
}

Expand Down Expand Up @@ -127,6 +131,11 @@ char *whitespace_error_string(unsigned ws)
strbuf_addstr(&err, ", ");
strbuf_addstr(&err, "indent with spaces");
}
if (ws & WS_TAB_IN_INDENT) {
if (err.len)
strbuf_addstr(&err, ", ");
strbuf_addstr(&err, "tab in indent");
}
return strbuf_detach(&err, NULL);
}

Expand Down Expand Up @@ -165,7 +174,7 @@ static unsigned ws_check_emit_1(const char *line, int len, unsigned ws_rule,
}
}

/* Check for space before tab in initial indent. */
/* Check indentation */
for (i = 0; i < len; i++) {
if (line[i] == ' ')
continue;
Expand All @@ -177,11 +186,19 @@ static unsigned ws_check_emit_1(const char *line, int len, unsigned ws_rule,
fputs(ws, stream);
fwrite(line + written, i - written, 1, stream);
fputs(reset, stream);
fwrite(line + i, 1, 1, stream);
}
} else if (stream)
fwrite(line + written, i - written, 1, stream);
if (stream)
fwrite(line + i, 1, 1, stream);
} else if (ws_rule & WS_TAB_IN_INDENT) {
result |= WS_TAB_IN_INDENT;
if (stream) {
fwrite(line + written, i - written, 1, stream);
fputs(ws, stream);
fwrite(line + i, 1, 1, stream);
fputs(reset, stream);
}
} else if (stream) {
fwrite(line + written, i - written + 1, 1, stream);
}
written = i + 1;
}

Expand Down

0 comments on commit 3e3ec2a

Please sign in to comment.