]> git.ipfire.org Git - thirdparty/vim.git/commitdiff
patch 9.0.1730: passing multiple patterns to runtime not working v9.0.1730
authorzeertzjq <zeertzjq@outlook.com>
Thu, 17 Aug 2023 21:08:53 +0000 (23:08 +0200)
committerChristian Brabandt <cb@256bit.org>
Thu, 17 Aug 2023 21:08:53 +0000 (23:08 +0200)
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>
src/help.c
src/proto/scriptfile.pro
src/scriptfile.c
src/testdir/test_packadd.vim
src/version.c

index 4d1efe8fe431f77014ed744770cb72087850a58a..c33985ed93975701b0cc404be67b91d09f64b021 100644 (file)
@@ -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
index 24e53892e61d0aa32c601bf8198dfb3e3a59e978..dbcc849353104cb00f12e5ebef65ed3c76e4bf24 100644 (file)
@@ -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);
index 8a42db92024d42aa6a5c8dbb6bf0e4526c66fb1b..37d57e51e90f33efbf0a76b31fc0fc9b99e32ebe 100644 (file)
@@ -404,18 +404,19 @@ find_script_callback(char_u *fname, void *cookie)
 #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 *cookie)
     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);
index b44494acf98937c2a2e20fd4252214c678c404ea..33dcfe0f20503adf3d30df97447b058ecbd816b9 100644 (file)
@@ -346,12 +346,36 @@ func Test_runtime()
   let g:sequence = ''
   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)
@@ -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()
index 64fcfca0ca4a9d3707b0473bc8b73dd7f2180835..9a1709aa775ed438a8cdb39dda09591da0448204 100644 (file)
@@ -695,6 +695,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    1730,
 /**/
     1729,
 /**/