Patch 8.0.1305
Problem:    Writefile() never calls fsync().
Solution:   Follow the 'fsync' option with override to enable or disable.
Files:      src/fileio.c, src/evalfunc.c, runtime/doc/eval.txt, src/globals.h,
            src/testdir/test_writefile.vim


*** ../vim-8.0.1304/src/fileio.c        2017-11-16 17:03:41.956727768 +0100
--- src/fileio.c        2017-11-16 22:49:09.246257823 +0100
***************
*** 4771,4777 ****
         */
        if (p_fs && fsync(fd) != 0 && !device)
        {
!           errmsg = (char_u *)_("E667: Fsync failed");
            end = 0;
        }
  #endif
--- 4771,4777 ----
         */
        if (p_fs && fsync(fd) != 0 && !device)
        {
!           errmsg = (char_u *)_(e_fsync);
            end = 0;
        }
  #endif
*** ../vim-8.0.1304/src/evalfunc.c      2017-11-12 19:21:06.561379665 +0100
--- src/evalfunc.c      2017-11-16 23:01:10.771161654 +0100
***************
*** 13348,13353 ****
--- 13348,13356 ----
  {
      int               binary = FALSE;
      int               append = FALSE;
+ #ifdef HAVE_FSYNC
+     int               do_fsync = p_fs;
+ #endif
      char_u    *fname;
      FILE      *fd;
      int               ret = 0;
***************
*** 13380,13385 ****
--- 13383,13394 ----
            binary = TRUE;
        if (vim_strchr(arg2, 'a') != NULL)
            append = TRUE;
+ #ifdef HAVE_FSYNC
+       if (vim_strchr(arg2, 's') != NULL)
+           do_fsync = TRUE;
+       else if (vim_strchr(arg2, 'S') != NULL)
+           do_fsync = FALSE;
+ #endif
      }
  
      fname = get_tv_string_chk(&argvars[1]);
***************
*** 13398,13403 ****
--- 13407,13416 ----
      {
        if (write_list(fd, list, binary) == FAIL)
            ret = -1;
+ #ifdef HAVE_FSYNC
+       else if (do_fsync && fsync(fileno(fd)) != 0)
+           EMSG(_(e_fsync));
+ #endif
        fclose(fd);
      }
  
*** ../vim-8.0.1304/runtime/doc/eval.txt        2017-11-12 19:21:06.553379784 
+0100
--- runtime/doc/eval.txt        2017-11-16 22:42:50.768073457 +0100
***************
*** 8736,8743 ****
                appended to the file: >
                        :call writefile(["foo"], "event.log", "a")
                        :call writefile(["bar"], "event.log", "a")
! >
! <             All NL characters are replaced with a NUL character.
                Inserting CR characters needs to be done before passing {list}
                to writefile().
                An existing file is overwritten, if possible.
--- 8762,8778 ----
                appended to the file: >
                        :call writefile(["foo"], "event.log", "a")
                        :call writefile(["bar"], "event.log", "a")
! <
!               When {flags} contains "s" then fsync() is called after writing
!               the file.  This flushes the file to disk, if possible.  This
!               takes more time but avoids losing the file if the system
!               crashes.
!               When {flags} does not contain "S" or "s" then fsync is called
!               if the 'fsync' option is set.
!               When {flags} contains "S" then fsync() is not called, even
!               when 'fsync' is set.
! 
!               All NL characters are replaced with a NUL character.
                Inserting CR characters needs to be done before passing {list}
                to writefile().
                An existing file is overwritten, if possible.
*** ../vim-8.0.1304/src/globals.h       2017-10-28 21:08:38.979457009 +0200
--- src/globals.h       2017-11-16 22:48:28.786879760 +0100
***************
*** 1449,1454 ****
--- 1449,1457 ----
  #ifdef FEAT_LIBCALL
  EXTERN char_u e_libcall[]     INIT(= N_("E364: Library call failed for 
\"%s()\""));
  #endif
+ #ifdef HAVE_FSYNC
+ EXTERN char_u e_fsync[]               INIT(= N_("E667: Fsync failed"));
+ #endif
  #if defined(DYNAMIC_PERL) \
        || defined(DYNAMIC_PYTHON) || defined(DYNAMIC_PYTHON3) \
        || defined(DYNAMIC_RUBY) \
*** ../vim-8.0.1304/src/testdir/test_writefile.vim      2017-10-14 
16:06:16.094677647 +0200
--- src/testdir/test_writefile.vim      2017-11-16 23:00:09.908097885 +0100
***************
*** 93,95 ****
--- 93,102 ----
    endif
    bwipe Xfile
  endfunc
+ 
+ func Test_writefile_sync_arg()
+   " This doesn't check if fsync() works, only that the argument is accepted.
+   call writefile(['one'], 'Xtest', 's')
+   call writefile(['two'], 'Xtest', 'S')
+   call delete('Xtest')
+ endfunc
*** ../vim-8.0.1304/src/version.c       2017-11-16 22:20:35.028615026 +0100
--- src/version.c       2017-11-16 22:36:57.233498366 +0100
***************
*** 768,769 ****
--- 768,771 ----
  {   /* Add new patch number below this line */
+ /**/
+     1305,
  /**/

-- 
I used to be indecisive, now I'm not sure.

 /// Bram Moolenaar -- [email protected] -- http://www.Moolenaar.net   \\\
///        sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
\\\  an exciting new programming language -- http://www.Zimbu.org        ///
 \\\            help me help AIDS victims -- http://ICCF-Holland.org    ///

-- 
-- 
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php

--- 
You received this message because you are subscribed to the Google Groups 
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/d/optout.

Raspunde prin e-mail lui