Patch 8.1.0814
Problem:    :mksession cannot handle a very long 'runtimepath'. (Timothy
            Madden)
Solution:   Expand each part separately, instead of the whole option at once.
            (Christian Brabandt, closes #3466)
Files:      src/option.c, src/testdir/test_mksession.vim


*** ../vim-8.1.0813/src/option.c        2019-01-24 15:54:17.794846944 +0100
--- src/option.c        2019-01-24 20:23:14.225567873 +0100
***************
*** 3243,3249 ****
  static void showoptions(int all, int opt_flags);
  static int optval_default(struct vimoption *, char_u *varp);
  static void showoneopt(struct vimoption *, int opt_flags);
! static int put_setstring(FILE *fd, char *cmd, char *name, char_u **valuep, 
int expand);
  static int put_setnum(FILE *fd, char *cmd, char *name, long *valuep);
  static int put_setbool(FILE *fd, char *cmd, char *name, int value);
  static int  istermoption(struct vimoption *);
--- 3243,3249 ----
  static void showoptions(int all, int opt_flags);
  static int optval_default(struct vimoption *, char_u *varp);
  static void showoneopt(struct vimoption *, int opt_flags);
! static int put_setstring(FILE *fd, char *cmd, char *name, char_u **valuep, 
long_u flags);
  static int put_setnum(FILE *fd, char *cmd, char *name, long *valuep);
  static int put_setbool(FILE *fd, char *cmd, char *name, int value);
  static int  istermoption(struct vimoption *);
***************
*** 10297,10303 ****
                        do_endif = TRUE;
                    }
                    if (put_setstring(fd, cmd, p->fullname, (char_u **)varp,
!                                         (p->flags & P_EXPAND) != 0) == FAIL)
                        return FAIL;
                    if (do_endif)
                    {
--- 10297,10303 ----
                        do_endif = TRUE;
                    }
                    if (put_setstring(fd, cmd, p->fullname, (char_u **)varp,
!                                                            p->flags) == FAIL)
                        return FAIL;
                    if (do_endif)
                    {
***************
*** 10319,10332 ****
      int
  makefoldset(FILE *fd)
  {
!     if (put_setstring(fd, "setlocal", "fdm", &curwin->w_p_fdm, FALSE) == FAIL
  # ifdef FEAT_EVAL
!           || put_setstring(fd, "setlocal", "fde", &curwin->w_p_fde, FALSE)
                                                                       == FAIL
  # endif
!           || put_setstring(fd, "setlocal", "fmr", &curwin->w_p_fmr, FALSE)
                                                                       == FAIL
!           || put_setstring(fd, "setlocal", "fdi", &curwin->w_p_fdi, FALSE)
                                                                       == FAIL
            || put_setnum(fd, "setlocal", "fdl", &curwin->w_p_fdl) == FAIL
            || put_setnum(fd, "setlocal", "fml", &curwin->w_p_fml) == FAIL
--- 10319,10332 ----
      int
  makefoldset(FILE *fd)
  {
!     if (put_setstring(fd, "setlocal", "fdm", &curwin->w_p_fdm, 0) == FAIL
  # ifdef FEAT_EVAL
!           || put_setstring(fd, "setlocal", "fde", &curwin->w_p_fde, 0)
                                                                       == FAIL
  # endif
!           || put_setstring(fd, "setlocal", "fmr", &curwin->w_p_fmr, 0)
                                                                       == FAIL
!           || put_setstring(fd, "setlocal", "fdi", &curwin->w_p_fdi, 0)
                                                                       == FAIL
            || put_setnum(fd, "setlocal", "fdl", &curwin->w_p_fdl) == FAIL
            || put_setnum(fd, "setlocal", "fml", &curwin->w_p_fml) == FAIL
***************
*** 10345,10354 ****
      char      *cmd,
      char      *name,
      char_u    **valuep,
!     int               expand)
  {
      char_u    *s;
!     char_u    *buf;
  
      if (fprintf(fd, "%s %s=", cmd, name) < 0)
        return FAIL;
--- 10345,10356 ----
      char      *cmd,
      char      *name,
      char_u    **valuep,
!     long_u    flags)
  {
      char_u    *s;
!     char_u    *buf = NULL;
!     char_u    *part = NULL;
!     char_u    *p;
  
      if (fprintf(fd, "%s %s=", cmd, name) < 0)
        return FAIL;
***************
*** 10364,10375 ****
                if (put_escstr(fd, str2special(&s, FALSE), 2) == FAIL)
                    return FAIL;
        }
!       else if (expand)
        {
!           buf = alloc(MAXPATHL);
            if (buf == NULL)
!               return FAIL;
!           home_replace(NULL, *valuep, buf, MAXPATHL, FALSE);
            if (put_escstr(fd, buf, 2) == FAIL)
            {
                vim_free(buf);
--- 10366,10411 ----
                if (put_escstr(fd, str2special(&s, FALSE), 2) == FAIL)
                    return FAIL;
        }
!       // expand the option value, replace $HOME by ~
!       else if ((flags & P_EXPAND) != 0)
        {
!           int  size = (int)STRLEN(*valuep) + 1;
! 
!           // replace home directory in the whole option value into "buf"
!           buf = alloc(size);
            if (buf == NULL)
!               goto fail;
!           home_replace(NULL, *valuep, buf, size, FALSE);
! 
!           // If the option value is longer than MAXPATHL, we need to append
!           // earch comma separated part of the option separately, so that it
!           // can be expanded when read back.
!           if (size >= MAXPATHL && (flags & P_COMMA) != 0
!                                          && vim_strchr(*valuep, ',') != NULL)
!           {
!               part = alloc(size);
!               if (part == NULL)
!                   goto fail;
! 
!               // write line break to clear the option, e.g. ':set rtp='
!               if (put_eol(fd) == FAIL)
!                   goto fail;
! 
!               p = buf;
!               while (*p != NUL)
!               {
!                   // for each comma separated option part, append value to
!                   // the option, :set rtp+=value
!                   if (fprintf(fd, "%s %s+=", cmd, name) < 0)
!                       goto fail;
!                   (void)copy_option_part(&p, part, size,  ",");
!                   if (put_escstr(fd, part, 2) == FAIL || put_eol(fd) == FAIL)
!                       goto fail;
!               }
!               vim_free(buf);
!               vim_free(part);
!               return OK;
!           }
            if (put_escstr(fd, buf, 2) == FAIL)
            {
                vim_free(buf);
***************
*** 10383,10388 ****
--- 10419,10428 ----
      if (put_eol(fd) < 0)
        return FAIL;
      return OK;
+ fail:
+     vim_free(buf);
+     vim_free(part);
+     return FAIL;
  }
  
      static int
*** ../vim-8.1.0813/src/testdir/test_mksession.vim      2019-01-24 
15:57:25.321532574 +0100
--- src/testdir/test_mksession.vim      2019-01-24 19:56:04.503236163 +0100
***************
*** 3,9 ****
  set encoding=latin1
  scriptencoding latin1
  
! if !has('multi_byte') || !has('mksession')
    finish
  endif
  
--- 3,9 ----
  set encoding=latin1
  scriptencoding latin1
  
! if !has('mksession')
    finish
  endif
  
***************
*** 126,131 ****
--- 126,154 ----
    call delete('Xtest_mks_winheight.out')
  endfunc
  
+ func Test_mksession_rtp()
+   new
+   let _rtp=&rtp
+   " Make a real long (invalid) runtimepath value,
+   " that should exceed PATH_MAX (hopefully)
+   let newrtp=&rtp.',~'.repeat('/foobar', 1000)
+   let newrtp.=",".expand("$HOME")."/.vim"
+   let &rtp=newrtp
+ 
+   " determine expected value
+   let expected=split(&rtp, ',')
+   let expected = map(expected, '"set runtimepath+=".v:val')
+   let expected = ['set runtimepath='] + expected
+   let expected = map(expected, {v,w -> substitute(w, $HOME, "~", "g")})
+ 
+   mksession! Xtest_mks.out
+   let &rtp=_rtp
+   let li = filter(readfile('Xtest_mks.out'), 'v:val =~# "runtimepath"')
+   call assert_equal(expected, li)
+ 
+   call delete('Xtest_mks.out')
+ endfunc
+ 
  func Test_mksession_arglist()
    argdel *
    next file1 file2 file3 file4
*** ../vim-8.1.0813/src/version.c       2019-01-24 19:37:35.912390940 +0100
--- src/version.c       2019-01-24 20:30:18.569799280 +0100
***************
*** 789,790 ****
--- 789,792 ----
  {   /* Add new patch number below this line */
+ /**/
+     84,
  /**/

-- 
Yah, well, we had to carve our electrons out of driftwood we'd
find.  In the winter.  Uphill.  Both ways.

 /// Bram Moolenaar -- [email protected] -- http://www.Moolenaar.net   \\\
///        sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
\\\  an exciting new programming language -- http://www.Zimbu.org        ///
 \\\            help me help AIDS victims -- http://ICCF-Holland.org    ///

-- 
-- 
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php

--- 
You received this message because you are subscribed to the Google Groups 
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/d/optout.

Raspunde prin e-mail lui