diff src/diff.c @ 14982:d56f14540dda v8.1.0502

patch 8.1.0502: internal diff fails when diffing a context diff commit https://github.com/vim/vim/commit/f080d70a82f3a4477f346d9efcdfaec1bc1e1d58 Author: Bram Moolenaar <Bram@vim.org> Date: Wed Oct 31 22:57:26 2018 +0100 patch 8.1.0502: internal diff fails when diffing a context diff Problem: Internal diff fails when diffing a context diff. (Hirohito Higashi) Solution: Only use callback calls with one line. (closes https://github.com/vim/vim/issues/3581)
author Bram Moolenaar <Bram@vim.org>
date Wed, 31 Oct 2018 23:00:08 +0100
parents 5d52b21b2e7f
children 9c2352253376
line wrap: on
line diff
--- a/src/diff.c
+++ b/src/diff.c
@@ -3206,21 +3206,23 @@ parse_diff_unified(
 xdiff_out(void *priv, mmbuffer_t *mb, int nbuf)
 {
     diffout_T	*dout = (diffout_T *)priv;
-    int		i;
     char_u	*p;
 
-    for (i = 0; i < nbuf; i++)
-    {
-	// We are only interested in the header lines, skip text lines.
-	if (STRNCMP(mb[i].ptr, "@@ ", 3)  != 0)
-	    continue;
-	if (ga_grow(&dout->dout_ga, 1) == FAIL)
-	    return -1;
-	p = vim_strnsave((char_u *)mb[i].ptr, mb[i].size);
-	if (p == NULL)
-	    return -1;
-	((char_u **)dout->dout_ga.ga_data)[dout->dout_ga.ga_len++] = p;
-    }
+    // The header line always comes by itself, text lines in at least two
+    // parts.  We drop the text part.
+    if (nbuf > 1)
+	return 0;
+
+    // sanity check
+    if (STRNCMP(mb[0].ptr, "@@ ", 3)  != 0)
+	return 0;
+
+    if (ga_grow(&dout->dout_ga, 1) == FAIL)
+	return -1;
+    p = vim_strnsave((char_u *)mb[0].ptr, mb[0].size);
+    if (p == NULL)
+	return -1;
+    ((char_u **)dout->dout_ga.ga_data)[dout->dout_ga.ga_len++] = p;
     return 0;
 }