Patch 8.0.0680 (after 8.0.0612)
Problem: Plugins in start packages are sourced twice. (mseplowitz)
Solution: Use the unmodified runtime path when loading plugins (test by Ingo
Karkat, closes #1801)
Files: src/testdir/test_startup.vim, src/main.c, src/ex_cmds2.c,
src/proto/ex_cmds2.pro
*** ../vim-8.0.0679/src/testdir/test_startup.vim 2017-06-04
17:47:38.229528087 +0200
--- src/testdir/test_startup.vim 2017-06-27 14:37:22.398040984 +0200
***************
*** 23,50 ****
\ 'set guioptions+=M',
\ 'let $HOME = "/does/not/exist"',
\ 'set loadplugins',
! \ 'set rtp=Xhere,Xafter',
\ 'set packpath=Xhere,Xafter',
\ 'set nomore',
\ ]
let after = [
\ 'redir! > Xtestout',
\ 'scriptnames',
\ 'redir END',
\ 'quit',
\ ]
call mkdir('Xhere/plugin', 'p')
! call writefile(['let done = 1'], 'Xhere/plugin/here.vim')
call mkdir('Xhere/pack/foo/start/foobar/plugin', 'p')
! call writefile(['let done = 1'],
'Xhere/pack/foo/start/foobar/plugin/foo.vim')
call mkdir('Xafter/plugin', 'p')
! call writefile(['let done = 1'], 'Xafter/plugin/later.vim')
if RunVim(before, after, '')
let lines = readfile('Xtestout')
! let expected = ['Xbefore.vim', 'here.vim', 'foo.vim', 'later.vim',
'Xafter.vim']
let found = []
for line in lines
for one in expected
--- 23,56 ----
\ 'set guioptions+=M',
\ 'let $HOME = "/does/not/exist"',
\ 'set loadplugins',
! \ 'set rtp=Xhere,Xafter,Xanother',
\ 'set packpath=Xhere,Xafter',
\ 'set nomore',
+ \ 'let g:sequence = ""',
\ ]
let after = [
\ 'redir! > Xtestout',
\ 'scriptnames',
\ 'redir END',
+ \ 'redir! > Xsequence',
+ \ 'echo g:sequence',
+ \ 'redir END',
\ 'quit',
\ ]
call mkdir('Xhere/plugin', 'p')
! call writefile(['let g:sequence .= "here "'], 'Xhere/plugin/here.vim')
! call mkdir('Xanother/plugin', 'p')
! call writefile(['let g:sequence .= "another "'],
'Xanother/plugin/another.vim')
call mkdir('Xhere/pack/foo/start/foobar/plugin', 'p')
! call writefile(['let g:sequence .= "pack "'],
'Xhere/pack/foo/start/foobar/plugin/foo.vim')
call mkdir('Xafter/plugin', 'p')
! call writefile(['let g:sequence .= "after "'], 'Xafter/plugin/later.vim')
if RunVim(before, after, '')
let lines = readfile('Xtestout')
! let expected = ['Xbefore.vim', 'here.vim', 'another.vim', 'foo.vim',
'later.vim', 'Xafter.vim']
let found = []
for line in lines
for one in expected
***************
*** 56,63 ****
--- 62,73 ----
call assert_equal(expected, found)
endif
+ call assert_equal('here another pack after',
substitute(join(readfile('Xsequence', 1), ''), '\s\+$', '', ''))
+
call delete('Xtestout')
+ call delete('Xsequence')
call delete('Xhere', 'rf')
+ call delete('Xanother', 'rf')
call delete('Xafter', 'rf')
endfunc
*** ../vim-8.0.0679/src/main.c 2017-06-09 21:35:43.337681146 +0200
--- src/main.c 2017-06-27 14:31:07.968926240 +0200
***************
*** 449,466 ****
*/
if (p_lpl)
{
/* First add all package directories to 'runtimepath', so that their
* autoload directories can be found. Only if not done already with a
! * :packloadall command. */
if (!did_source_packages)
add_pack_start_dirs();
# ifdef VMS /* Somehow VMS doesn't handle the "**". */
! source_runtime((char_u *)"plugin/*.vim", DIP_ALL | DIP_NOAFTER);
# else
! source_runtime((char_u *)"plugin/**/*.vim", DIP_ALL | DIP_NOAFTER);
# endif
TIME_MSG("loading plugins");
/* Only source "start" packages if not done already with a :packloadall
* command. */
--- 449,476 ----
*/
if (p_lpl)
{
+ char_u *rtp_copy = NULL;
+
/* First add all package directories to 'runtimepath', so that their
* autoload directories can be found. Only if not done already with a
! * :packloadall command.
! * Make a copy of 'runtimepath', so that source_runtime does not use
! * the pack directories. */
if (!did_source_packages)
+ {
+ rtp_copy = vim_strsave(p_rtp);
add_pack_start_dirs();
+ }
+ source_in_path(rtp_copy == NULL ? p_rtp : rtp_copy,
# ifdef VMS /* Somehow VMS doesn't handle the "**". */
! (char_u *)"plugin/*.vim",
# else
! (char_u *)"plugin/**/*.vim",
# endif
+ DIP_ALL | DIP_NOAFTER);
TIME_MSG("loading plugins");
+ vim_free(rtp_copy);
/* Only source "start" packages if not done already with a :packloadall
* command. */
*** ../vim-8.0.0679/src/ex_cmds2.c 2017-06-24 16:03:02.751998272 +0200
--- src/ex_cmds2.c 2017-06-27 14:29:44.281571141 +0200
***************
*** 3286,3304 ****
}
/*
- * Source the file "name" from all directories in 'runtimepath'.
- * "name" can contain wildcards.
- * When "flags" has DIP_ALL: source all files, otherwise only the first one.
- *
- * return FAIL when no file could be sourced, OK otherwise.
- */
- int
- source_runtime(char_u *name, int flags)
- {
- return do_in_runtimepath(name, flags, source_callback, NULL);
- }
-
- /*
* Find the file "name" in all directories in "path" and invoke
* "callback(fname, cookie)".
* "name" can contain wildcards.
--- 3286,3291 ----
***************
*** 3435,3452 ****
}
/*
! * Find "name" in 'runtimepath'. When found, invoke the callback function for
* it: callback(fname, "cookie")
* When "flags" has DIP_ALL repeat for all matches, otherwise only the first
* one is used.
* Returns OK when at least one match found, FAIL otherwise.
*
! * If "name" is NULL calls callback for each entry in runtimepath. Cookie is
* passed by reference in this case, setting it to NULL indicates that
callback
* has done its job.
*/
! int
! do_in_runtimepath(
char_u *name,
int flags,
void (*callback)(char_u *fname, void *ck),
--- 3422,3440 ----
}
/*
! * Find "name" in "path". When found, invoke the callback function for
* it: callback(fname, "cookie")
* When "flags" has DIP_ALL repeat for all matches, otherwise only the first
* one is used.
* Returns OK when at least one match found, FAIL otherwise.
*
! * If "name" is NULL calls callback for each entry in "path". Cookie is
* passed by reference in this case, setting it to NULL indicates that
callback
* has done its job.
*/
! static int
! do_in_path_and_pp(
! char_u *path,
char_u *name,
int flags,
void (*callback)(char_u *fname, void *ck),
***************
*** 3459,3465 ****
char *opt_dir = "pack/*/opt/*/%s";
if ((flags & DIP_NORTP) == 0)
! done = do_in_path(p_rtp, name, flags, callback, cookie);
if ((done == FAIL || (flags & DIP_ALL)) && (flags & DIP_START))
{
--- 3447,3453 ----
char *opt_dir = "pack/*/opt/*/%s";
if ((flags & DIP_NORTP) == 0)
! done = do_in_path(path, name, flags, callback, cookie);
if ((done == FAIL || (flags & DIP_ALL)) && (flags & DIP_START))
{
***************
*** 3487,3492 ****
--- 3475,3516 ----
}
/*
+ * Just like do_in_path_and_pp(), using 'runtimepath' for "path".
+ */
+ int
+ do_in_runtimepath(
+ char_u *name,
+ int flags,
+ void (*callback)(char_u *fname, void *ck),
+ void *cookie)
+ {
+ return do_in_path_and_pp(p_rtp, name, flags, callback, cookie);
+ }
+
+ /*
+ * Source the file "name" from all directories in 'runtimepath'.
+ * "name" can contain wildcards.
+ * When "flags" has DIP_ALL: source all files, otherwise only the first one.
+ *
+ * return FAIL when no file could be sourced, OK otherwise.
+ */
+ int
+ source_runtime(char_u *name, int flags)
+ {
+ return source_in_path(p_rtp, name, flags);
+ }
+
+ /*
+ * Just like source_runtime(), but use "path" instead of 'runtimepath'.
+ */
+ int
+ source_in_path(char_u *path, char_u *name, int flags)
+ {
+ return do_in_path_and_pp(path, name, flags, source_callback, NULL);
+ }
+
+
+ /*
* Expand wildcards in "pat" and invoke do_source() for each match.
*/
static void
*** ../vim-8.0.0679/src/proto/ex_cmds2.pro 2017-06-04 17:47:38.225528115
+0200
--- src/proto/ex_cmds2.pro 2017-06-27 14:29:42.173587386 +0200
***************
*** 69,77 ****
void ex_listdo(exarg_T *eap);
void ex_compiler(exarg_T *eap);
void ex_runtime(exarg_T *eap);
- int source_runtime(char_u *name, int flags);
int do_in_path(char_u *path, char_u *name, int flags, void (*callback)(char_u
*fname, void *ck), void *cookie);
int do_in_runtimepath(char_u *name, int flags, void (*callback)(char_u
*fname, void *ck), void *cookie);
void add_pack_start_dirs(void);
void load_start_packages(void);
void ex_packloadall(exarg_T *eap);
--- 69,78 ----
void ex_listdo(exarg_T *eap);
void ex_compiler(exarg_T *eap);
void ex_runtime(exarg_T *eap);
int do_in_path(char_u *path, char_u *name, int flags, void (*callback)(char_u
*fname, void *ck), void *cookie);
int do_in_runtimepath(char_u *name, int flags, void (*callback)(char_u
*fname, void *ck), void *cookie);
+ int source_runtime(char_u *name, int flags);
+ int source_in_path(char_u *path, char_u *name, int flags);
void add_pack_start_dirs(void);
void load_start_packages(void);
void ex_packloadall(exarg_T *eap);
*** ../vim-8.0.0679/src/version.c 2017-06-26 09:59:30.573041754 +0200
--- src/version.c 2017-06-27 14:37:36.877929410 +0200
***************
*** 766,767 ****
--- 766,769 ----
{ /* Add new patch number below this line */
+ /**/
+ 680,
/**/
--
Where do you want to crash today?
/// 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.