summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2020-07-15 15:30:05 +0200
committerBram Moolenaar <Bram@vim.org>2020-07-15 15:30:05 +0200
commit5966ea105ea86e52a734e04267956e11efffc92d (patch)
tree0e71710e0dc53ff0590e05e947cfd1e6830550b0
parent3d48e25dcb661eb09ccdaa73d4e2559201ff2eb1 (diff)
downloadvim-git-5966ea105ea86e52a734e04267956e11efffc92d.tar.gz
patch 8.2.1219: symlink not followed if dirname ends in //v8.2.1219
Problem: Symlink not followed if dirname ends in //. Solution: Resolve symlink earlier. (Tomáš Janoušek, closes #6454)
-rw-r--r--src/memline.c18
-rw-r--r--src/testdir/test_swap.vim30
-rw-r--r--src/version.c2
3 files changed, 41 insertions, 9 deletions
diff --git a/src/memline.c b/src/memline.c
index 347b44d6a..084a8b0fa 100644
--- 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,
diff --git a/src/testdir/test_swap.vim b/src/testdir/test_swap.vim
index 7889d4b48..5cd101804 100644
--- 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
diff --git a/src/version.c b/src/version.c
index 44769fc50..eff78356b 100644
--- a/src/version.c
+++ b/src/version.c
@@ -755,6 +755,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 1219,
+/**/
1218,
/**/
1217,