diff options
author | J. Bruce Fields <bfields@citi.umich.edu> | 2007-09-16 18:49:00 -0400 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2007-09-17 02:18:44 -0700 |
commit | d7416ecac8508367a8ac35ab74ef09b7707d0c4b (patch) | |
tree | 7a53da669ad42caf3999d73c8cf0056e7659aef4 | |
parent | apply --index-info: fall back to current index for mode changes (diff) | |
download | tgif-d7416ecac8508367a8ac35ab74ef09b7707d0c4b.tar.xz |
git-apply: fix whitespace stripping
The algorithm isn't right here: it accumulates any set of 8 spaces into
tabs even if they're separated by tabs, so
<four spaces><tab><four spaces><tab>
is converted to
<tab><tab><tab>
when it should be just
<tab><tab>
So teach git-apply that a tab hides any group of less than 8 previous
spaces in a row.
Signed-off-by: J. Bruce Fields <bfields@citi.umich.edu>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
-rw-r--r-- | builtin-apply.c | 13 |
1 files changed, 10 insertions, 3 deletions
diff --git a/builtin-apply.c b/builtin-apply.c index f4ecf03ed4..5ad371424b 100644 --- a/builtin-apply.c +++ b/builtin-apply.c @@ -1642,15 +1642,22 @@ static int apply_line(char *output, const char *patch, int plen) buf = output; if (need_fix_leading_space) { + int consecutive_spaces = 0; /* between patch[1..last_tab_in_indent] strip the * funny spaces, updating them to tab as needed. */ for (i = 1; i < last_tab_in_indent; i++, plen--) { char ch = patch[i]; - if (ch != ' ') + if (ch != ' ') { + consecutive_spaces = 0; *output++ = ch; - else if ((i % 8) == 0) - *output++ = '\t'; + } else { + consecutive_spaces++; + if (consecutive_spaces == 8) { + *output++ = '\t'; + consecutive_spaces = 0; + } + } } fixed = 1; i = last_tab_in_indent; |