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

[PATCH 3/3] diff: fix the location of hunk headers for "git diff --color-words -U0"

From
Markus Heidelberg <markus.heidelberg@web.de>
Date
Oct 28, 2009, 12:24 UTC
Message-ID
<1256732672-11817-4-git-send-email-markus.heidelberg@web.de>
In-Reply-To
<1256732672-11817-1-git-send-email-markus.heidelberg@web.de>

Colored word diff without context lines firstly printed all the hunk headers among each other and then printed the diff.

Because the word diff cannot be calculated before the end of the diff (added/removed lines) hunk, it was calculated directly before first line of context after the diff. But this didn't work if there was no context. In this case the diff wasn't printed in fn_out_consume(), but entirely in free_diff_words_data(). This also led to calculate the colored diff from the whole diff in one swoop instead of calculating it in several independent steps (one step per hunk).

We now calculate and print the word diff directly before the next hunk header. The word diff of the last hunk is still printed in free_diff_words_data().

Signed-off-by: Markus Heidelberg <markus.heidelberg@web.de>
---
 diff.c                |   13 +++++++++----
 t/t4034-diff-words.sh |    2 +-
 2 files changed, 10 insertions(+), 5 deletions(-)
diff --git a/diff.c b/diff.c
index 067e5a0..e95fe9b 100644
--- a/diff.c
+++ b/diff.c
@@ -785,10 +785,15 @@ static void fn_out_consume(void *priv, char *line, unsigned long len)
 			diff_words_append(line, len,
 					  &ecbdata->diff_words->plus);
 			return;
-		} else if (line[0] == ' ') {
-			if (ecbdata->diff_words->minus.text.size ||
-			    ecbdata->diff_words->plus.text.size)
-				diff_words_show(ecbdata->diff_words);
+		}
+		/*
+		 * If line[0] == '@' then this prints the content of the
+		 * previous hunk, necessary for 0-context.
+		 */
+		if (ecbdata->diff_words->minus.text.size ||
+		    ecbdata->diff_words->plus.text.size)
+			diff_words_show(ecbdata->diff_words);
+		if (line[0] == ' ') {
 			line++;
 			len--;
 			emit_line(ecbdata->file, plain, reset, line, len);
diff --git a/t/t4034-diff-words.sh b/t/t4034-diff-words.sh
index 82240cf..21db6e9 100755
--- a/t/t4034-diff-words.sh
+++ b/t/t4034-diff-words.sh
@@ -77,7 +77,7 @@ cat > expect <<\EOF
 <GREEN>aeff = aeff * ( aaa )<RESET>
 EOF
 
-test_expect_failure 'word diff without context' '
+test_expect_success 'word diff without context' '
 
 	word_diff --color-words --unified=0
 
-- 
1.6.5.2.86.g61663
Previous: Markus HeidelbergNext: Johannes Schindelin
Message 4 of 14 in “fix "git diff --color-words -U0"”
  1. 0/3 fix "git diff --color-words -U0"Markus Heidelberg, Oct 28, 2009
  2. 1/3 t4034-diff-words: add a test for word diff without contextMarkus Heidelberg, Oct 28, 2009
  3. 2/3 diff: move the handling of the hunk header after the changed linesMarkus Heidelberg, Oct 28, 2009
  4. 3/3 diff: fix the location of hunk headers for "git diff --color-words -U0"Markus Heidelberg, Oct 28, 2009
  5. diff --color-words -U0: fix the location of hunk headersJohannes Schindelin, Oct 29, 2009
  6. Markus HeidelbergOct 29, 2009
  7. Johannes SchindelinOct 29, 2009
  8. Markus HeidelbergOct 29, 2009
  9. Junio C HamanoOct 30, 2009
  10. Johannes SchindelinOct 30, 2009
  11. Junio C HamanoOct 30, 2009
  12. Johannes SchindelinOct 31, 2009
  13. Junio C HamanoOct 28, 2009
  14. Markus HeidelbergOct 28, 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.