Re: [PATCHv4] git apply: option to ignore whitespace differences
From: Junio C Hamano <hidden>
Date: 2016-06-15 22:47:20
Giuseppe Bilotta [off-list ref] writes:
quoted hunk
diff --git a/builtin-apply.c b/builtin-apply.c index 39dc96a..7ec5b8b 100644 --- a/builtin-apply.c +++ b/builtin-apply.c@@ -1773,12 +1866,57 @@ static int match_fragment(struct image *img, !memcmp(img->buf + try, preimage->buf, preimage->len)) return 1; + /* + * No exact match. If we are ignoring whitespace, run a line-by-line + * fuzzy matching. We collect all the line length information because + * we need it to adjust whitespace if we match. + */ + if (ws_ignore_action == ignore_ws_change) { + size_t imgoff = 0; + size_t preoff = 0; + size_t postlen = postimage->len; + size_t imglen[preimage->nr]; + for (i = 0; i < preimage->nr; i++) { + imglen[i] = img->line[try_lno+i].len; + size_t prelen = preimage->line[i].len; + if (!fuzzy_matchlines( + img->buf + try + imgoff, imglen[i], + preimage->buf + preoff, prelen)) + return 0; + if (preimage->line[i].flag & LINE_COMMON) + postlen += imglen[i] - prelen; + imgoff += imglen[i]; + preoff += prelen; + } + + /* + * Ok, the preimage matches with whitespace fuzz. Update it and + * the common postimage lines to use the same whitespace as the + * target. imgoff now holds the true length of the target that + * matches the preimage, and we need to update the line lengths + * of the preimage to match the target ones. + */ + fixed_buf = xmalloc(imgoff); + memcpy(fixed_buf, img->buf + try, imgoff); + for (i = 0; i < preimage->nr; i++) + preimage->line[i].len = imglen[i]; + + /* + * Update the preimage buffer and the postimage context lines. + */ + update_pre_post_images(preimage, postimage, + fixed_buf, imgoff, postlen); + return 1; + } +
Why do you need imglen[] vla here? IOW, can't the above be simply like this?
diff --git a/builtin-apply.c b/builtin-apply.c
index ae11b41..c8372a0 100644
--- a/builtin-apply.c
+++ b/builtin-apply.c@@ -1874,20 +1874,18 @@ static int match_fragment(struct image *img, if (ws_ignore_action == ignore_ws_change) { size_t imgoff = 0; size_t preoff = 0; size_t postlen = postimage->len; - size_t imglen[preimage->nr]; for (i = 0; i < preimage->nr; i++) { size_t prelen = preimage->line[i].len; + size_t imglen = img->line[try_lno+i].len; - imglen[i] = img->line[try_lno+i].len; - if (!fuzzy_matchlines( - img->buf + try + imgoff, imglen[i], - preimage->buf + preoff, prelen)) + if (!fuzzy_matchlines(img->buf + try + imgoff, imglen, + preimage->buf + preoff, prelen)) return 0; if (preimage->line[i].flag & LINE_COMMON) - postlen += imglen[i] - prelen; - imgoff += imglen[i]; + postlen += imglen - prelen; + imgoff += imglen; preoff += prelen; } /*
@@ -1899,9 +1897,9 @@ static int match_fragment(struct image *img, */ fixed_buf = xmalloc(imgoff); memcpy(fixed_buf, img->buf + try, imgoff); for (i = 0; i < preimage->nr; i++) - preimage->line[i].len = imglen[i]; + preimage->line[i].len = img->line[try_lno+i].len; /* * Update the preimage buffer and the postimage context lines. */