apply --whitespace=fix: fix tab-in-indent
authorJohannes Sixt <j6t@kdbg.org>
Tue, 30 Nov 2010 08:22:04 +0000 (09:22 +0100)
committerJunio C Hamano <gitster@pobox.com>
Wed, 1 Dec 2010 22:34:00 +0000 (14:34 -0800)
When the whitespace rule tab-in-indent is enabled, apply --whitespace=fix
replaces tabs by the appropriate amount of blanks. The code used
"dst->len % 8" as the criterion to stop adding blanks. But it forgot that
dst holds more than just the current line. Consequently, the modulus was
computed correctly only for the first added line, but not for the second
and subsequent lines. Fix it.

Signed-off-by: Johannes Sixt <j6t@kdbg.org>
Acked-by: Chris Webb <chris@arachsys.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
t/t4124-apply-ws-rule.sh
ws.c

index 8d46df6c3abd0643031106dac15758fdbe5f2ccd..aea052346eab0d2a0b409fdb736279bcfc6b0af2 100755 (executable)
@@ -121,6 +121,34 @@ test_expect_success 'whitespace=error-all, no rule (attribute)' '
 
 '
 
+test_expect_success 'spaces inserted by tab-in-indent' '
+
+       git config core.whitespace -trailing,-space,-indent,tab &&
+       rm -f .gitattributes &&
+       test_fix % &&
+       sed -e "s/_/ /g" -e "s/>/       /" <<-\EOF >expect &&
+               An_SP in an ordinary line>and a HT.
+               ________A HT (%).
+               ________A SP and a HT (@%).
+               _________A SP, a HT and a SP (@%).
+               _______Seven SP.
+               ________Eight SP (#).
+               ________Seven SP and a HT (@%).
+               ________________Eight SP and a HT (@#%).
+               _________Seven SP, a HT and a SP (@%).
+               _________________Eight SP, a HT and a SP (@#%).
+               _______________Fifteen SP (#).
+               ________________Fifteen SP and a HT (@#%).
+               ________________Sixteen SP (#).
+               ________________________Sixteen SP and a HT (@#%).
+               _____a__Five SP, a non WS, two SP.
+               A line with a (!) trailing SP_
+               A line with a (!) trailing HT>
+       EOF
+       test_cmp expect target
+
+'
+
 for t in - ''
 do
        case "$t" in '') tt='!' ;; *) tt= ;; esac
diff --git a/ws.c b/ws.c
index d7b8c33f14195ba7ebe86bdbca2fea8f1b22ad37..b282e8c1005875232a46619c0e45f70a5a298e99 100644 (file)
--- a/ws.c
+++ b/ws.c
@@ -362,12 +362,13 @@ void ws_fix_copy(struct strbuf *dst, const char *src, int len, unsigned ws_rule,
                fixed = 1;
        } else if ((ws_rule & WS_TAB_IN_INDENT) && last_tab_in_indent >= 0) {
                /* Expand tabs into spaces */
+               int start = dst->len;
                int last = last_tab_in_indent + 1;
                for (i = 0; i < last; i++) {
                        if (src[i] == '\t')
                                do {
                                        strbuf_addch(dst, ' ');
-                               } while (dst->len % 8);
+                               } while ((dst->len - start) % 8);
                        else
                                strbuf_addch(dst, src[i]);
                }