File vim-7.1-diff_check.patch of Package vim

Index: vim71/src/diff.c
===================================================================
--- vim71.orig/src/diff.c
+++ vim71/src/diff.c
@@ -42,7 +42,7 @@ static void diff_check_unchanged __ARGS(
 static int diff_check_sanity __ARGS((tabpage_T *tp, diff_T *dp));
 static void diff_redraw __ARGS((int dofold));
 static int diff_write __ARGS((buf_T *buf, char_u *fname));
-static void diff_file __ARGS((char_u *tmp_orig, char_u *tmp_new, char_u *tmp_diff));
+static int diff_file __ARGS((char_u *tmp_orig, char_u *tmp_new, char_u *tmp_diff));
 static int diff_equal_entry __ARGS((diff_T *dp, int idx1, int idx2));
 static int diff_cmp __ARGS((char_u *s1, char_u *s2));
 #ifdef FEAT_FOLDING
@@ -661,6 +661,7 @@ ex_diffupdate(eap)
     char_u	*tmp_diff;
     FILE	*fd;
     int		ok;
+    int		retval;
 
     /* Delete all diffblocks. */
     diff_clear(curtab);
@@ -706,7 +707,7 @@ ex_diffupdate(eap)
 	    {
 		fwrite("line2\n", (size_t)6, (size_t)1, fd);
 		fclose(fd);
-		diff_file(tmp_orig, tmp_new, tmp_diff);
+		retval = diff_file(tmp_orig, tmp_new, tmp_diff);
 		fd = mch_fopen((char *)tmp_diff, "r");
 		if (fd != NULL)
 		{
@@ -750,6 +751,12 @@ ex_diffupdate(eap)
 	}
 #endif
 
+	/* diff returned an error */
+	if (retval == 2) {
+		ok = FALSE;
+		break;
+	}
+
 	/* If we checked if "-a" works already, break here. */
 	if (diff_a_works != MAYBE)
 	    break;
@@ -782,10 +789,13 @@ ex_diffupdate(eap)
 	    continue;
 	if (diff_write(buf, tmp_new) == FAIL)
 	    continue;
-	diff_file(tmp_orig, tmp_new, tmp_diff);
-
-	/* Read the diff output and add each entry to the diff list. */
-	diff_read(idx_orig, idx_new, tmp_diff);
+	retval = diff_file(tmp_orig, tmp_new, tmp_diff);
+	if (retval == 2)
+		EMSG(_("E97: Cannot create diffs"));
+	else {
+		/* Read the diff output and add each entry to the diff list. */
+		diff_read(idx_orig, idx_new, tmp_diff);
+	}
 	mch_remove(tmp_diff);
 	mch_remove(tmp_new);
     }
@@ -802,13 +812,14 @@ theend:
 /*
  * Make a diff between files "tmp_orig" and "tmp_new", results in "tmp_diff".
  */
-    static void
+    static int
 diff_file(tmp_orig, tmp_new, tmp_diff)
     char_u	*tmp_orig;
     char_u	*tmp_new;
     char_u	*tmp_diff;
 {
     char_u	*cmd;
+    int		retval=0;
 
 #ifdef FEAT_EVAL
     if (*p_dex != NUL)
@@ -842,13 +853,14 @@ diff_file(tmp_orig, tmp_new, tmp_diff)
 #ifdef FEAT_AUTOCMD
 	    block_autocmds();	/* Avoid ShellCmdPost stuff */
 #endif
-	    (void)call_shell(cmd, SHELL_FILTER|SHELL_SILENT|SHELL_DOOUT);
+	    retval = call_shell(cmd, SHELL_FILTER|SHELL_SILENT|SHELL_DOOUT);
 #ifdef FEAT_AUTOCMD
 	    unblock_autocmds();
 #endif
 	    vim_free(cmd);
 	}
     }
+    return retval;
 }
 
 /*
openSUSE Build Service is sponsored by