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

Re: [PATCH 11/12] diff: highlight and error out on incomplete lines

From
PWPhillip Wood <phillip.wood123@gmail.com>
Date
Nov 10, 2025, 14:55 UTC
Message-ID
<7aa91693-bece-4fa6-ab14-f914d6fd49bd@gmail.com>
In-Reply-To
<20251104020928.582199-12-gitster@pobox.com>
On 04/11/2025 02:09, Junio C Hamano wrote:
Show 9 quoted lines
> Teach "git diff" to highlight "\ No newline at end of file" message
> as a whitespace error when incomplete-line whitespace error class is
> in effect.  Thanks to the previous refactoring of complete rewrite
> code path, we can do this at a single place.
> 
> Unlike whitespace errors in the payload where we need to annotate in
> line, possibly using colors, the line that has whitespace problems,
> we have a dedicated line already that can serve as the error
> message, so paint it as a whitespace error message.
This explains why we don't need to call emit_line_ws_markup() in this case
> Also teach "git diff --check" to notice incomplete lines as
> whitespace errors and report when incomplete-line whitespace error
> class is in effect.
Nice. The implementation looks good, I've left a few comments on the tests
Show 10 quoted lines
> diff --git a/t/t4015-diff-whitespace.sh b/t/t4015-diff-whitespace.sh
> index 9de7f73f42..138730cbce 100755
> --- a/t/t4015-diff-whitespace.sh
> +++ b/t/t4015-diff-whitespace.sh
> @@ -43,6 +43,49 @@ do
>   	'
>   done
>   
> +test_expect_success "incomplete line in both pre- and post-image context" '
> +	(echo foo && echo baz | tr -d "\012") >x &&
'printf "foo\nbaz"' might be clearer and save us forking "tr"
Show 10 quoted lines
> +	git add x &&
> +	(echo bar && echo baz | tr -d "\012") >x &&
> +	git diff x &&
> +	git -c core.whitespace=incomplete diff --check x &&
> +	git diff -R x &&
> +	git -c core.whitespace=incomplete diff -R --check x
> +'
> +
> +test_expect_success "incomplete lines on both pre- and post-image" '
> +	# The interpretation taken here is "since you are toucing
s/toucing/touching/
> +	# the line anyway, you would better fix the incomplete line
> +	# while you are at it."  but this is debatable.
I think it is a reasonable default.
Show 5 quoted lines
> +	echo foo | tr -d "\012" >x &&
> +	git add x &&
> +	echo bar | tr -d "\012" >x &&
> +	git diff x &&
> +	test_must_fail git -c core.whitespace=incomplete diff --check x &&
Do we want to check the error message here?

Looking at the tests below the coverage looks good for "diff --check" and for diff.wsErrorHighlight

