]> granicus.if.org Git - vim/commitdiff
patch 8.1.0402: the DiffUpdate event isn't triggered for :diffput v8.1.0402
authorBram Moolenaar <Bram@vim.org>
Tue, 18 Sep 2018 19:20:26 +0000 (21:20 +0200)
committerBram Moolenaar <Bram@vim.org>
Tue, 18 Sep 2018 19:20:26 +0000 (21:20 +0200)
Problem:    The DiffUpdate event isn't triggered for :diffput.
Solution:   Also trigger DiffUpdate for :diffget and :diffput.

src/diff.c
src/version.c

index d523e7743a9e584eb4470465752c139b1fe3fb4a..d63bd9373f9849c605221b560ff4ed3a5c45d272 100644 (file)
@@ -295,7 +295,7 @@ diff_mark_adjust_tp(
 
     if (diff_internal())
     {
-       // Will udpate diffs before redrawing.  Set _invalid to update the
+       // Will update diffs before redrawing.  Set _invalid to update the
        // diffs themselves, set _update to also update folds properly just
        // before redrawing.
        tp->tp_diff_invalid = TRUE;
@@ -908,6 +908,7 @@ ex_diffupdate(exarg_T *eap) // "eap" can be NULL
     int                idx_orig;
     int                idx_new;
     diffio_T   diffio;
+    int                had_diffs = curtab->tp_first_diff != NULL;
 
     if (diff_busy)
     {
@@ -924,14 +925,14 @@ ex_diffupdate(exarg_T *eap)       // "eap" can be NULL
        if (curtab->tp_diffbuf[idx_orig] != NULL)
            break;
     if (idx_orig == DB_COUNT)
-       return;
+       goto theend;
 
     // Only need to do something when there is another buffer.
     for (idx_new = idx_orig + 1; idx_new < DB_COUNT; ++idx_new)
        if (curtab->tp_diffbuf[idx_new] != NULL)
            break;
     if (idx_new == DB_COUNT)
-       return;
+       goto theend;
 
     // Only use the internal method if it did not fail for one of the buffers.
     vim_memset(&diffio, 0, sizeof(diffio));
@@ -948,9 +949,14 @@ ex_diffupdate(exarg_T *eap)        // "eap" can be NULL
     // force updating cursor position on screen
     curwin->w_valid_cursor.lnum = 0;
 
-    diff_redraw(TRUE);
-
-    apply_autocmds(EVENT_DIFFUPDATED, NULL, NULL, FALSE, curbuf);
+theend:
+    // A redraw is needed if there were diffs and they were cleared, or there
+    // are diffs now, which means they got updated.
+    if (had_diffs || curtab->tp_first_diff != NULL)
+    {
+       diff_redraw(TRUE);
+       apply_autocmds(EVENT_DIFFUPDATED, NULL, NULL, FALSE, curbuf);
+    }
 }
 
 /*
@@ -2272,7 +2278,8 @@ diffopt_changed(void)
     if ((diff_flags_new & DIFF_HORIZONTAL) && (diff_flags_new & DIFF_VERTICAL))
        return FAIL;
 
-    /* If "icase" or "iwhite" was added or removed, need to update the diff. */
+    // If flags were added or removed, or the algorithm was changed, need to
+    // update the diff.
     if (diff_flags != diff_flags_new || diff_algorithm != diff_algorithm_new)
        FOR_ALL_TABPAGES(tp)
            tp->tp_diff_invalid = TRUE;
@@ -2845,14 +2852,18 @@ theend:
        diff_need_update = FALSE;
        ex_diffupdate(NULL);
     }
+    else
+    {
+       // Check that the cursor is on a valid character and update it's
+       // position.  When there were filler lines the topline has become
+       // invalid.
+       check_cursor();
+       changed_line_abv_curs();
 
-    /* Check that the cursor is on a valid character and update it's position.
-     * When there were filler lines the topline has become invalid. */
-    check_cursor();
-    changed_line_abv_curs();
-
-    /* Also need to redraw the other buffers. */
-    diff_redraw(FALSE);
+       // Also need to redraw the other buffers.
+       diff_redraw(FALSE);
+       apply_autocmds(EVENT_DIFFUPDATED, NULL, NULL, FALSE, curbuf);
+    }
 }
 
 #ifdef FEAT_FOLDING
index 8195858c46bfbf1b6392b6f31010fc83089a989d..a8be96c4b3287deaffd6e96fb9be3910c5a8d515 100644 (file)
@@ -794,6 +794,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    402,
 /**/
     401,
 /**/