changeset 16694:ed9b15758241 v8.1.1349

patch 8.1.1349: if writing runs into conversion error backup file is deleted commit https://github.com/vim/vim/commit/cf0bfd9ade5173bcc12563bfc90c21a4db10535d Author: Bram Moolenaar <Bram@vim.org> Date: Sat May 18 18:52:04 2019 +0200 patch 8.1.1349: if writing runs into conversion error backup file is deleted Problem: If writing runs into a conversion error the backup file is deleted. (Arseny Nasokin) Solution: Don't delete the backup file is the file was overwritten and a conversion error occurred. (Christian Brabandt, closes #4387)
author Bram Moolenaar <Bram@vim.org>
date Sat, 18 May 2019 19:00:05 +0200
parents 66aafdc47517
children bb8d2ba5f265
files src/fileio.c src/testdir/test_writefile.vim src/version.c
diffstat 3 files changed, 30 insertions(+), 5 deletions(-) [+]
line wrap: on
line diff
--- a/src/fileio.c
+++ b/src/fileio.c
@@ -4985,10 +4985,10 @@ restore_backup:
 	}
     }
 
-    /*
-     * Remove the backup unless 'backup' option is set
-     */
-    if (!p_bk && backup != NULL && mch_remove(backup) != 0)
+    // Remove the backup unless 'backup' option is set or there was a
+    // conversion error.
+    if (!p_bk && backup != NULL && !write_info.bw_conv_error
+	    && mch_remove(backup) != 0)
 	emsg(_("E207: Can't delete backup file"));
 
     goto nofail;
--- a/src/testdir/test_writefile.vim
+++ b/src/testdir/test_writefile.vim
@@ -36,13 +36,15 @@ func Test_writefile_fails_conversion()
   if !has('iconv') || has('sun')
     return
   endif
+  " Without a backup file the write won't happen if there is a conversion
+  " error.
   set nobackup nowritebackup
   new
   let contents = ["line one", "line two"]
   call writefile(contents, 'Xfile')
   edit Xfile
   call setline(1, ["first line", "cannot convert \u010b", "third line"])
-  call assert_fails('write ++enc=cp932')
+  call assert_fails('write ++enc=cp932', 'E513:')
   call assert_equal(contents, readfile('Xfile'))
 
   call delete('Xfile')
@@ -50,6 +52,27 @@ func Test_writefile_fails_conversion()
   set backup& writebackup&
 endfunc
 
+func Test_writefile_fails_conversion2()
+  if !has('iconv') || has('sun')
+    return
+  endif
+  " With a backup file the write happens even if there is a conversion error,
+  " but then the backup file must remain
+  set nobackup writebackup
+  let contents = ["line one", "line two"]
+  call writefile(contents, 'Xfile_conversion_err')
+  edit Xfile_conversion_err
+  call setline(1, ["first line", "cannot convert \u010b", "third line"])
+  set fileencoding=latin1
+  let output = execute('write')
+  call assert_match('CONVERSION ERROR', output)
+  call assert_equal(contents, readfile('Xfile_conversion_err~'))
+
+  call delete('Xfile_conversion_err')
+  call delete('Xfile_conversion_err~')
+  bwipe!
+endfunc
+
 func SetFlag(timer)
   let g:flag = 1
 endfunc
--- a/src/version.c
+++ b/src/version.c
@@ -768,6 +768,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    1349,
+/**/
     1348,
 /**/
     1347,