summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLibravatar J. Bruce Fields <bfields@citi.umich.edu>2007-09-16 18:49:00 -0400
committerLibravatar Junio C Hamano <gitster@pobox.com>2007-09-17 02:18:44 -0700
commitd7416ecac8508367a8ac35ab74ef09b7707d0c4b (patch)
tree7a53da669ad42caf3999d73c8cf0056e7659aef4
parentapply --index-info: fall back to current index for mode changes (diff)
downloadtgif-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.c13
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;