# HG changeset patch # User Christian Brabandt # Date 1692306904 -7200 # Node ID 61389a392fe8358fef4f9585cacfaf986a6d61ba # Parent 29bbdd9b425b8345b846aaa1b1dc65140563ef64 patch 9.0.1730: passing multiple patterns to runtime not working Commit: https://github.com/vim/vim/commit/008c91537b55835aa91cd8fbe1a139256581da31 Author: zeertzjq Date: Thu Aug 17 23:08:53 2023 +0200 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 Co-authored-by: zeertzjq diff --git a/src/help.c b/src/help.c --- a/src/help.c +++ b/src/help.c @@ -1312,7 +1312,7 @@ ex_helptags(exarg_T *eap) 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 --- a/src/proto/scriptfile.pro +++ b/src/proto/scriptfile.pro @@ -9,7 +9,7 @@ void ex_runtime(exarg_T *eap); 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 --- a/src/scriptfile.c +++ b/src/scriptfile.c @@ -404,18 +404,19 @@ find_script_callback(char_u *fname, void #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 @@ do_in_path( 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 @@ do_in_path( 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 @@ do_in_path_and_pp( 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 @@ add_pack_plugin(char_u *fname, void *coo 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 @@ add_pack_start_dirs(void) 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 @@ ex_packadd(exarg_T *eap) 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 --- a/src/testdir/test_packadd.vim +++ b/src/testdir/test_packadd.vim @@ -347,12 +347,36 @@ func Test_runtime() 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 @@ func Test_runtime() 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 @@ func Test_runtime() 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 --- a/src/version.c +++ b/src/version.c @@ -696,6 +696,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 1730, +/**/ 1729, /**/ 1728,