diff options
author | Bram Moolenaar <Bram@vim.org> | 2017-12-17 14:26:46 +0100 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2017-12-17 14:26:46 +0100 |
commit | 9e1d399e63903c6f84d7888ad8d84ebf4e29d8a1 (patch) | |
tree | 9f53ab0a76bcc0a8c7f05e3863f724fc126e89a0 /src | |
parent | 890dd05492d88d48eee1dda7f7a1811d027ce7ca (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.
Diffstat (limited to 'src')
-rw-r--r-- | src/ex_cmds2.c | 31 | ||||
-rw-r--r-- | src/testdir/test_packadd.vim | 18 | ||||
-rw-r--r-- | src/version.c | 2 |
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, |