]> granicus.if.org Git - vim/commitdiff
Do not write an undo file if there is nothing to undo.
authorBram Moolenaar <Bram@vim.org>
Sun, 30 May 2010 15:17:42 +0000 (17:17 +0200)
committerBram Moolenaar <Bram@vim.org>
Sun, 30 May 2010 15:17:42 +0000 (17:17 +0200)
runtime/doc/todo.txt
src/undo.c

index dd55ae3e95cb241deb1b3a5d5ff4d0c4c9100796..f79148f7aa026f75bc8b4052f73585663a7887cb 100644 (file)
@@ -1093,9 +1093,6 @@ Vim 7.3:
    Use register_shell_extension()? (George Reilly, 2010 May 26)
    Ron's version: http://dev.ronware.org/p/vim/finfo?name=gvim.nsi
 - Persistent undo bugs / fixes:
-    - Memory leak reproduced by Dominique Pelle, 2010 May 28.
-    - When there is no undo info (undolevels negative), delete the undo file.
-      Already done?
     - Need to check all values for evil manipulation.
     - Add undofile(name): get undo file name for buffer "name".
 - patch for unused functions. (Dominique Pelle, 2010 May 29)
index cb51c996c22e6c52e5c996d22a73ee94abaceca9..88c030565f30bc4892a85e209f95f5c06ce5ed61 100644 (file)
@@ -998,7 +998,12 @@ u_write_undo(name, forceit, buf, hash)
        if (file_name == NULL)
        {
            if (p_verbose > 0)
-               smsg((char_u *)_("Cannot write undo file in any directory in 'undodir'"));
+           {
+               verbose_enter();
+               smsg((char_u *)
+                  _("Cannot write undo file in any directory in 'undodir'"));
+               verbose_leave();
+           }
            return;
        }
     }
@@ -1040,8 +1045,15 @@ u_write_undo(name, forceit, buf, hash)
            if (fd < 0)
            {
                if (name != NULL || p_verbose > 0)
-                   smsg((char_u *)_("Will not overwrite with undo file, cannot read: %s"),
+               {
+                   if (name == NULL)
+                       verbose_enter();
+                   smsg((char_u *)
+                     _("Will not overwrite with undo file, cannot read: %s"),
                                                                   file_name);
+                   if (name == NULL)
+                       verbose_leave();
+               }
                goto theend;
            }
            else
@@ -1055,8 +1067,14 @@ u_write_undo(name, forceit, buf, hash)
                      || memcmp(buf, UF_START_MAGIC, UF_START_MAGIC_LEN) != 0)
                {
                    if (name != NULL || p_verbose > 0)
+                   {
+                       if (name == NULL)
+                           verbose_enter();
                        smsg((char_u *)_("Will not overwrite, this is not an undo file: %s"),
                                                                   file_name);
+                       if (name == NULL)
+                           verbose_leave();
+                   }
                    goto theend;
                }
            }
@@ -1064,6 +1082,15 @@ u_write_undo(name, forceit, buf, hash)
        mch_remove(file_name);
     }
 
+    /* If there is no undo information at all, quit here after deleting any
+     * existing undo file. */
+    if (buf->b_u_numhead == 0)
+    {
+       if (p_verbose > 0)
+           verb_msg((char_u *)_("Skipping undo file write, noting to undo"));
+       goto theend;
+    }
+
     fd = mch_open((char *)file_name,
                            O_CREAT|O_EXTRA|O_WRONLY|O_EXCL|O_NOFOLLOW, perm);
     if (fd < 0)
@@ -1073,10 +1100,14 @@ u_write_undo(name, forceit, buf, hash)
     }
     (void)mch_setperm(file_name, perm);
     if (p_verbose > 0)
+    {
+       verbose_enter();
        smsg((char_u *)_("Writing undo file: %s"), file_name);
+       verbose_leave();
+    }
 
 #ifdef U_DEBUG
-    /* Check if there already is a problem before writing. */
+    /* Check there is no problem in undo info before writing. */
     u_check(FALSE);
 #endif
 
@@ -1290,7 +1321,11 @@ u_read_undo(name, hash)
         file_name = name;
 
     if (p_verbose > 0)
+    {
+       verbose_enter();
        smsg((char_u *)_("Reading undo file: %s"), file_name);
+       verbose_leave();
+    }
     fp = mch_fopen((char *)file_name, "r");
     if (fp == NULL)
     {
@@ -1326,9 +1361,11 @@ u_read_undo(name, hash)
     {
         if (p_verbose > 0 || name != NULL)
         {
-            verbose_enter();
+           if (name == NULL)
+               verbose_enter();
             give_warning((char_u *)_("File contents changed, cannot use undo info"), TRUE);
-            verbose_leave();
+           if (name == NULL)
+               verbose_leave();
         }
         goto error;
     }