# HG changeset patch # User Christian Brabandt # Date 1486307704 -3600 # Node ID 437cf0fe2138e20500f4e02bde80b7e8f134017f # Parent 09caff8682c43869e081e165df92fa54f82cfb79 patch 8.0.0308: 'runtimepath' not update correctly when using symbolic link commit https://github.com/vim/vim/commit/2f9e575583c2ad3978ee3d0f790eeff7df56bd6c Author: Bram Moolenaar Date: Sun Feb 5 16:07:54 2017 +0100 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) diff --git a/src/ex_cmds2.c b/src/ex_cmds2.c --- a/src/ex_cmds2.c +++ b/src/ex_cmds2.c @@ -3509,6 +3509,9 @@ add_pack_plugin(char_u *fname, void *coo 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 *coo /* 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) + 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 = vim_strchr(insp, ','); - if (insp == NULL) - 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 *coo 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 *coo } theend: + vim_free(buf); vim_free(ffname); } diff --git a/src/testdir/test_packadd.vim b/src/testdir/test_packadd.vim --- 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 --- 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,