]> granicus.if.org Git - vim/commitdiff
patch 7.4.1840 v7.4.1840
authorBram Moolenaar <Bram@vim.org>
Tue, 24 May 2016 17:37:29 +0000 (19:37 +0200)
committerBram Moolenaar <Bram@vim.org>
Tue, 24 May 2016 17:37:29 +0000 (19:37 +0200)
Problem:    When using packages an "after" directory cannot be used.
Solution:   Add the "after" directory of the package to 'runtimepath' if it
            exists.

src/ex_cmds2.c
src/testdir/test_packadd.vim
src/version.c

index 256acec7c487ae0d2db1c477d2d6592a10b65058..a90fe7d8c6565e08f66a3fe647147a0300e4e3c9 100644 (file)
@@ -3326,13 +3326,15 @@ add_pack_plugin(char_u *fname, void *cookie)
     int            keep;
     int            oldlen;
     int            addlen;
+    char_u  *afterdir;
+    int            afterlen = 0;
     char_u  *ffname = fix_fname(fname);
 
     if (ffname == NULL)
        return;
     if (cookie != &APP_LOAD && strstr((char *)p_rtp, (char *)ffname) == NULL)
     {
-       /* directory not in 'runtimepath', add it */
+       /* directory is not yet in 'runtimepath', add it */
        p4 = p3 = p2 = p1 = get_past_head(ffname);
        for (p = p1; *p; mb_ptr_adv(p))
            if (vim_ispathsep_nocolon(*p))
@@ -3360,20 +3362,31 @@ add_pack_plugin(char_u *fname, void *cookie)
        }
        *p4 = c;
 
+       /* check if rtp/pack/name/start/name/after exists */
+       afterdir = concat_fnames(ffname, (char_u *)"after", TRUE);
+       if (afterdir != NULL && mch_isdir(afterdir))
+           afterlen = STRLEN(afterdir) + 1; /* add one for comma */
+
        oldlen = (int)STRLEN(p_rtp);
-       addlen = (int)STRLEN(ffname);
-       new_rtp = alloc(oldlen + addlen + 2);
+       addlen = (int)STRLEN(ffname) + 1; /* add one for comma */
+       new_rtp = alloc(oldlen + addlen + afterlen + 1); /* add one for NUL */
        if (new_rtp == NULL)
            goto theend;
        keep = (int)(insp - p_rtp);
        mch_memmove(new_rtp, p_rtp, keep);
        new_rtp[keep] = ',';
-       mch_memmove(new_rtp + keep + 1, ffname, addlen + 1);
+       mch_memmove(new_rtp + keep + 1, ffname, addlen);
        if (p_rtp[keep] != NUL)
-           mch_memmove(new_rtp + keep + 1 + addlen, p_rtp + keep,
+           mch_memmove(new_rtp + keep + addlen, p_rtp + keep,
                                                           oldlen - keep + 1);
+       if (afterlen > 0)
+       {
+           STRCAT(new_rtp, ",");
+           STRCAT(new_rtp, afterdir);
+       }
        set_option_value((char_u *)"rtp", 0L, new_rtp, 0);
        vim_free(new_rtp);
+       vim_free(afterdir);
     }
 
     if (cookie != &APP_ADD_DIR)
index 66a344b0dcc61930eb01142ce66a5c86ebc6f2a0..eca1560f7718897907799c3ce707fa6efd002b10 100644 (file)
@@ -13,6 +13,7 @@ endfunc
 func Test_packadd()
   call mkdir(s:plugdir . '/plugin/also', 'p')
   call mkdir(s:plugdir . '/ftdetect', 'p')
+  call mkdir(s:plugdir . '/after', 'p')
   set rtp&
   let rtp = &rtp
   filetype on
@@ -35,7 +36,8 @@ func Test_packadd()
   call assert_equal(77, g:plugin_also_works)
   call assert_equal(17, g:ftdetect_works)
   call assert_true(len(&rtp) > len(rtp))
-  call assert_true(&rtp =~ 'testdir/Xdir/pack/mine/opt/mytest\($\|,\)')
+  call assert_true(&rtp =~ '/testdir/Xdir/pack/mine/opt/mytest\($\|,\)')
+  call assert_true(&rtp =~ '/testdir/Xdir/pack/mine/opt/mytest/after$')
 
   " Check exception
   call assert_fails("packadd directorynotfound", 'E919:')
index b53a7442643fb239ccf60711e7030c076280d133..eda517ace289b72e20d9a7c82c43d63c8cb13447 100644 (file)
@@ -753,6 +753,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    1840,
 /**/
     1839,
 /**/