patch 9.0.1730: passing multiple patterns to runtime not working
Problem: passing multiple patterns to runtime not working
Solution: prepend prefix to each argument separately
closes: #12617
Signed-off-by: Christian Brabandt <cb@256bit.org>
Co-authored-by: zeertzjq <zeertzjq@outlook.com>
diff --git a/src/help.c b/src/help.c
index 4d1efe8..c33985e 100644
--- a/src/help.c
+++ b/src/help.c
@@ -1312,7 +1312,7 @@
if (STRCMP(eap->arg, "ALL") == 0)
{
- do_in_path(p_rtp, (char_u *)"doc", DIP_ALL + DIP_DIR,
+ do_in_path(p_rtp, "", (char_u *)"doc", DIP_ALL + DIP_DIR,
helptags_cb, &add_help_tags);
}
else
diff --git a/src/proto/scriptfile.pro b/src/proto/scriptfile.pro
index 24e5389..dbcc849 100644
--- a/src/proto/scriptfile.pro
+++ b/src/proto/scriptfile.pro
@@ -9,7 +9,7 @@
void set_context_in_runtime_cmd(expand_T *xp, char_u *arg);
int find_script_by_name(char_u *name);
int get_new_scriptitem_for_fname(int *error, char_u *fname);
-int do_in_path(char_u *path, char_u *name, int flags, void (*callback)(char_u *fname, void *ck), void *cookie);
+int do_in_path(char_u *path, char *prefix, 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, int *ret_sid);
diff --git a/src/scriptfile.c b/src/scriptfile.c
index 8a42db9..37d57e5 100644
--- a/src/scriptfile.c
+++ b/src/scriptfile.c
@@ -404,18 +404,19 @@
#endif
/*
- * Find the file "name" in all directories in "path" and invoke
+ * Find the patterns in "name" in all directories in "path" and invoke
* "callback(fname, cookie)".
- * "name" can contain wildcards.
+ * "prefix" is prepended to each pattern in "name".
* When "flags" has DIP_ALL: source all files, otherwise only the first one.
* When "flags" has DIP_DIR: find directories instead of files.
* When "flags" has DIP_ERR: give an error message if there is no match.
*
- * return FAIL when no file could be sourced, OK otherwise.
+ * Return FAIL when no file could be sourced, OK otherwise.
*/
int
do_in_path(
char_u *path,
+ char *prefix,
char_u *name,
int flags,
void (*callback)(char_u *fname, void *ck),
@@ -447,8 +448,12 @@
if (p_verbose > 10 && name != NULL)
{
verbose_enter();
- smsg(_("Searching for \"%s\" in \"%s\""),
- (char *)name, (char *)path);
+ if (*prefix != NUL)
+ smsg(_("Searching for \"%s\" under \"%s\" in \"%s\""),
+ (char *)name, prefix, (char *)path);
+ else
+ smsg(_("Searching for \"%s\" in \"%s\""),
+ (char *)name, (char *)path);
verbose_leave();
}
@@ -479,9 +484,10 @@
if (!did_one)
did_one = (cookie == NULL);
}
- else if (buflen + STRLEN(name) + 2 < MAXPATHL)
+ else if (buflen + 2 + STRLEN(prefix) + STRLEN(name) < MAXPATHL)
{
add_pathsep(buf);
+ STRCAT(buf, prefix);
tail = buf + STRLEN(buf);
// Loop over all patterns in "name"
@@ -559,35 +565,17 @@
void *cookie)
{
int done = FAIL;
- char_u *s;
- int len;
- char *start_dir = "pack/*/start/*/%s";
- char *opt_dir = "pack/*/opt/*/%s";
if ((flags & DIP_NORTP) == 0)
- done = do_in_path(path, name, flags, callback, cookie);
+ done = do_in_path(path, "", name, flags, callback, cookie);
if ((done == FAIL || (flags & DIP_ALL)) && (flags & DIP_START))
- {
- len = (int)(STRLEN(start_dir) + STRLEN(name));
- s = alloc(len);
- if (s == NULL)
- return FAIL;
- vim_snprintf((char *)s, len, start_dir, name);
- done = do_in_path(p_pp, s, flags, callback, cookie);
- vim_free(s);
- }
+ done = do_in_path(p_pp, "pack/*/start/*/", name, flags, callback,
+ cookie);
if ((done == FAIL || (flags & DIP_ALL)) && (flags & DIP_OPT))
- {
- len = (int)(STRLEN(opt_dir) + STRLEN(name));
- s = alloc(len);
- if (s == NULL)
- return FAIL;
- vim_snprintf((char *)s, len, opt_dir, name);
- done = do_in_path(p_pp, s, flags, callback, cookie);
- vim_free(s);
- }
+ done = do_in_path(p_pp, "pack/*/opt/*/", name, flags, callback,
+ cookie);
return done;
}
@@ -899,7 +887,7 @@
void
add_pack_start_dirs(void)
{
- do_in_path(p_pp, (char_u *)"pack/*/start/*", DIP_ALL + DIP_DIR,
+ do_in_path(p_pp, "", (char_u *)"pack/*/start/*", DIP_ALL + DIP_DIR,
add_pack_plugin, &APP_ADD_DIR);
}
@@ -910,7 +898,7 @@
load_start_packages(void)
{
did_source_packages = TRUE;
- do_in_path(p_pp, (char_u *)"pack/*/start/*", DIP_ALL + DIP_DIR,
+ do_in_path(p_pp, "", (char_u *)"pack/*/start/*", DIP_ALL + DIP_DIR,
add_pack_plugin, &APP_LOAD);
}
@@ -957,7 +945,7 @@
vim_snprintf(pat, len, plugpat, round == 1 ? "start" : "opt", eap->arg);
// The first round don't give a "not found" error, in the second round
// only when nothing was found in the first round.
- res = do_in_path(p_pp, (char_u *)pat,
+ res = do_in_path(p_pp, "", (char_u *)pat,
DIP_ALL + DIP_DIR + (round == 2 && res == FAIL ? DIP_ERR : 0),
add_pack_plugin, eap->forceit ? &APP_ADD_DIR : &APP_BOTH);
vim_free(pat);
diff --git a/src/testdir/test_packadd.vim b/src/testdir/test_packadd.vim
index b44494a..33dcfe0 100644
--- a/src/testdir/test_packadd.vim
+++ b/src/testdir/test_packadd.vim
@@ -347,12 +347,36 @@
runtime extra/bar.vim
call assert_equal('run', g:sequence)
let g:sequence = ''
+ runtime NoSuchFile extra/bar.vim
+ call assert_equal('run', g:sequence)
+
+ let g:sequence = ''
runtime START extra/bar.vim
call assert_equal('start', g:sequence)
let g:sequence = ''
+ runtime START NoSuchFile extra/bar.vim extra/foo.vim
+ call assert_equal('start', g:sequence)
+ let g:sequence = ''
+ runtime START NoSuchFile extra/foo.vim extra/bar.vim
+ call assert_equal('foostart', g:sequence)
+ let g:sequence = ''
+ runtime! START NoSuchFile extra/bar.vim extra/foo.vim
+ call assert_equal('startfoostart', g:sequence)
+
+ let g:sequence = ''
runtime OPT extra/bar.vim
call assert_equal('opt', g:sequence)
let g:sequence = ''
+ runtime OPT NoSuchFile extra/bar.vim extra/xxx.vim
+ call assert_equal('opt', g:sequence)
+ let g:sequence = ''
+ runtime OPT NoSuchFile extra/xxx.vim extra/bar.vim
+ call assert_equal('xxxopt', g:sequence)
+ let g:sequence = ''
+ runtime! OPT NoSuchFile extra/bar.vim extra/xxx.vim
+ call assert_equal('optxxxopt', g:sequence)
+
+ let g:sequence = ''
runtime PACK extra/bar.vim
call assert_equal('start', g:sequence)
let g:sequence = ''
@@ -361,6 +385,12 @@
let g:sequence = ''
runtime PACK extra/xxx.vim
call assert_equal('xxxopt', g:sequence)
+ let g:sequence = ''
+ runtime PACK extra/xxx.vim extra/foo.vim extra/bar.vim
+ call assert_equal('foostart', g:sequence)
+ let g:sequence = ''
+ runtime! PACK extra/bar.vim extra/xxx.vim extra/foo.vim
+ call assert_equal('startfoostartoptxxxopt', g:sequence)
let g:sequence = ''
runtime ALL extra/bar.vim
@@ -374,6 +404,12 @@
let g:sequence = ''
runtime! ALL extra/bar.vim
call assert_equal('runstartopt', g:sequence)
+ let g:sequence = ''
+ runtime ALL extra/xxx.vim extra/foo.vim extra/bar.vim
+ call assert_equal('run', g:sequence)
+ let g:sequence = ''
+ runtime! ALL extra/bar.vim extra/xxx.vim extra/foo.vim
+ call assert_equal('runstartfoostartoptxxxopt', g:sequence)
endfunc
func Test_runtime_completion()
diff --git a/src/version.c b/src/version.c
index 64fcfca..9a1709a 100644
--- a/src/version.c
+++ b/src/version.c
@@ -696,6 +696,8 @@
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 1730,
+/**/
1729,
/**/
1728,