git/list[1] front-page[2] threads[3] people[4] search[5] about
 

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.
 		 */
Previous: Giuseppe BilottaNext: Giuseppe Bilotta
Message 2 of 3 in “[PATCHv4] git apply: option to ignore whitespace differences”
  1. Giuseppe BilottaAug 4, 2009
  2. Junio C HamanoSep 1, 2009
  3. Giuseppe BilottaSep 1, 2009

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.