]> granicus.if.org Git - vim/commitdiff
patch 8.1.0161: buffer not updated with 'autoread' set if file was deleted v8.1.0161
authorBram Moolenaar <Bram@vim.org>
Sat, 7 Jul 2018 16:34:12 +0000 (18:34 +0200)
committerBram Moolenaar <Bram@vim.org>
Sat, 7 Jul 2018 16:34:12 +0000 (18:34 +0200)
Problem:    Buffer not updated with 'autoread' set if file was deleted.
            (Michael Naumann)
Solution:   Don't set the timestamp to zero. (closes #3165)

src/fileio.c
src/testdir/test_stat.vim
src/version.c

index 0c56a1ef0f798f97d1ec9a951495edd8ab58216f..07b241ece5ee618162c02594ffe250185523ab28 100644 (file)
@@ -6923,11 +6923,13 @@ buf_check_timestamp(
     {
        retval = 1;
 
-       /* set b_mtime to stop further warnings (e.g., when executing
-        * FileChangedShell autocmd) */
+       // set b_mtime to stop further warnings (e.g., when executing
+       // FileChangedShell autocmd)
        if (stat_res < 0)
        {
-           buf->b_mtime = 0;
+           // When 'autoread' is set we'll check the file again to see if it
+           // re-appears.
+           buf->b_mtime = buf->b_p_ar;
            buf->b_orig_size = 0;
            buf->b_orig_mode = 0;
        }
index de5fac46fbc7ff7b51f2a59916b81808b74d2a61..307cf5e6402a197defd33440bf3ca094458a555b 100644 (file)
@@ -46,6 +46,15 @@ func Test_existent_directory()
   call assert_equal('rwx', getfperm(dname)[0:2])
 endfunc
 
+func SleepForTimestamp()
+  " FAT has a granularity of 2 seconds, otherwise it's usually 1 second
+  if has('win32')
+    sleep 2
+  else
+    sleep 1
+  endif
+endfunc
+
 func Test_checktime()
   let fname = 'Xtest.tmp'
 
@@ -53,12 +62,7 @@ func Test_checktime()
   call writefile(fl, fname)
   set autoread
   exec 'e' fname
-  " FAT has a granularity of 2 seconds, otherwise it's usually 1 second
-  if has('win32')
-    sleep 2
-  else
-    sleep 1
-  endif
+  call SleepForTimestamp()
   let fl = readfile(fname)
   let fl[0] .= ' - checktime'
   call writefile(fl, fname)
@@ -68,6 +72,46 @@ func Test_checktime()
   call delete(fname)
 endfunc
 
+func Test_autoread_file_deleted()
+  new Xautoread
+  set autoread
+  call setline(1, 'original')
+  w!
+
+  call SleepForTimestamp()
+  if has('win32')
+    silent !echo changed > Xautoread
+  else
+    silent !echo 'changed' > Xautoread
+  endif
+  checktime
+  call assert_equal('changed', trim(getline(1)))
+
+  call SleepForTimestamp()
+  messages clear
+  if has('win32')
+    silent !del Xautoread
+  else
+    silent !rm Xautoread
+  endif
+  checktime
+  call assert_match('E211:', execute('messages'))
+  call assert_equal('changed', trim(getline(1)))
+
+  call SleepForTimestamp()
+  if has('win32')
+    silent !echo recreated > Xautoread
+  else
+    silent !echo 'recreated' > Xautoread
+  endif
+  checktime
+  call assert_equal('recreated', trim(getline(1)))
+
+  call delete('Xautoread')
+  bwipe!
+endfunc
+
+
 func Test_nonexistent_file()
   let fname = 'Xtest.tmp'
 
index cb6d2c8f530a3daadaaaf3add1e7b0aafb758e71..affeeb2245c139d72906e6ec81e3b544f242401a 100644 (file)
@@ -789,6 +789,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    161,
 /**/
     160,
 /**/