To: vim_dev@googlegroups.com Subject: Patch 8.1.0251 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ------------ 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 "" (/"") */ ! 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 "" (/"") */ ! 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 -- Bram@Moolenaar.net -- 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 ///