mirror of
https://github.com/git/git.git
synced 2025-12-12 20:36:24 +01:00
Make the tab width used for whitespace checks configurable
A new whitespace "rule" is added that sets the tab width to use for whitespace checks and fix-ups and replaces the hard-coded constant 8. Since the setting is part of the rules, it can be set per file using .gitattributes. The new configuration is backwards compatible because older git versions simply ignore unknown whitespace rules. Signed-off-by: Johannes Sixt <j6t@kdbg.org> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
committed by
Junio C Hamano
parent
dee40e5178
commit
f4b05a4947
22
ws.c
22
ws.c
@@ -56,6 +56,16 @@ unsigned parse_whitespace_rule(const char *string)
|
||||
rule |= whitespace_rule_names[i].rule_bits;
|
||||
break;
|
||||
}
|
||||
if (strncmp(string, "tabwidth=", 9) == 0) {
|
||||
unsigned tabwidth = atoi(string + 9);
|
||||
if (0 < tabwidth && tabwidth < 0100) {
|
||||
rule &= ~WS_TAB_WIDTH_MASK;
|
||||
rule |= tabwidth;
|
||||
}
|
||||
else
|
||||
warning("tabwidth %.*s out of range",
|
||||
(int)(len - 9), string + 9);
|
||||
}
|
||||
string = ep;
|
||||
}
|
||||
|
||||
@@ -84,7 +94,7 @@ unsigned whitespace_rule(const char *pathname)
|
||||
value = attr_whitespace_rule.value;
|
||||
if (ATTR_TRUE(value)) {
|
||||
/* true (whitespace) */
|
||||
unsigned all_rule = 0;
|
||||
unsigned all_rule = ws_tab_width(whitespace_rule_cfg);
|
||||
int i;
|
||||
for (i = 0; i < ARRAY_SIZE(whitespace_rule_names); i++)
|
||||
if (!whitespace_rule_names[i].loosens_error &&
|
||||
@@ -93,7 +103,7 @@ unsigned whitespace_rule(const char *pathname)
|
||||
return all_rule;
|
||||
} else if (ATTR_FALSE(value)) {
|
||||
/* false (-whitespace) */
|
||||
return 0;
|
||||
return ws_tab_width(whitespace_rule_cfg);
|
||||
} else if (ATTR_UNSET(value)) {
|
||||
/* reset to default (!whitespace) */
|
||||
return whitespace_rule_cfg;
|
||||
@@ -206,7 +216,7 @@ static unsigned ws_check_emit_1(const char *line, int len, unsigned ws_rule,
|
||||
}
|
||||
|
||||
/* Check for indent using non-tab. */
|
||||
if ((ws_rule & WS_INDENT_WITH_NON_TAB) && i - written >= 8) {
|
||||
if ((ws_rule & WS_INDENT_WITH_NON_TAB) && i - written >= ws_tab_width(ws_rule)) {
|
||||
result |= WS_INDENT_WITH_NON_TAB;
|
||||
if (stream) {
|
||||
fputs(ws, stream);
|
||||
@@ -320,7 +330,7 @@ void ws_fix_copy(struct strbuf *dst, const char *src, int len, unsigned ws_rule,
|
||||
} else if (ch == ' ') {
|
||||
last_space_in_indent = i;
|
||||
if ((ws_rule & WS_INDENT_WITH_NON_TAB) &&
|
||||
8 <= i - last_tab_in_indent)
|
||||
ws_tab_width(ws_rule) <= i - last_tab_in_indent)
|
||||
need_fix_leading_space = 1;
|
||||
} else
|
||||
break;
|
||||
@@ -350,7 +360,7 @@ void ws_fix_copy(struct strbuf *dst, const char *src, int len, unsigned ws_rule,
|
||||
strbuf_addch(dst, ch);
|
||||
} else {
|
||||
consecutive_spaces++;
|
||||
if (consecutive_spaces == 8) {
|
||||
if (consecutive_spaces == ws_tab_width(ws_rule)) {
|
||||
strbuf_addch(dst, '\t');
|
||||
consecutive_spaces = 0;
|
||||
}
|
||||
@@ -369,7 +379,7 @@ void ws_fix_copy(struct strbuf *dst, const char *src, int len, unsigned ws_rule,
|
||||
if (src[i] == '\t')
|
||||
do {
|
||||
strbuf_addch(dst, ' ');
|
||||
} while ((dst->len - start) % 8);
|
||||
} while ((dst->len - start) % ws_tab_width(ws_rule));
|
||||
else
|
||||
strbuf_addch(dst, src[i]);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user