changeset 2235:4ba83ae8d505 vim73

Do not write an undo file if there is nothing to undo.
author Bram Moolenaar <bram@vim.org>
date Sun, 30 May 2010 17:17:42 +0200
parents 3b241fd8d7c0
children dc2e5ec0500d
files runtime/doc/todo.txt src/undo.c
diffstat 2 files changed, 42 insertions(+), 8 deletions(-) [+]
line wrap: on
line diff
--- a/runtime/doc/todo.txt
+++ b/runtime/doc/todo.txt
@@ -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)
--- a/src/undo.c
+++ b/src/undo.c
@@ -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;
     }