diff options
author | Bram Moolenaar <Bram@vim.org> | 2017-02-05 16:07:54 +0100 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2017-02-05 16:07:54 +0100 |
commit | 2f9e575583c2ad3978ee3d0f790eeff7df56bd6c (patch) | |
tree | 94bb8b22f774a8605319032cdc3915d984384cfa /src | |
parent | 955f198fc546cc30a34361932d3f454a61df0efa (diff) | |
download | vim-git-2f9e575583c2ad3978ee3d0f790eeff7df56bd6c.tar.gz |
patch 8.0.0308: 'runtimepath' not update correctly when using symbolic linkv8.0.0308
Problem: When using a symbolic link, the package path will not be inserted
at the right position in 'runtimepath'. (Dugan Chen, Norio Takagi)
Solution: Resolve symbolic links when finding the right position in
'runtimepath'. (Hirohito Higashi)
Diffstat (limited to 'src')
-rw-r--r-- | src/ex_cmds2.c | 33 | ||||
-rw-r--r-- | src/testdir/test_packadd.vim | 33 | ||||
-rw-r--r-- | src/version.c | 2 |
3 files changed, 55 insertions, 13 deletions
diff --git a/src/ex_cmds2.c b/src/ex_cmds2.c index 59dc4d597..5ecb1f3d6 100644 --- a/src/ex_cmds2.c +++ b/src/ex_cmds2.c @@ -3509,6 +3509,9 @@ add_pack_plugin(char_u *fname, void *cookie) size_t afterlen = 0; char_u *ffname = fix_fname(fname); size_t fname_len; + char_u *buf = NULL; + char_u *rtp_ffname; + int match; if (ffname == NULL) return; @@ -3533,26 +3536,28 @@ add_pack_plugin(char_u *fname, void *cookie) /* Find "ffname" in "p_rtp", ignoring '/' vs '\' differences. */ fname_len = STRLEN(ffname); insp = p_rtp; - for (;;) + buf = alloc(MAXPATHL); + if (buf == NULL) + goto theend; + while (*insp != NUL) { - if (vim_fnamencmp(insp, ffname, fname_len) == 0) - break; - insp = vim_strchr(insp, ','); - if (insp == NULL) + copy_option_part(&insp, buf, MAXPATHL, ","); + add_pathsep(buf); + rtp_ffname = fix_fname(buf); + if (rtp_ffname == NULL) + goto theend; + match = vim_fnamencmp(rtp_ffname, ffname, fname_len) == 0; + vim_free(rtp_ffname); + if (match) break; - ++insp; } - if (insp == NULL) + if (*insp == NUL) /* not found, append at the end */ insp = p_rtp + STRLEN(p_rtp); else - { /* append after the matching directory. */ - insp += STRLEN(ffname); - while (*insp != NUL && *insp != ',') - ++insp; - } + --insp; *p4 = c; /* check if rtp/pack/name/start/name/after exists */ @@ -3562,7 +3567,8 @@ add_pack_plugin(char_u *fname, void *cookie) oldlen = STRLEN(p_rtp); addlen = STRLEN(ffname) + 1; /* add one for comma */ - new_rtp = alloc((int)(oldlen + addlen + afterlen + 1)); /* add one for NUL */ + new_rtp = alloc((int)(oldlen + addlen + afterlen + 1)); + /* add one for NUL */ if (new_rtp == NULL) goto theend; keep = (int)(insp - p_rtp); @@ -3616,6 +3622,7 @@ add_pack_plugin(char_u *fname, void *cookie) } theend: + vim_free(buf); vim_free(ffname); } diff --git a/src/testdir/test_packadd.vim b/src/testdir/test_packadd.vim index eca1560f7..5433c9866 100644 --- a/src/testdir/test_packadd.vim +++ b/src/testdir/test_packadd.vim @@ -67,6 +67,39 @@ func Test_packadd_noload() call assert_equal(new_rtp, &rtp) endfunc +func Test_packadd_symlink_dir() + if !has('unix') + return + endif + let top2_dir = s:topdir . '/Xdir2' + let real_dir = s:topdir . '/Xsym' + silent !ln -s real_dir top2_dir + let &rtp = top2_dir . ',' . top2_dir . '/after' + let &packpath = &rtp + + let s:plugdir = top2_dir . '/pack/mine/opt/mytest' + call mkdir(s:plugdir . '/plugin', 'p') + + exe 'split ' . s:plugdir . '/plugin/test.vim' + call setline(1, 'let g:plugin_works = 44') + wq + let g:plugin_works = 0 + + packadd mytest + + " Must have been inserted in the middle, not at the end + call assert_true(&rtp =~ '/pack/mine/opt/mytest,') + call assert_equal(44, g:plugin_works) + + " No change when doing it again. + let rtp_before = &rtp + packadd mytest + call assert_equal(rtp_before, &rtp) + + set rtp& + let rtp = &rtp +endfunc + " Check command-line completion for 'packadd' func Test_packadd_completion() let optdir1 = &packpath . '/pack/mine/opt' diff --git a/src/version.c b/src/version.c index 5627b3db6..83e3b5316 100644 --- a/src/version.c +++ b/src/version.c @@ -765,6 +765,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 308, +/**/ 307, /**/ 306, |