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.