Re: [PATCHv4] git apply: option to ignore whitespace differences
- From
Junio C Hamano <gitster@pobox.com>
- Date
- Sep 1, 2009, 09:17 UTC
- Message-ID
- <7vocpvvxaw.fsf@alter.siamese.dyndns.org>
- In-Reply-To
- <1249384609-30240-1-git-send-email-giuseppe.bilotta@gmail.com>
Giuseppe Bilotta <giuseppe.bilotta@gmail.com> writes:
Show 51 quoted lines
> 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. */