patch 8.1.0161: buffer not updated with 'autoread' set if file was deleted
Problem: Buffer not updated with 'autoread' set if file was deleted.
(Michael Naumann)
Solution: Don't set the timestamp to zero. (closes #3165)
diff --git a/src/fileio.c b/src/fileio.c
index 0c56a1e..07b241e 100644
--- a/src/fileio.c
+++ b/src/fileio.c
@@ -6923,11 +6923,13 @@
{
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;
}
diff --git a/src/testdir/test_stat.vim b/src/testdir/test_stat.vim
index de5fac4..307cf5e 100644
--- a/src/testdir/test_stat.vim
+++ b/src/testdir/test_stat.vim
@@ -46,6 +46,15 @@
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 @@
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 @@
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'
diff --git a/src/version.c b/src/version.c
index cb6d2c8..affeeb2 100644
--- a/src/version.c
+++ b/src/version.c
@@ -790,6 +790,8 @@
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 161,
+/**/
160,
/**/
159,