summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2017-12-17 14:26:46 +0100
committerBram Moolenaar <Bram@vim.org>2017-12-17 14:26:46 +0100
commit9e1d399e63903c6f84d7888ad8d84ebf4e29d8a1 (patch)
tree9f53ab0a76bcc0a8c7f05e3863f724fc126e89a0
parent890dd05492d88d48eee1dda7f7a1811d027ce7ca (diff)
patch 8.0.1398: :packadd does not load packages from the "start" directoryv8.0.1398
Problem: :packadd does not load packages from the "start" directory. (Alejandro Hernandez) Solution: Make :packadd look in the "start" directory if those packages were not loaded on startup.
-rw-r--r--src/ex_cmds2.c31
-rw-r--r--src/testdir/test_packadd.vim18
-rw-r--r--src/version.c2
3 files changed, 42 insertions, 9 deletions
diff --git a/src/ex_cmds2.c b/src/ex_cmds2.c
index 7b00ac2650..1475ef25db 100644
--- a/src/ex_cmds2.c
+++ b/src/ex_cmds2.c
@@ -3747,18 +3747,31 @@ ex_packloadall(exarg_T *eap)
void
ex_packadd(exarg_T *eap)
{
- static char *plugpat = "pack/*/opt/%s";
+ static char *plugpat = "pack/*/%s/%s";
int len;
char *pat;
+ int round;
+ int res = OK;
- len = (int)STRLEN(plugpat) + (int)STRLEN(eap->arg);
- pat = (char *)alloc(len);
- if (pat == NULL)
- return;
- vim_snprintf(pat, len, plugpat, eap->arg);
- do_in_path(p_pp, (char_u *)pat, DIP_ALL + DIP_DIR + DIP_ERR,
- add_pack_plugin, eap->forceit ? &APP_ADD_DIR : &APP_BOTH);
- vim_free(pat);
+ /* Round 1: use "start", round 2: use "opt". */
+ for (round = 1; round <= 2; ++round)
+ {
+ /* Only look under "start" when loading packages wasn't done yet. */
+ if (round == 1 && did_source_packages)
+ continue;
+
+ len = (int)STRLEN(plugpat) + (int)STRLEN(eap->arg) + 5;
+ pat = (char *)alloc(len);
+ if (pat == NULL)
+ return;
+ 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,
+ DIP_ALL + DIP_DIR + (round == 2 && res == FAIL ? DIP_ERR : 0),
+ add_pack_plugin, eap->forceit ? &APP_ADD_DIR : &APP_BOTH);
+ vim_free(pat);
+ }
}
#if defined(FEAT_EVAL) && defined(FEAT_AUTOCMD)
diff --git a/src/testdir/test_packadd.vim b/src/testdir/test_packadd.vim
index c83d4a876a..09b9b82f55 100644
--- a/src/testdir/test_packadd.vim
+++ b/src/testdir/test_packadd.vim
@@ -45,6 +45,24 @@ func Test_packadd()
call assert_fails("packadd", 'E471:')
endfunc
+func Test_packadd_start()
+ let plugdir = s:topdir . '/pack/mine/start/other'
+ call mkdir(plugdir . '/plugin', 'p')
+ set rtp&
+ let rtp = &rtp
+ filetype on
+
+ exe 'split ' . plugdir . '/plugin/test.vim'
+ call setline(1, 'let g:plugin_works = 24')
+ wq
+
+ packadd other
+
+ call assert_equal(24, g:plugin_works)
+ call assert_true(len(&rtp) > len(rtp))
+ call assert_true(&rtp =~ '/testdir/Xdir/pack/mine/start/other\($\|,\)')
+endfunc
+
func Test_packadd_noload()
call mkdir(s:plugdir . '/plugin', 'p')
call mkdir(s:plugdir . '/syntax', 'p')
diff --git a/src/version.c b/src/version.c
index 096d21c993..2580b9ecc2 100644
--- a/src/version.c
+++ b/src/version.c
@@ -772,6 +772,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 1398,
+/**/
1397,
/**/
1396,