@matheusbsbs / matheus-bagliano / commits / efa574438f
Fork 0

apply --whitespace=fix: detect new blank lines at eof correctly

The command tries to strip blank lines at the end of the file added by a patch. It is done by first detecting if a hunk in patch has additional blank lines at the end of itself, and if so checking if such a hunk applies at the end of file. This patch addresses a bug in the logic to implement the former (the previous one addressed a bug in the latter). If the original ends with blank lines, often the patch hunk ends like this: @@ -l,5 +m,7 @@$ _context$ _context$ -deleted$ +$ +$ +$ _$ _$ where _ stands for SP and $ shows a end-of-line. This example patch adds three trailing blank lines, but the code fails to notice it, because it only pays attention to added blank lines at the very end of the hunk. In this example, the three added blank lines do not appear textually at the end in the patch, even though you can see that they are indeed added at the end, if you rearrange the diff like this: @@ -l,5 +m,7 @@$ _context$ _context$ -deleted$ _$ _$ +$ +$ +$ The fix is not to reset the number of (candidate) added blank lines at the end when the loop sees a context line that is empty. Signed-off-by: Junio C Hamano <gitster@pobox.com>

Junio C Hamano committed Sep 3, 2009 at 14:08 UTC efa574438fca4ed328d2e47ecdb6363c50a905ec
2 files changed +30
builtin-apply.c
+6
@@ -1913,6 +1913,7 @@ static int apply_one_fragment(struct image *img, struct fragment *frag,
1913 int len = linelen(patch, size);
1914 int plen, added;
1915 int added_blank_line = 0;
1916 + int is_blank_context = 0;
1917
1918 if (!len)
1919 break;
@@ -1945,8 +1946,11 @@ static int apply_one_fragment(struct image *img, struct fragment *frag,
1946 *new++ = '\n';
1947 add_line_info(&preimage, "\n", 1, LINE_COMMON);
1948 add_line_info(&postimage, "\n", 1, LINE_COMMON);
1949 + is_blank_context = 1;
1950 break;
1951 case ' ':
1952 + if (plen && patch[1] == '\n')
1953 + is_blank_context = 1;
1954 case '-':
1955 memcpy(old, patch + 1, plen);
1956 add_line_info(&preimage, old, plen,
@@ -1986,6 +1990,8 @@ static int apply_one_fragment(struct image *img, struct fragment *frag,
1990 }
1991 if (added_blank_line)
1992 new_blank_lines_at_end++;
1993 + else if (is_blank_context)
1994 + ;
1995 else
1996 new_blank_lines_at_end = 0;
1997 patch += len;
t/t4124-apply-ws-rule.sh
+24
@@ -177,4 +177,28 @@ test_expect_success 'blank at EOF with --whitespace=fix (2)' '
177 test_cmp expect one
178 '
179
180 +test_expect_success 'blank at EOF with --whitespace=fix (3)' '
181 + { echo a; echo b; echo; } >one &&
182 + git add one &&
183 + { echo a; echo c; echo; } >expect &&
184 + { cat expect; echo; echo; } >one &&
185 + git diff -- one >patch &&
186 +
187 + git checkout one &&
188 + git apply --whitespace=fix patch &&
189 + test_cmp expect one
190 +'
191 +
192 +test_expect_success 'blank at end of hunk, not at EOF with --whitespace=fix' '
193 + { echo a; echo b; echo; echo; echo; echo; echo; echo d; } >one &&
194 + git add one &&
195 + { echo a; echo c; echo; echo; echo; echo; echo; echo; echo d; } >expect &&
196 + cp expect one &&
197 + git diff -- one >patch &&
198 +
199 + git checkout one &&
200 + git apply --whitespace=fix patch &&
201 + test_cmp expect one
202 +'
203 +
204 test_done