diff options
| -rw-r--r-- | src/nvim/ex_cmds2.c | 28 | ||||
| -rw-r--r-- | src/nvim/version.c | 2 | ||||
| -rw-r--r-- | test/functional/legacy/packadd_spec.lua | 38 | 
3 files changed, 56 insertions, 12 deletions
diff --git a/src/nvim/ex_cmds2.c b/src/nvim/ex_cmds2.c index 33fe30cd5a..f8c470f213 100644 --- a/src/nvim/ex_cmds2.c +++ b/src/nvim/ex_cmds2.c @@ -2498,6 +2498,7 @@ static int APP_BOTH;  static void add_pack_plugin(char_u *fname, void *cookie)  {    char_u *p4, *p3, *p2, *p1, *p; +  char_u *buf = NULL;    char *const ffname = fix_fname((char *)fname); @@ -2525,26 +2526,30 @@ static void add_pack_plugin(char_u *fname, void *cookie)      // Find "ffname" in "p_rtp", ignoring '/' vs '\' differences      size_t fname_len = strlen(ffname);      const char *insp = (const char *)p_rtp; -    for (;;) { -      if (path_fnamencmp(insp, ffname, fname_len) == 0) { -        break; +    buf = try_malloc(MAXPATHL); +    if (buf == NULL) { +      goto theend; +    } +    while (*insp != NUL) { +      copy_option_part((char_u **)&insp, buf, MAXPATHL, ","); +      add_pathsep((char *)buf); +      char *const rtp_ffname = fix_fname((char *)buf); +      if (rtp_ffname == NULL) { +        goto theend;        } -      insp = strchr(insp, ','); -      if (insp == NULL) { +      bool match = path_fnamencmp(rtp_ffname, ffname, fname_len) == 0; +      xfree(rtp_ffname); +      if (match) {          break;        } -      insp++;      } -    if (insp == NULL) { +    if (*insp == NUL) {        // not found, append at the end        insp = (const char *)p_rtp + STRLEN(p_rtp);      } else {        // append after the matching directory. -      insp += strlen(ffname); -      while (*insp != NUL && *insp != ',') { -        insp++; -      } +      insp--;      }      *p4 = c; @@ -2614,6 +2619,7 @@ static void add_pack_plugin(char_u *fname, void *cookie)    }  theend: +  xfree(buf);    xfree(ffname);  } diff --git a/src/nvim/version.c b/src/nvim/version.c index 2a3fdbd70d..a190293d8e 100644 --- a/src/nvim/version.c +++ b/src/nvim/version.c @@ -644,7 +644,7 @@ static const int included_patches[] = {    311,    // 310,    // 309, -  // 308, +  308,    307,    // 306,    // 305, diff --git a/test/functional/legacy/packadd_spec.lua b/test/functional/legacy/packadd_spec.lua index c280888dda..366a154f89 100644 --- a/test/functional/legacy/packadd_spec.lua +++ b/test/functional/legacy/packadd_spec.lua @@ -83,6 +83,39 @@ describe('packadd', function()          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 +        func Test_packloadall()          " plugin foo with an autoload directory          let fooplugindir = &packpath . '/pack/mine/start/foo/plugin' @@ -227,6 +260,11 @@ describe('packadd', function()      expected_empty()    end) +  it('works with symlinks', function() +    call('Test_packadd_symlink_dir') +    expected_empty() +  end) +    it('works with :packloadall', function()      call('Test_packloadall')      expected_empty()  | 
