Patch 8.1.0353
Problem: An "after" directory of a package is appended to 'rtp', which
will be after the user's "after" directory. ()
Solution: Insert the package "after" directory before any other "after"
directory in 'rtp'. (closes #3409)
Files: src/ex_cmds2.c, src/testdir/test_packadd.vim
*** ../vim-8.1.0352/src/ex_cmds2.c 2018-08-31 23:06:18.735841246 +0200
--- src/ex_cmds2.c 2018-09-08 18:03:22.848808156 +0200
***************
*** 3691,3704 ****
add_pack_dir_to_rtp(char_u *fname)
{
char_u *p4, *p3, *p2, *p1, *p;
! char_u *insp;
int c;
char_u *new_rtp;
int keep;
size_t oldlen;
size_t addlen;
char_u *afterdir = NULL;
size_t afterlen = 0;
char_u *ffname = NULL;
size_t fname_len;
char_u *buf = NULL;
--- 3691,3707 ----
add_pack_dir_to_rtp(char_u *fname)
{
char_u *p4, *p3, *p2, *p1, *p;
! char_u *entry;
! char_u *insp = NULL;
int c;
char_u *new_rtp;
int keep;
size_t oldlen;
size_t addlen;
+ size_t new_rtp_len;
char_u *afterdir = NULL;
size_t afterlen = 0;
+ char_u *after_insp = NULL;
char_u *ffname = NULL;
size_t fname_len;
char_u *buf = NULL;
***************
*** 3725,3778 ****
if (ffname == NULL)
return FAIL;
! /* Find "ffname" in "p_rtp", ignoring '/' vs '\' differences. */
fname_len = STRLEN(ffname);
- insp = p_rtp;
buf = alloc(MAXPATHL);
if (buf == NULL)
goto theend;
! while (*insp != NUL)
{
! 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;
}
! if (*insp == NUL)
! /* not found, append at the end */
insp = p_rtp + STRLEN(p_rtp);
- else
- /* append after the matching directory. */
- --insp;
! /* check if rtp/pack/name/start/name/after exists */
afterdir = concat_fnames(fname, (char_u *)"after", TRUE);
if (afterdir != NULL && mch_isdir(afterdir))
! afterlen = STRLEN(afterdir) + 1; /* add one for comma */
oldlen = STRLEN(p_rtp);
! addlen = STRLEN(fname) + 1; /* add one for comma */
! new_rtp = alloc((int)(oldlen + addlen + afterlen + 1));
! /* add one for NUL */
if (new_rtp == NULL)
goto theend;
keep = (int)(insp - p_rtp);
mch_memmove(new_rtp, p_rtp, keep);
! new_rtp[keep] = ',';
! mch_memmove(new_rtp + keep + 1, fname, addlen);
if (p_rtp[keep] != NUL)
! mch_memmove(new_rtp + keep + addlen, p_rtp + keep, oldlen - keep + 1);
! if (afterlen > 0)
{
STRCAT(new_rtp, ",");
STRCAT(new_rtp, afterdir);
}
set_option_value((char_u *)"rtp", 0L, new_rtp, 0);
vim_free(new_rtp);
retval = OK;
--- 3728,3826 ----
if (ffname == NULL)
return FAIL;
! // Find "ffname" in "p_rtp", ignoring '/' vs '\' differences.
! // Also stop at the first "after" directory.
fname_len = STRLEN(ffname);
buf = alloc(MAXPATHL);
if (buf == NULL)
goto theend;
! for (entry = p_rtp; *entry != NUL; )
{
! char_u *cur_entry = entry;
!
! copy_option_part(&entry, buf, MAXPATHL, ",");
! if (insp == NULL)
! {
! 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)
! // Insert "ffname" after this entry (and comma).
! insp = entry;
! }
!
! if ((p = (char_u *)strstr((char *)buf, "after")) != NULL
! && p > buf
! && vim_ispathsep(p[-1])
! && (vim_ispathsep(p[5]) || p[5] == NUL || p[5] == ','))
! {
! if (insp == NULL)
! // Did not find "ffname" before the first "after" directory,
! // insert it before this entry.
! insp = cur_entry;
! after_insp = cur_entry;
break;
+ }
}
! if (insp == NULL)
! // Both "fname" and "after" not found, append at the end.
insp = p_rtp + STRLEN(p_rtp);
! // check if rtp/pack/name/start/name/after exists
afterdir = concat_fnames(fname, (char_u *)"after", TRUE);
if (afterdir != NULL && mch_isdir(afterdir))
! afterlen = STRLEN(afterdir) + 1; // add one for comma
oldlen = STRLEN(p_rtp);
! addlen = STRLEN(fname) + 1; // add one for comma
! new_rtp = alloc((int)(oldlen + addlen + afterlen + 1)); // add one for NUL
if (new_rtp == NULL)
goto theend;
+
+ // We now have 'rtp' parts: {keep}{keep_after}{rest}.
+ // Create new_rtp, first: {keep},{fname}
keep = (int)(insp - p_rtp);
mch_memmove(new_rtp, p_rtp, keep);
! new_rtp_len = keep;
! if (*insp == NUL)
! new_rtp[new_rtp_len++] = ','; // add comma before
! mch_memmove(new_rtp + new_rtp_len, fname, addlen - 1);
! new_rtp_len += addlen - 1;
! if (*insp != NUL)
! new_rtp[new_rtp_len++] = ','; // add comma after
!
! if (afterlen > 0 && after_insp != NULL)
! {
! int keep_after = (int)(after_insp - p_rtp);
!
! // Add to new_rtp: {keep},{fname}{keep_after},{afterdir}
! mch_memmove(new_rtp + new_rtp_len, p_rtp + keep,
! keep_after - keep);
! new_rtp_len += keep_after - keep;
! mch_memmove(new_rtp + new_rtp_len, afterdir, afterlen - 1);
! new_rtp_len += afterlen - 1;
! new_rtp[new_rtp_len++] = ',';
! keep = keep_after;
! }
!
if (p_rtp[keep] != NUL)
! // Append rest: {keep},{fname}{keep_after},{afterdir}{rest}
! mch_memmove(new_rtp + new_rtp_len, p_rtp + keep, oldlen - keep + 1);
! else
! new_rtp[new_rtp_len] = NUL;
!
! if (afterlen > 0 && after_insp == NULL)
{
+ // Append afterdir when "after" was not found:
+ // {keep},{fname}{rest},{afterdir}
STRCAT(new_rtp, ",");
STRCAT(new_rtp, afterdir);
}
+
set_option_value((char_u *)"rtp", 0L, new_rtp, 0);
vim_free(new_rtp);
retval = OK;
*** ../vim-8.1.0352/src/testdir/test_packadd.vim 2018-04-18
21:56:13.000000000 +0200
--- src/testdir/test_packadd.vim 2018-09-08 18:16:43.969062182 +0200
***************
*** 12,17 ****
--- 12,22 ----
endfunc
func Test_packadd()
+ if !exists('s:plugdir')
+ echomsg 'when running this test manually, call SetUp() first'
+ return
+ endif
+
call mkdir(s:plugdir . '/plugin/also', 'p')
call mkdir(s:plugdir . '/ftdetect', 'p')
call mkdir(s:plugdir . '/after', 'p')
***************
*** 19,24 ****
--- 24,37 ----
let rtp = &rtp
filetype on
+ let rtp_entries = split(rtp, ',')
+ for entry in rtp_entries
+ if entry =~? '\<after\>'
+ let first_after_entry = entry
+ break
+ endif
+ endfor
+
exe 'split ' . s:plugdir . '/plugin/test.vim'
call setline(1, 'let g:plugin_works = 42')
wq
***************
*** 38,44 ****
call assert_equal(17, g:ftdetect_works)
call assert_true(len(&rtp) > len(rtp))
call assert_match('/testdir/Xdir/pack/mine/opt/mytest\($\|,\)', &rtp)
! call assert_match('/testdir/Xdir/pack/mine/opt/mytest/after$', &rtp)
" NOTE: '/.../opt/myte' forwardly matches with '/.../opt/mytest'
call mkdir(fnamemodify(s:plugdir, ':h') . '/myte', 'p')
--- 51,62 ----
call assert_equal(17, g:ftdetect_works)
call assert_true(len(&rtp) > len(rtp))
call assert_match('/testdir/Xdir/pack/mine/opt/mytest\($\|,\)', &rtp)
!
! let new_after = match(&rtp, '/testdir/Xdir/pack/mine/opt/mytest/after,')
! let old_after = match(&rtp, ',' . first_after_entry . '\>')
! call assert_true(new_after > 0, 'rtp is ' . &rtp)
! call assert_true(old_after > 0, 'rtp is ' . &rtp)
! call assert_true(new_after < old_after, 'rtp is ' . &rtp)
" NOTE: '/.../opt/myte' forwardly matches with '/.../opt/mytest'
call mkdir(fnamemodify(s:plugdir, ':h') . '/myte', 'p')
*** ../vim-8.1.0352/src/version.c 2018-09-08 15:10:14.405097082 +0200
--- src/version.c 2018-09-08 17:01:12.259798047 +0200
***************
*** 796,797 ****
--- 796,799 ----
{ /* Add new patch number below this line */
+ /**/
+ 353,
/**/
--
How To Keep A Healthy Level Of Insanity:
14. Put mosquito netting around your work area. Play a tape of jungle
sounds all day.
/// Bram Moolenaar -- [email protected] -- http://www.Moolenaar.net \\\
/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
\\\ an exciting new programming language -- http://www.Zimbu.org ///
\\\ help me help AIDS victims -- http://ICCF-Holland.org ///
--
--
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php
---
You received this message because you are subscribed to the Google Groups
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/d/optout.