# HG changeset patch # User Bram Moolenaar # Date 1275232662 -7200 # Node ID 4ba83ae8d5057b02979446461aef4a2c601d1297 # Parent 3b241fd8d7c09d7a93694a0abcdc283dcd6b4675 Do not write an undo file if there is nothing to undo. diff --git a/runtime/doc/todo.txt b/runtime/doc/todo.txt --- 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) diff --git a/src/undo.c b/src/undo.c --- 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; }