Thanks
Phillip
Show 113 quoted lines
> +	git diff -R x &&
> +	test_must_fail git -c core.whitespace=incomplete diff -R --check x
> +'
> +
> +test_expect_success "fix incomplete line in pre-image" '
> +	echo foo | tr -d "\012" >x &&
> +	git add x &&
> +	echo bar >x &&
> +	git diff x &&
> +	git -c core.whitespace=incomplete diff --check x &&
> +	git diff -R x &&
> +	test_must_fail git -c core.whitespace=incomplete diff -R --check x
> +'
> +
> +test_expect_success "new incomplete line in post-image" '
> +	echo foo >x &&
> +	git add x &&
> +	echo bar | tr -d "\012" >x &&
> +	git diff x &&
> +	test_must_fail git -c core.whitespace=incomplete diff --check x &&
> +	git diff -R x &&
> +	git -c core.whitespace=incomplete diff -R --check x
> +'
> +
>   test_expect_success "Ray Lehtiniemi's example" '
>   	cat <<-\EOF >x &&
>   	do {
> @@ -1040,7 +1083,8 @@ test_expect_success 'ws-error-highlight test setup' '
>   	{
>   		echo "0. blank-at-eol " &&
>   		echo "1. still-blank-at-eol " &&
> -		echo "2. and a new line "
> +		echo "2. and a new line " &&
> +		printf "3. and more"
>   	} >x &&
>   	new_hash_x=$(git hash-object x) &&
>   	after=$(git rev-parse --short "$new_hash_x") &&
> @@ -1050,11 +1094,13 @@ test_expect_success 'ws-error-highlight test setup' '
>   	<BOLD>index $before..$after 100644<RESET>
>   	<BOLD>--- a/x<RESET>
>   	<BOLD>+++ b/x<RESET>
> -	<CYAN>@@ -1,2 +1,3 @@<RESET>
> +	<CYAN>@@ -1,2 +1,4 @@<RESET>
>   	 0. blank-at-eol <RESET>
>   	<RED>-<RESET><RED>1. blank-at-eol<RESET><BLUE> <RESET>
>   	<GREEN>+<RESET><GREEN>1. still-blank-at-eol<RESET><BLUE> <RESET>
>   	<GREEN>+<RESET><GREEN>2. and a new line<RESET><BLUE> <RESET>
> +	<GREEN>+<RESET><GREEN>3. and more<RESET>
> +	<BLUE>\ No newline at end of file<RESET>
>   	EOF
>   
>   	cat >expect.all <<-EOF &&
> @@ -1062,11 +1108,13 @@ test_expect_success 'ws-error-highlight test setup' '
>   	<BOLD>index $before..$after 100644<RESET>
>   	<BOLD>--- a/x<RESET>
>   	<BOLD>+++ b/x<RESET>
> -	<CYAN>@@ -1,2 +1,3 @@<RESET>
> +	<CYAN>@@ -1,2 +1,4 @@<RESET>
>   	 <RESET>0. blank-at-eol<RESET><BLUE> <RESET>
>   	<RED>-<RESET><RED>1. blank-at-eol<RESET><BLUE> <RESET>
>   	<GREEN>+<RESET><GREEN>1. still-blank-at-eol<RESET><BLUE> <RESET>
>   	<GREEN>+<RESET><GREEN>2. and a new line<RESET><BLUE> <RESET>
> +	<GREEN>+<RESET><GREEN>3. and more<RESET>
> +	<BLUE>\ No newline at end of file<RESET>
>   	EOF
>   
>   	cat >expect.none <<-EOF
> @@ -1074,16 +1122,19 @@ test_expect_success 'ws-error-highlight test setup' '
>   	<BOLD>index $before..$after 100644<RESET>
>   	<BOLD>--- a/x<RESET>
>   	<BOLD>+++ b/x<RESET>
> -	<CYAN>@@ -1,2 +1,3 @@<RESET>
> +	<CYAN>@@ -1,2 +1,4 @@<RESET>
>   	 0. blank-at-eol <RESET>
>   	<RED>-1. blank-at-eol <RESET>
>   	<GREEN>+1. still-blank-at-eol <RESET>
>   	<GREEN>+2. and a new line <RESET>
> +	<GREEN>+3. and more<RESET>
> +	\ No newline at end of file<RESET>
>   	EOF
>   
>   '
>   
>   test_expect_success 'test --ws-error-highlight option' '
> +	git config core.whitespace blank-at-eol,incomplete-line &&
>   
>   	git diff --color --ws-error-highlight=default,old >current.raw &&
>   	test_decode_color <current.raw >current &&
> @@ -1100,6 +1151,7 @@ test_expect_success 'test --ws-error-highlight option' '
>   '
>   
>   test_expect_success 'test diff.wsErrorHighlight config' '
> +	git config core.whitespace blank-at-eol,incomplete-line &&
>   
>   	git -c diff.wsErrorHighlight=default,old diff --color >current.raw &&
>   	test_decode_color <current.raw >current &&
> @@ -1116,6 +1168,7 @@ test_expect_success 'test diff.wsErrorHighlight config' '
>   '
>   
>   test_expect_success 'option overrides diff.wsErrorHighlight' '
> +	git config core.whitespace blank-at-eol,incomplete-line &&
>   
>   	git -c diff.wsErrorHighlight=none \
>   		diff --color --ws-error-highlight=default,old >current.raw &&
> @@ -1135,6 +1188,8 @@ test_expect_success 'option overrides diff.wsErrorHighlight' '
>   '
>   
>   test_expect_success 'detect moved code, complete file' '
> +	git config core.whitespace blank-at-eol &&
> +
>   	git reset --hard &&
>   	cat <<-\EOF >test.c &&
>   	#include<stdio.h>
Previous: Junio C HamanoNext: Junio C Hamano
Message 19 of 73 in “Incomplete lines”
  1. 00/12 Incomplete linesJunio C Hamano, Nov 4, 2025
  2. 01/12 whitespace: correct bit assignment commentsJunio C Hamano, Nov 4, 2025
  3. 02/12 diff: emit_line_ws_markup() if/else style fixJunio C Hamano, Nov 4, 2025
  4. 03/12 diff: correct suppress_blank_empty hackJunio C Hamano, Nov 4, 2025
  5. 04/12 diff: fix incorrect counting of line numbersJunio C Hamano, Nov 4, 2025
  6. Phillip WoodNov 10, 2025
  7. Junio C HamanoNov 10, 2025
  8. Phillip WoodNov 11, 2025
  9. Junio C HamanoNov 11, 2025
  10. 05/12 diff: refactor output of incomplete lineJunio C Hamano, Nov 4, 2025
  11. 06/12 diff: call emit_callback ecbdata everywhereJunio C Hamano, Nov 4, 2025
  12. 07/12 diff: update the way rewrite diff handles incomplete linesJunio C Hamano, Nov 4, 2025
  13. Phillip WoodNov 10, 2025
  14. Junio C HamanoNov 10, 2025
  15. 08/12 apply: revamp the parsing of incomplete linesJunio C Hamano, Nov 4, 2025
  16. 09/12 whitespace: allocate a few more bitsJunio C Hamano, Nov 4, 2025
  17. 10/12 apply: check and fix incomplete linesJunio C Hamano, Nov 4, 2025
  18. 11/12 diff: highlight and error out on incomplete linesJunio C Hamano, Nov 4, 2025
  19. Phillip WoodNov 10, 2025
  20. Junio C HamanoNov 10, 2025
  21. D. Ben KnobleNov 10, 2025
  22. 12/12 attr: enable incomplete-line whitespace error for this projectJunio C Hamano, Nov 4, 2025
  23. Phillip WoodNov 10, 2025
  24. Junio C HamanoNov 10, 2025
  25. 00/12 Incomplete linesJunio C Hamano, Nov 5, 2025
  26. 01/12 whitespace: correct bit assignment commentsJunio C Hamano, Nov 5, 2025
  27. 02/12 diff: emit_line_ws_markup() if/else style fixJunio C Hamano, Nov 5, 2025
  28. 03/12 diff: correct suppress_blank_empty hackJunio C Hamano, Nov 5, 2025
  29. 04/12 diff: fix incorrect counting of line numbersJunio C Hamano, Nov 5, 2025
  30. 05/12 diff: refactor output of incomplete lineJunio C Hamano, Nov 5, 2025
  31. Patrick SteinhardtNov 10, 2025
  32. Junio C HamanoNov 10, 2025
  33. 06/12 diff: call emit_callback ecbdata everywhereJunio C Hamano, Nov 5, 2025
  34. 07/12 diff: update the way rewrite diff handles incomplete linesJunio C Hamano, Nov 5, 2025
  35. Patrick SteinhardtNov 10, 2025
  36. Junio C HamanoNov 10, 2025
  37. 08/12 apply: revamp the parsing of incomplete linesJunio C Hamano, Nov 5, 2025
  38. 09/12 whitespace: allocate a few more bits and define WS_INCOMPLETE_LINEJunio C Hamano, Nov 5, 2025
  39. 10/12 apply: check and fix incomplete linesJunio C Hamano, Nov 5, 2025
  40. 11/12 diff: highlight and error out on incomplete linesJunio C Hamano, Nov 5, 2025
  41. 12/12 attr: enable incomplete-line whitespace error for this projectJunio C Hamano, Nov 5, 2025
  42. Patrick SteinhardtNov 10, 2025
  43. Phillip WoodNov 10, 2025
  44. 00/12 Incomplete linesJunio C Hamano, Nov 11, 2025
  45. 01/12 whitespace: correct bit assignment commentsJunio C Hamano, Nov 11, 2025
  46. 02/12 diff: emit_line_ws_markup() if/else style fixJunio C Hamano, Nov 11, 2025
  47. 03/12 diff: correct suppress_blank_empty hackJunio C Hamano, Nov 11, 2025
  48. 04/12 diff: fix incorrect counting of line numbersJunio C Hamano, Nov 11, 2025
  49. 05/12 diff: refactor output of incomplete lineJunio C Hamano, Nov 11, 2025
  50. 06/12 diff: call emit_callback ecbdata everywhereJunio C Hamano, Nov 11, 2025
  51. 07/12 diff: update the way rewrite diff handles incomplete linesJunio C Hamano, Nov 11, 2025
  52. 08/12 apply: revamp the parsing of incomplete linesJunio C Hamano, Nov 11, 2025
  53. 09/12 whitespace: allocate a few more bits and define WS_INCOMPLETE_LINEJunio C Hamano, Nov 11, 2025
  54. 10/12 apply: check and fix incomplete linesJunio C Hamano, Nov 11, 2025
  55. 11/12 diff: highlight and error out on incomplete linesJunio C Hamano, Nov 11, 2025
  56. 12/12 attr: enable incomplete-line whitespace error for this projectJunio C Hamano, Nov 11, 2025
  57. Phillip WoodNov 11, 2025
  58. 00/12 Incomplete linesJunio C Hamano, Nov 12, 2025
  59. 01/12 whitespace: correct bit assignment commentsJunio C Hamano, Nov 12, 2025
  60. 02/12 diff: emit_line_ws_markup() if/else style fixJunio C Hamano, Nov 12, 2025
  61. 03/12 diff: correct suppress_blank_empty hackJunio C Hamano, Nov 12, 2025
  62. 04/12 diff: keep track of the type of the last line seenJunio C Hamano, Nov 12, 2025
  63. 05/12 diff: refactor output of incomplete lineJunio C Hamano, Nov 12, 2025
  64. 06/12 diff: call emit_callback ecbdata everywhereJunio C Hamano, Nov 12, 2025
  65. 07/12 diff: update the way rewrite diff handles incomplete linesJunio C Hamano, Nov 12, 2025
  66. 08/12 apply: revamp the parsing of incomplete linesJunio C Hamano, Nov 12, 2025
  67. 09/12 whitespace: allocate a few more bits and define WS_INCOMPLETE_LINEJunio C Hamano, Nov 12, 2025
  68. 10/12 apply: check and fix incomplete linesJunio C Hamano, Nov 12, 2025
  69. 11/12 diff: highlight and error out on incomplete linesJunio C Hamano, Nov 12, 2025
  70. 12/12 attr: enable incomplete-line whitespace error for this projectJunio C Hamano, Nov 12, 2025
  71. Phillip WoodNov 14, 2025
  72. Junio C HamanoNov 14, 2025
  73. Junio C HamanoNov 23, 2025

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.