Patch 8.0.0405
Problem:    v:progpath may become invalid after ":cd".
Solution:   Turn v:progpath into a full path if needed.
Files:      src/main.c, src/testdir/test_startup.vim, runtime/doc/eval.txt


*** ../vim-8.0.0404/src/main.c  2017-02-25 14:59:29.906090427 +0100
--- src/main.c  2017-03-04 14:33:21.034707076 +0100
***************
*** 57,62 ****
--- 57,65 ----
  # if defined(HAS_SWAP_EXISTS_ACTION)
  static void check_swap_exists_action(void);
  # endif
+ # ifdef FEAT_EVAL
+ static void set_progpath(char_u *argv0);
+ # endif
  # if defined(FEAT_CLIENTSERVER) || defined(PROTO)
  static void exec_on_server(mparm_T *parmp);
  static void prepare_server(mparm_T *parmp);
***************
*** 1694,1700 ****
  
  #ifdef FEAT_EVAL
      set_vim_var_string(VV_PROGNAME, initstr, -1);
!     set_vim_var_string(VV_PROGPATH, (char_u *)parmp->argv[0], -1);
  #endif
  
      if (TOLOWER_ASC(initstr[0]) == 'r')
--- 1697,1703 ----
  
  #ifdef FEAT_EVAL
      set_vim_var_string(VV_PROGNAME, initstr, -1);
!     set_progpath((char_u *)parmp->argv[0]);
  #endif
  
      if (TOLOWER_ASC(initstr[0]) == 'r')
***************
*** 3417,3423 ****
  }
  #endif
  
! #endif
  
  #if defined(STARTUPTIME) || defined(PROTO)
  static void time_diff(struct timeval *then, struct timeval *now);
--- 3420,3426 ----
  }
  #endif
  
! #endif /* NO_VIM_MAIN */
  
  #if defined(STARTUPTIME) || defined(PROTO)
  static void time_diff(struct timeval *then, struct timeval *now);
***************
*** 3525,3530 ****
--- 3528,3557 ----
  
  #endif
  
+ #ifndef NO_VIM_MAIN
+     static void
+ set_progpath(char_u *argv0)
+ {
+     char_u *val = argv0;
+     char_u buf[MAXPATHL];
+ 
+     /* A relative path containing a "/" will become invalid when using ":cd",
+      * turn it into a full path.
+      * On MS-Windows "vim.exe" is found in the current directory, thus also do
+      * it when there is no path and the file exists. */
+     if ( !mch_isFullName(argv0)
+ # ifdef WIN32
+           && mch_can_exe(argv0, NULL, TRUE)
+ # else
+           && gettail(argv0) != argv0
+ # endif
+           && vim_FullName(argv0, buf, MAXPATHL, TRUE) != FAIL)
+       val = buf;
+     set_vim_var_string(VV_PROGPATH, val, -1);
+ }
+ 
+ #endif /* NO_VIM_MAIN */
+ 
  #if (defined(FEAT_CLIENTSERVER) && !defined(NO_VIM_MAIN)) || defined(PROTO)
  
  /*
*** ../vim-8.0.0404/src/testdir/test_startup.vim        2016-08-09 
22:44:21.000000000 +0200
--- src/testdir/test_startup.vim        2017-03-04 14:28:29.700635631 +0100
***************
*** 183,185 ****
--- 183,199 ----
    endif
    call delete('Xtestout')
  endfunc
+ 
+ func Test_progpath()
+   " Tests normally run with "./vim" or "../vim", these must have been expanded
+   " to a full path.
+   if has('unix')
+     call assert_equal('/', v:progpath[0])
+   elseif has('win32')
+     call assert_equal(':', v:progpath[1])
+     call assert_match('[/\\]', v:progpath[2])
+   endif
+ 
+   " Only expect "vim" to appear in v:progname.
+   call assert_match('vim\c', v:progname)
+ endfunc
*** ../vim-8.0.0404/runtime/doc/eval.txt        2017-03-01 20:32:40.135105362 
+0100
--- runtime/doc/eval.txt        2017-03-04 14:35:18.241915232 +0100
***************
*** 1788,1795 ****
                |--remote-expr|.
                To get the full path use: >
                        echo exepath(v:progpath)
! <             NOTE: This does not work when the command is a relative path
!               and the current directory has changed.
                Read-only.
  
                                        *v:register* *register-variable*
--- 1789,1799 ----
                |--remote-expr|.
                To get the full path use: >
                        echo exepath(v:progpath)
! <             If the path is relative it will be expanded to the full path,
!               so that it still works after `:cd`. Thus starting "./vim"
!               results in "/home/user/path/to/vim/src/vim".
!               On MS-Windows the executable may be called "vim.exe", but the
!               ".exe" is not added to v:progpath.
                Read-only.
  
                                        *v:register* *register-variable*
*** ../vim-8.0.0404/src/version.c       2017-03-04 13:47:08.248946851 +0100
--- src/version.c       2017-03-04 14:29:03.184412579 +0100
***************
*** 766,767 ****
--- 766,769 ----
  {   /* Add new patch number below this line */
+ /**/
+     405,
  /**/

-- 
I started out with nothing, and I still have most of it.
                                -- Michael Davis -- "Tonight Show"

 /// 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