From 2f9e575583c2ad3978ee3d0f790eeff7df56bd6c Mon Sep 17 00:00:00 2001 From: Bram Moolenaar Date: Sun, 5 Feb 2017 16:07:54 +0100 Subject: patch 8.0.0308: 'runtimepath' not update correctly when using symbolic link 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) --- src/ex_cmds2.c | 33 ++++++++++++++++++++------------- src/testdir/test_packadd.vim | 33 +++++++++++++++++++++++++++++++++ src/version.c | 2 ++ 3 files changed, 55 insertions(+), 13 deletions(-) diff --git a/src/ex_cmds2.c b/src/ex_cmds2.c index 59dc4d5975..5ecb1f3d6b 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 eca1560f77..5433c9866d 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 5627b3db62..83e3b53160 100644 --- a/src/version.c +++ b/src/version.c @@ -764,6 +764,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 308, /**/ 307, /**/ -- cgit v1.2.3