Mercurial > vim
changeset 21337:647897e6df9e v8.2.1219
patch 8.2.1219: symlink not followed if dirname ends in //
Commit: https://github.com/vim/vim/commit/5966ea105ea86e52a734e04267956e11efffc92d
Author: Bram Moolenaar <Bram@vim.org>
Date: Wed Jul 15 15:30:05 2020 +0200
patch 8.2.1219: symlink not followed if dirname ends in //
Problem: Symlink not followed if dirname ends in //.
Solution: Resolve symlink earlier. (Tom?? Janou?ek, closes https://github.com/vim/vim/issues/6454)
author | Bram Moolenaar <Bram@vim.org> |
---|---|
date | Wed, 15 Jul 2020 15:45:03 +0200 |
parents | e622da2979a0 |
children | 84baaef59d19 |
files | src/memline.c src/testdir/test_swap.vim src/version.c |
diffstat | 3 files changed, 41 insertions(+), 9 deletions(-) [+] |
line wrap: on
line diff
--- a/src/memline.c +++ b/src/memline.c @@ -3287,10 +3287,12 @@ ml_append_buf( #endif /* - * Replace line lnum, with buffering, in current buffer. + * Replace line "lnum", with buffering, in current buffer. * * If "copy" is TRUE, make a copy of the line, otherwise the line has been * copied to allocated memory already. + * If "copy" is FALSE the "line" may be freed to add text properties! + * Do not use it after calling ml_replace(). * * Check: The caller of this function should probably also call * changed_lines(), unless update_screen(NOT_VALID) is used. @@ -4366,6 +4368,11 @@ makeswapname( char_u *fname_res = fname; #ifdef HAVE_READLINK char_u fname_buf[MAXPATHL]; + + // Expand symlink in the file name, so that we put the swap file with the + // actual file instead of with the symlink. + if (resolve_symlink(fname, fname_buf) == OK) + fname_res = fname_buf; #endif #if defined(UNIX) || defined(MSWIN) // Need _very_ long file names @@ -4375,7 +4382,7 @@ makeswapname( if (after_pathsep(dir_name, s) && len > 1 && s[-1] == s[-2]) { // Ends with '//', Use Full path r = NULL; - if ((s = make_percent_swname(dir_name, fname)) != NULL) + if ((s = make_percent_swname(dir_name, fname_res)) != NULL) { r = modname(s, (char_u *)".swp", FALSE); vim_free(s); @@ -4384,13 +4391,6 @@ makeswapname( } #endif -#ifdef HAVE_READLINK - // Expand symlink in the file name, so that we put the swap file with the - // actual file instead of with the symlink. - if (resolve_symlink(fname, fname_buf) == OK) - fname_res = fname_buf; -#endif - r = buf_modname( (buf->b_p_sn || buf->b_shortname), fname_res,
--- a/src/testdir/test_swap.vim +++ b/src/testdir/test_swap.vim @@ -377,4 +377,34 @@ func Test_swap_prompt_splitwin() call delete('Xfile1') endfunc +func Test_swap_symlink() + if !has("unix") + return + endif + + call writefile(['text'], 'Xtestfile') + silent !ln -s -f Xtestfile Xtestlink + + set dir=. + + " Test that swap file uses the name of the file when editing through a + " symbolic link (so that editing the file twice is detected) + edit Xtestlink + call assert_match('Xtestfile\.swp$', s:swapname()) + bwipe! + + call mkdir('Xswapdir') + exe 'set dir=' . getcwd() . '/Xswapdir//' + + " Check that this also works when 'directory' ends with '//' + edit Xtestlink + call assert_match('Xtestfile\.swp$', s:swapname()) + bwipe! + + set dir& + call delete('Xtestfile') + call delete('Xtestlink') + call delete('Xswapdir', 'rf') +endfunc + " vim: shiftwidth=2 sts=2 expandtab