Patch 8.1.0251
Problem:    Using a full path is supported for 'directory' but not for
            'backupdir'. (Mikolaj Machowski)
Solution:   Support 'backupdir' as well. (Christian Brabandt, closes #179)
Files:      runtime/doc/options.txt, src/fileio.c, src/memline.c,
            src/proto/memline.pro, src/testdir/test_alot.vim,
            src/testdir/test_backup.vim, src/Make_all.mak


*** ../vim-8.1.0250/runtime/doc/options.txt     2018-06-23 19:22:45.598486362 
+0200
--- runtime/doc/options.txt     2018-08-07 21:04:11.238964573 +0200
***************
*** 1052,1057 ****
--- 1054,1067 ----
          name, precede it with a backslash.
        - To include a comma in a directory name precede it with a backslash.
        - A directory name may end in an '/'.
+       - For Unix and Win32, if a directory ends in two path separators "//",
+         the swap file name will be built from the complete path to the file
+         with all path separators changed to percent '%' signs. This will
+         ensure file name uniqueness in the backup directory.
+         On Win32, it is also possible to end with "\\".  However, When a
+         separating comma is following, you must use "//", since "\\" will
+         include the comma in the file name. Therefore it is recommended to
+         use '//', instead of '\\'.
        - Environment variables are expanded |:set_env|.
        - Careful with '\' characters, type one before a space, type two to
          get one in the option (see |option-backslash|), for example: >
***************
*** 2678,2689 ****
        - A directory starting with "./" (or ".\" for MS-DOS et al.) means to
          put the swap file relative to where the edited file is.  The leading
          "." is replaced with the path name of the edited file.
!       - For Unix and Win32, if a directory ends in two path separators "//"
!         or "\\", the swap file name will be built from the complete path to
!         the file with all path separators substituted to percent '%' signs.
!         This will ensure file name uniqueness in the preserve directory.
!         On Win32, when a separating comma is following, you must use "//",
!         since "\\" will include the comma in the file name.
        - Spaces after the comma are ignored, other spaces are considered part
          of the directory name.  To have a space at the start of a directory
          name, precede it with a backslash.
--- 2688,2701 ----
        - A directory starting with "./" (or ".\" for MS-DOS et al.) means to
          put the swap file relative to where the edited file is.  The leading
          "." is replaced with the path name of the edited file.
!       - For Unix and Win32, if a directory ends in two path separators "//",
!         the swap file name will be built from the complete path to the file
!         with all path separators substituted to percent '%' signs. This will
!         ensure file name uniqueness in the preserve directory.
!         On Win32, it is also possible to end with "\\".  However, When a
!         separating comma is following, you must use "//", since "\\" will
!         include the comma in the file name. Therefore it is recommended to
!         use '//', instead of '\\'.
        - Spaces after the comma are ignored, other spaces are considered part
          of the directory name.  To have a space at the start of a directory
          name, precede it with a backslash.
*** ../vim-8.1.0250/src/fileio.c        2018-08-01 17:53:04.689381294 +0200
--- src/fileio.c        2018-08-07 21:36:54.903803767 +0200
***************
*** 3850,3855 ****
--- 3850,3858 ----
            stat_T      st_new;
            char_u      *dirp;
            char_u      *rootname;
+ #if defined(UNIX) || defined(WIN3264)
+           char_u      *p;
+ #endif
  #if defined(UNIX)
            int         did_set_shortname;
            mode_t      umask_save;
***************
*** 3887,3892 ****
--- 3890,3906 ----
                 * Isolate one directory name, using an entry in 'bdir'.
                 */
                (void)copy_option_part(&dirp, copybuf, BUFSIZE, ",");
+ 
+ #if defined(UNIX) || defined(WIN3264)
+               p = copybuf + STRLEN(copybuf);
+               if (after_pathsep(copybuf, p) && p[-1] == p[-2])
+                   // Ends with '//', use full path
+                   if ((p = make_percent_swname(copybuf, fname)) != NULL)
+                   {
+                       backup = modname(p, backup_ext, FALSE);
+                       vim_free(p);
+                   }
+ #endif
                rootname = get_file_in_dir(fname, copybuf);
                if (rootname == NULL)
                {
***************
*** 3904,3912 ****
                for (;;)
                {
                    /*
!                    * Make backup file name.
                     */
!                   backup = buf_modname((buf->b_p_sn || buf->b_shortname),
                                                 rootname, backup_ext, FALSE);
                    if (backup == NULL)
                    {
--- 3918,3927 ----
                for (;;)
                {
                    /*
!                    * Make the backup file name.
                     */
!                   if (backup == NULL)
!                       backup = buf_modname((buf->b_p_sn || buf->b_shortname),
                                                 rootname, backup_ext, FALSE);
                    if (backup == NULL)
                    {
***************
*** 4108,4121 ****
                 * Isolate one directory name and make the backup file name.
                 */
                (void)copy_option_part(&dirp, IObuff, IOSIZE, ",");
!               rootname = get_file_in_dir(fname, IObuff);
!               if (rootname == NULL)
!                   backup = NULL;
!               else
                {
!                   backup = buf_modname((buf->b_p_sn || buf->b_shortname),
!                                                rootname, backup_ext, FALSE);
!                   vim_free(rootname);
                }
  
                if (backup != NULL)
--- 4123,4151 ----
                 * Isolate one directory name and make the backup file name.
                 */
                (void)copy_option_part(&dirp, IObuff, IOSIZE, ",");
! 
! #if defined(UNIX) || defined(WIN3264)
!               p = IObuff + STRLEN(IObuff);
!               if (after_pathsep(IObuff, p) && p[-1] == p[-2])
!                   // path ends with '//', use full path
!                   if ((p = make_percent_swname(IObuff, fname)) != NULL)
!                   {
!                       backup = modname(p, backup_ext, FALSE);
!                       vim_free(p);
!                   }
! #endif
!               if (backup == NULL)
                {
!                   rootname = get_file_in_dir(fname, IObuff);
!                   if (rootname == NULL)
!                       backup = NULL;
!                   else
!                   {
!                       backup = buf_modname(
!                               (buf->b_p_sn || buf->b_shortname),
!                                               rootname, backup_ext, FALSE);
!                       vim_free(rootname);
!                   }
                }
  
                if (backup != NULL)
***************
*** 6252,6258 ****
  #endif
  
  /*
!  * add extension to file name - change path/fo.o.h to path/fo.o.h.ext or
   * fo_o_h.ext for MSDOS or when shortname option set.
   *
   * Assumed that fname is a valid name found in the filesystem we assure that
--- 6282,6288 ----
  #endif
  
  /*
!  * Add extension to file name - change path/fo.o.h to path/fo.o.h.ext or
   * fo_o_h.ext for MSDOS or when shortname option set.
   *
   * Assumed that fname is a valid name found in the filesystem we assure that
*** ../vim-8.1.0250/src/memline.c       2018-05-26 17:35:19.717625256 +0200
--- src/memline.c       2018-08-07 21:32:43.441160597 +0200
***************
*** 262,270 ****
  #endif
  static void long_to_char(long, char_u *);
  static long char_to_long(char_u *);
- #if defined(UNIX) || defined(WIN3264)
- static char_u *make_percent_swname(char_u *dir, char_u *name);
- #endif
  #ifdef FEAT_CRYPT
  static cryptstate_T *ml_crypt_prepare(memfile_T *mfp, off_T offset, int 
reading);
  #endif
--- 262,267 ----
***************
*** 2007,2024 ****
      return file_count;
  }
  
! #if defined(UNIX) || defined(WIN3264)  /* Need _very_ long file names */
  /*
   * Append the full path to name with path separators made into percent
   * signs, to dir. An unnamed buffer is handled as "" (<currentdir>/"")
   */
!     static char_u *
  make_percent_swname(char_u *dir, char_u *name)
  {
!     char_u *d, *s, *f;
  
!     f = fix_fname(name != NULL ? name : (char_u *) "");
!     d = NULL;
      if (f != NULL)
      {
        s = alloc((unsigned)(STRLEN(f) + 1));
--- 2004,2021 ----
      return file_count;
  }
  
! #if defined(UNIX) || defined(WIN3264) || defined(PROTO)
  /*
+  * Need _very_ long file names.
   * Append the full path to name with path separators made into percent
   * signs, to dir. An unnamed buffer is handled as "" (<currentdir>/"")
   */
!     char_u *
  make_percent_swname(char_u *dir, char_u *name)
  {
!     char_u *d = NULL, *s, *f;
  
!     f = fix_fname(name != NULL ? name : (char_u *)"");
      if (f != NULL)
      {
        s = alloc((unsigned)(STRLEN(f) + 1));
***************
*** 4070,4077 ****
  }
  
  #if defined(FEAT_EVAL)
- static int do_swapexists(buf_T *buf, char_u *fname);
- 
  /*
   * Trigger the SwapExists autocommands.
   * Returns a value for equivalent to do_dialog() (see below):
--- 4067,4072 ----
*** ../vim-8.1.0250/src/proto/memline.pro       2018-05-17 13:52:44.000000000 
+0200
--- src/proto/memline.pro       2018-08-07 20:56:46.217467718 +0200
***************
*** 34,37 ****
--- 34,38 ----
  void ml_decrypt_data(memfile_T *mfp, char_u *data, off_T offset, unsigned 
size);
  long ml_find_line_or_offset(buf_T *buf, linenr_T lnum, long *offp);
  void goto_byte(long cnt);
+ char_u *make_percent_swname (char_u *dir, char_u *name);
  /* vim: set ft=c : */
*** ../vim-8.1.0250/src/testdir/test_alot.vim   2018-07-23 04:11:37.648969780 
+0200
--- src/testdir/test_alot.vim   2018-08-07 20:57:34.725202003 +0200
***************
*** 2,7 ****
--- 2,8 ----
  " This makes testing go faster, since Vim doesn't need to restart.
  
  source test_assign.vim
+ source test_backup.vim
  source test_bufline.vim
  source test_cd.vim
  source test_changedtick.vim
*** ../vim-8.1.0250/src/testdir/test_backup.vim 2018-08-07 21:37:56.879462014 
+0200
--- src/testdir/test_backup.vim 2018-08-07 21:21:16.656940451 +0200
***************
*** 0 ****
--- 1,58 ----
+ " Tests for the backup function
+ 
+ func Test_backup()
+   set backup backupdir=.
+   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
+   let l = readfile('Xbackup.txt~')
+   call assert_equal(['line1', 'line2'], l)
+   bw!
+   set backup&vim backupdir&vim
+   call delete('Xbackup.txt')
+   call delete('Xbackup.txt~')
+ endfunc
+ 
+ func Test_backup2()
+   set backup backupdir=.//
+   new
+   call setline(1, ['line1', 'line2', 'line3'])
+   :f Xbackup.txt
+   :w! Xbackup.txt
+   " backup file is only created after
+   " writing a second time (before overwriting)
+   :w! Xbackup.txt
+   sp *Xbackup.txt~
+   call assert_equal(['line1', 'line2', 'line3'], getline(1,'$'))
+   let f=expand('%')
+   call assert_match('src%testdir%Xbackup.txt\~', f)
+   bw!
+   bw!
+   call delete('Xbackup.txt')
+   call delete(f)
+   set backup&vim backupdir&vim
+ endfunc
+ 
+ func Test_backup2_backupcopy()
+   set backup backupdir=.// backupcopy=yes
+   new
+   call setline(1, ['line1', 'line2', 'line3'])
+   :f Xbackup.txt
+   :w! Xbackup.txt
+   " backup file is only created after
+   " writing a second time (before overwriting)
+   :w! Xbackup.txt
+   sp *Xbackup.txt~
+   call assert_equal(['line1', 'line2', 'line3'], getline(1,'$'))
+   let f=expand('%')
+   call assert_match('src%testdir%Xbackup.txt\~', f)
+   bw!
+   bw!
+   call delete('Xbackup.txt')
+   call delete(f)
+   set backup&vim backupdir&vim backupcopy&vim
+ endfunc
*** ../vim-8.1.0250/src/Make_all.mak    2018-07-23 04:11:37.644969804 +0200
--- src/Make_all.mak    2018-08-07 21:17:31.690274783 +0200
***************
*** 12,17 ****
--- 12,18 ----
        test_autocmd \
        test_autoload \
        test_backspace_opt \
+       test_backup \
        test_blockedit \
        test_breakindent \
        test_bufline \
*** ../vim-8.1.0250/src/version.c       2018-08-07 20:47:02.756848221 +0200
--- src/version.c       2018-08-07 20:59:39.444509393 +0200
***************
*** 796,797 ****
--- 796,799 ----
  {   /* Add new patch number below this line */
+ /**/
+     251,
  /**/

-- 
TALL KNIGHT: When you have found the shrubbery, then you must cut down the
             mightiest tree in the forest ... with a herring.
                 "Monty Python and the Holy Grail" PYTHON (MONTY) PICTURES LTD

 /// 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