]> granicus.if.org Git - vim/commitdiff
patch 8.2.1340: some tests fail on Cirrus CI and/or with FreeBSD v8.2.1340
authorBram Moolenaar <Bram@vim.org>
Sat, 1 Aug 2020 14:08:19 +0000 (16:08 +0200)
committerBram Moolenaar <Bram@vim.org>
Sat, 1 Aug 2020 14:08:19 +0000 (16:08 +0200)
Problem:    Some tests fail on Cirrus CI and/or with FreeBSD.
Solution:   Make 'backupskip' empty. Do not run tests as root. Check for
            directory when using viminfo. (Ozaki Kiichi, closes #6596)

.cirrus.yml
src/testdir/test_backup.vim
src/testdir/test_edit.vim
src/testdir/test_viminfo.vim
src/testdir/test_writefile.vim
src/version.c
src/viminfo.c

index 97fb0f1f6a559bcde75ff87dd94a51ce2c5a3f7b..a098789c59fead1a2717a6d9060d1175e90c8c7e 100644 (file)
@@ -11,6 +11,9 @@ freebsd_12_task:
     - NPROC=$(getconf _NPROCESSORS_ONLN)
     - ./configure --with-features=${FEATURES}
     - make -j${NPROC}
-    - src/vim --version
   test_script:
-    - make test
+    - src/vim --version
+      # run tests as user "cirrus" instead of root
+    - pw useradd cirrus -m
+    - chown -R cirrus:cirrus .
+    - sudo -u cirrus make test
index 0d3e79c22a18fe6fcad40af99b3dd11303b634a5..4c7abe8e56f11385e98ace15ddc4859c702fbec9 100644 (file)
@@ -19,6 +19,22 @@ func Test_backup()
   call delete('Xbackup.txt~')
 endfunc
 
+func Test_backup_backupskip()
+  set backup backupdir=. backupskip=*.txt
+  new
+  call setline(1, ['line1', 'line2'])
+  :f Xbackup.txt
+  :w! Xbackup.txt
+  " backup file is only created after
+  " writing a second time (before overwriting)
+  :w! Xbackup.txt
+  call assert_false(filereadable('Xbackup.txt~'))
+  bw!
+  set backup&vim backupdir&vim backupskip&vim
+  call delete('Xbackup.txt')
+  call delete('Xbackup.txt~')
+endfunc
+
 func Test_backup2()
   set backup backupdir=.// backupskip=
   new
@@ -30,7 +46,7 @@ func Test_backup2()
   :w! Xbackup.txt
   sp *Xbackup.txt~
   call assert_equal(['line1', 'line2', 'line3'], getline(1,'$'))
-  let f=expand('%')
+  let f = expand('%')
   call assert_match('%testdir%Xbackup.txt\~', f)
   bw!
   bw!
@@ -50,7 +66,7 @@ func Test_backup2_backupcopy()
   :w! Xbackup.txt
   sp *Xbackup.txt~
   call assert_equal(['line1', 'line2', 'line3'], getline(1,'$'))
-  let f=expand('%')
+  let f = expand('%')
   call assert_match('%testdir%Xbackup.txt\~', f)
   bw!
   bw!
@@ -61,14 +77,11 @@ endfunc
 
 " Test for using a non-existing directory as a backup directory
 func Test_non_existing_backupdir()
-  CheckNotBSD
-  let save_backup = &backupdir
-  set backupdir=./non_existing_dir
+  set backupdir=./non_existing_dir backupskip=
   call writefile(['line1'], 'Xfile')
   new Xfile
-  " TODO: write doesn't fail in Cirrus FreeBSD CI test
   call assert_fails('write', 'E510:')
-  let &backupdir = save_backup
+  set backupdir&vim backupskip&vim
   call delete('Xfile')
 endfunc
 
index 0200d9f56066ae5b9b209577dfe85663034a841a..5277d20b7362e551d2a87035359fe0f104199dfe 100644 (file)
@@ -1682,7 +1682,6 @@ endfunc
 " Test for editing a file without read permission
 func Test_edit_file_no_read_perm()
   CheckUnix
-  CheckNotBSD
   call writefile(['one', 'two'], 'Xfile')
   call setfperm('Xfile', '-w-------')
   new
index 258b472bb60a0c2cc3c8f870485ee8a799d0211d..bc8afa0e1fe060fd1f2aa4111e96b64c3e5828b9 100644 (file)
@@ -807,7 +807,7 @@ func Test_viminfo_perm()
 
   " Try to write the viminfo to a directory
   call mkdir('Xdir')
-  call assert_fails('wviminfo Xdir', 'E886:')
+  call assert_fails('wviminfo Xdir', 'E137:')
   call delete('Xdir', 'rf')
 endfunc
 
index d6e7e64c11beff197030e9f13e9400562a741a31..e58093074ca3b12785ac63531be8f6da8fbfe161 100644 (file)
@@ -136,9 +136,7 @@ func Test_writefile_sync_arg()
 endfunc
 
 func Test_writefile_sync_dev_stdout()
-  if !has('unix')
-    return
-  endif
+  CheckUnix
   if filewritable('/dev/stdout')
     " Just check that this doesn't cause an error.
     call writefile(['one'], '/dev/stdout')
@@ -371,13 +369,10 @@ endfunc
 
 " Test for writing to a readonly file
 func Test_write_readonly()
-  " In Cirrus-CI, the freebsd tests are run under a root account. So this test
-  " doesn't fail.
-  CheckNotBSD
   call writefile([], 'Xfile')
   call setfperm('Xfile', "r--------")
   edit Xfile
-  set noreadonly
+  set noreadonly backupskip=
   call assert_fails('write', 'E505:')
   let save_cpo = &cpo
   set cpo+=W
@@ -386,37 +381,32 @@ func Test_write_readonly()
   call setline(1, ['line1'])
   write!
   call assert_equal(['line1'], readfile('Xfile'))
+  set backupskip&
   call delete('Xfile')
 endfunc
 
 " Test for 'patchmode'
 func Test_patchmode()
-  CheckNotBSD
   call writefile(['one'], 'Xfile')
-  set patchmode=.orig nobackup writebackup
+  set patchmode=.orig nobackup backupskip= writebackup
   new Xfile
   call setline(1, 'two')
   " first write should create the .orig file
   write
-  " TODO: Xfile.orig is not created in Cirrus FreeBSD CI test
   call assert_equal(['one'], readfile('Xfile.orig'))
   call setline(1, 'three')
   " subsequent writes should not create/modify the .orig file
   write
   call assert_equal(['one'], readfile('Xfile.orig'))
-  set patchmode& backup& writebackup&
+  set patchmode& backup& backupskip& writebackup&
   call delete('Xfile')
   call delete('Xfile.orig')
 endfunc
 
 " Test for writing to a file in a readonly directory
 func Test_write_readonly_dir()
-  if !has('unix') || has('bsd')
-    " On MS-Windows, modifying files in a read-only directory is allowed.
-    " In Cirrus-CI for Freebsd, tests are run under a root account where
-    " modifying files in a read-only directory are allowed.
-    return
-  endif
+  " On MS-Windows, modifying files in a read-only directory is allowed.
+  CheckUnix
   call mkdir('Xdir')
   call writefile(['one'], 'Xdir/Xfile1')
   call setfperm('Xdir', 'r-xr--r--')
@@ -426,12 +416,12 @@ func Test_write_readonly_dir()
   call assert_fails('write', 'E212:')
   " try to create a backup file in the directory
   edit! Xdir/Xfile1
-  set backupdir=./Xdir
+  set backupdir=./Xdir backupskip=
   set patchmode=.orig
   call assert_fails('write', 'E509:')
   call setfperm('Xdir', 'rwxr--r--')
   call delete('Xdir', 'rf')
-  set backupdir& patchmode&
+  set backupdir& backupskip& patchmode&
 endfunc
 
 " Test for writing a file using invalid file encoding
index cc92f22e922b39e0f9dc839db2326fcc3b659af0..7026eebbea025623ea1195057e84fff5fba67b1f 100644 (file)
@@ -754,6 +754,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    1340,
 /**/
     1339,
 /**/
index 4f26348a226ab14873d4af668314f8f7be5725e7..74780c3d072a869bf8cd1e55f4fdda3c09937ca7 100644 (file)
@@ -3007,6 +3007,7 @@ read_viminfo(
 {
     FILE       *fp;
     char_u     *fname;
+    stat_T     st;             // mch_stat() of existing viminfo file
 
     if (no_viminfo())
        return FAIL;
@@ -3031,6 +3032,11 @@ read_viminfo(
     vim_free(fname);
     if (fp == NULL)
        return FAIL;
+    if (mch_fstat(fileno(fp), &st) < 0 || S_ISDIR(st.st_mode))
+    {
+       fclose(fp);
+       return FAIL;
+    }
 
     viminfo_errcnt = 0;
     do_viminfo(fp, NULL, flags);
@@ -3054,12 +3060,12 @@ write_viminfo(char_u *file, int forceit)
     FILE       *fp_out = NULL; // output viminfo file
     char_u     *tempname = NULL;       // name of temp viminfo file
     stat_T     st_new;         // mch_stat() of potential new file
+    stat_T     st_old;         // mch_stat() of existing viminfo file
 #if defined(UNIX) || defined(VMS)
     mode_t     umask_save;
 #endif
 #ifdef UNIX
     int                shortname = FALSE;      // use 8.3 file name
-    stat_T     st_old;         // mch_stat() of existing viminfo file
 #endif
 #ifdef MSWIN
     int                hidden = FALSE;
@@ -3097,20 +3103,20 @@ write_viminfo(char_u *file, int forceit)
        // write the new viminfo into, in the same directory as the
        // existing viminfo file, which will be renamed once all writing is
        // successful.
+       if (mch_fstat(fileno(fp_in), &st_old) < 0
+               || S_ISDIR(st_old.st_mode)
 #ifdef UNIX
-       // For Unix we check the owner of the file.  It's not very nice to
-       // overwrite a user's viminfo file after a "su root", with a
-       // viminfo file that the user can't read.
-       st_old.st_dev = (dev_t)0;
-       st_old.st_ino = 0;
-       st_old.st_mode = 0600;
-       if (mch_stat((char *)fname, &st_old) == 0
-               && getuid() != ROOT_UID
-               && !(st_old.st_uid == getuid()
-                       ? (st_old.st_mode & 0200)
-                       : (st_old.st_gid == getgid()
-                               ? (st_old.st_mode & 0020)
-                               : (st_old.st_mode & 0002))))
+               // For Unix we check the owner of the file.  It's not very nice
+               // to overwrite a user's viminfo file after a "su root", with a
+               // viminfo file that the user can't read.
+               || (getuid() != ROOT_UID
+                   && !(st_old.st_uid == getuid()
+                           ? (st_old.st_mode & 0200)
+                           : (st_old.st_gid == getgid()
+                                   ? (st_old.st_mode & 0020)
+                                   : (st_old.st_mode & 0002))))
+#endif
+               )
        {
            int tt = msg_didany;
 
@@ -3120,7 +3126,6 @@ write_viminfo(char_u *file, int forceit)
            fclose(fp_in);
            goto end;
        }
-#endif
 #ifdef MSWIN
        // Get the file attributes of the existing viminfo file.
        hidden = mch_ishidden(fname);