Patch 8.2.4754
Problem:    Still using cached values after unsetting some known environment
            variables.
Solution:   Take care of the side effects. (closes #10194)
Files:      src/evalfunc.c, src/evalvars.c, src/misc1.c, src/proto/misc1.pro,
            src/vim9execute.c, src/optionstr.c, src/testdir/test_environ.vim


*** ../vim-8.2.4753/src/evalfunc.c      2022-04-15 13:53:30.048708690 +0100
--- src/evalfunc.c      2022-04-15 20:23:29.422002160 +0100
***************
*** 9223,9231 ****
      name = tv_get_string_buf(&argvars[0], namebuf);
      if (argvars[1].v_type == VAR_SPECIAL
                                      && argvars[1].vval.v_number == VVAL_NULL)
!       vim_unsetenv(name);
      else
!       vim_setenv(name, tv_get_string_buf(&argvars[1], valbuf));
  }
  
  /*
--- 9223,9231 ----
      name = tv_get_string_buf(&argvars[0], namebuf);
      if (argvars[1].v_type == VAR_SPECIAL
                                      && argvars[1].vval.v_number == VVAL_NULL)
!       vim_unsetenv_ext(name);
      else
!       vim_setenv_ext(name, tv_get_string_buf(&argvars[1], valbuf));
  }
  
  /*
*** ../vim-8.2.4753/src/evalvars.c      2022-04-15 13:53:30.048708690 +0100
--- src/evalvars.c      2022-04-15 20:23:29.422002160 +0100
***************
*** 1795,1801 ****
  
        // Environment variable, normal name or expanded name.
        if (*lp->ll_name == '$')
!           vim_unsetenv(lp->ll_name + 1);
        else if (do_unlet(lp->ll_name, forceit) == FAIL)
            ret = FAIL;
        *name_end = cc;
--- 1795,1801 ----
  
        // Environment variable, normal name or expanded name.
        if (*lp->ll_name == '$')
!           vim_unsetenv_ext(lp->ll_name + 1);
        else if (do_unlet(lp->ll_name, forceit) == FAIL)
            ret = FAIL;
        *name_end = cc;
*** ../vim-8.2.4753/src/misc1.c 2022-04-14 20:43:52.638894555 +0100
--- src/misc1.c 2022-04-15 20:27:09.572659178 +0100
***************
*** 1910,1915 ****
--- 1910,1929 ----
  #endif
  }
  
+ /*
+  * Removes environment variable "name" and take care of side effects.
+  */
+     void
+ vim_unsetenv_ext(char_u *var)
+ {
+     vim_unsetenv(var);
+ 
+     // "homedir" is not cleared, keep using the old value until $HOME is set.
+     if (STRICMP(var, "VIM") == 0)
+       didset_vim = FALSE;
+     else if (STRICMP(var, "VIMRUNTIME") == 0)
+       didset_vimruntime = FALSE;
+ }
  
  /*
   * Set environment variable "name" and take care of side effects.
***************
*** 1922,1929 ****
        init_homedir();
      else if (didset_vim && STRICMP(name, "VIM") == 0)
        didset_vim = FALSE;
!     else if (didset_vimruntime
!           && STRICMP(name, "VIMRUNTIME") == 0)
        didset_vimruntime = FALSE;
  }
  #endif
--- 1936,1942 ----
        init_homedir();
      else if (didset_vim && STRICMP(name, "VIM") == 0)
        didset_vim = FALSE;
!     else if (didset_vimruntime && STRICMP(name, "VIMRUNTIME") == 0)
        didset_vimruntime = FALSE;
  }
  #endif
*** ../vim-8.2.4753/src/proto/misc1.pro 2022-04-09 18:17:30.056746549 +0100
--- src/proto/misc1.pro 2022-04-15 20:23:29.422002160 +0100
***************
*** 32,37 ****
--- 32,38 ----
  void expand_env_esc(char_u *srcp, char_u *dst, int dstlen, int esc, int one, 
char_u *startstr);
  char_u *vim_getenv(char_u *name, int *mustfree);
  void vim_unsetenv(char_u *var);
+ void vim_unsetenv_ext(char_u *var);
  void vim_setenv_ext(char_u *name, char_u *val);
  void vim_setenv(char_u *name, char_u *val);
  char_u *get_env_name(expand_T *xp, int idx);
*** ../vim-8.2.4753/src/vim9execute.c   2022-04-14 12:58:19.604895030 +0100
--- src/vim9execute.c   2022-04-15 20:23:29.426002162 +0100
***************
*** 2656,2661 ****
--- 2656,2662 ----
            case ISN_SOURCE:
                {
                    int notused;
+ 
                    SOURCING_LNUM = iptr->isn_lnum;
                    if (may_load_script((int)iptr->isn_arg.number, &notused)
                                                                       == FAIL)
***************
*** 3490,3496 ****
                    goto on_error;
                break;
            case ISN_UNLETENV:
!               vim_unsetenv(iptr->isn_arg.unlet.ul_name);
                break;
  
            case ISN_LOCKUNLOCK:
--- 3491,3497 ----
                    goto on_error;
                break;
            case ISN_UNLETENV:
!               vim_unsetenv_ext(iptr->isn_arg.unlet.ul_name);
                break;
  
            case ISN_LOCKUNLOCK:
*** ../vim-8.2.4753/src/optionstr.c     2022-04-15 13:53:30.044708701 +0100
--- src/optionstr.c     2022-04-15 20:27:26.920504456 +0100
***************
*** 644,650 ****
  
  /*
   * Handle string options that need some action to perform when changed.
!  * Returns NULL for success, or an error message for an error.
   */
      char *
  did_set_string_option(
--- 644,650 ----
  
  /*
   * Handle string options that need some action to perform when changed.
!  * Returns NULL for success, or an unstranslated error message for an error.
   */
      char *
  did_set_string_option(
***************
*** 787,801 ****
      {
        // May compute new values for $VIM and $VIMRUNTIME
        if (didset_vim)
!       {
!           vim_setenv((char_u *)"VIM", (char_u *)"");
!           didset_vim = FALSE;
!       }
        if (didset_vimruntime)
!       {
!           vim_setenv((char_u *)"VIMRUNTIME", (char_u *)"");
!           didset_vimruntime = FALSE;
!       }
      }
  
  #ifdef FEAT_SYN_HL
--- 787,795 ----
      {
        // May compute new values for $VIM and $VIMRUNTIME
        if (didset_vim)
!           vim_unsetenv_ext((char_u *)"VIM");
        if (didset_vimruntime)
!           vim_unsetenv_ext((char_u *)"VIMRUNTIME");
      }
  
  #ifdef FEAT_SYN_HL
*** ../vim-8.2.4753/src/testdir/test_environ.vim        2020-09-27 
15:03:11.504543029 +0100
--- src/testdir/test_environ.vim        2022-04-15 20:47:53.183491035 +0100
***************
*** 28,33 ****
--- 28,53 ----
    call assert_equal(v:null, getenv('TEST ENV'))
  endfunc
  
+ func Test_special_env()
+   " The value for $HOME is cached internally by Vim, ensure the value is up to
+   " date.
+   let orig_ENV = $HOME
+ 
+   let $HOME = 'foo'
+   call assert_equal('foo', expand('~'))
+   " old $HOME value is kept until a new one is set
+   unlet $HOME
+   call assert_equal('foo', expand('~'))
+ 
+   call setenv('HOME', 'bar')
+   call assert_equal('bar', expand('~'))
+   " old $HOME value is kept until a new one is set
+   call setenv('HOME', v:null)
+   call assert_equal('bar', expand('~'))
+ 
+   let $HOME = orig_ENV
+ endfunc
+ 
  func Test_external_env()
    call setenv('FOO', 'HelloWorld')
    if has('win32')
*** ../vim-8.2.4753/src/version.c       2022-04-15 13:53:30.056708670 +0100
--- src/version.c       2022-04-15 20:49:02.543361955 +0100
***************
*** 748,749 ****
--- 748,751 ----
  {   /* Add new patch number below this line */
+ /**/
+     4754,
  /**/

-- 
Imagine a world without hypothetical situations.

 /// Bram Moolenaar -- [email protected] -- http://www.Moolenaar.net   \\\
///                                                                      \\\
\\\        sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ ///
 \\\            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].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/vim_dev/20220415195155.55AC31C08E1%40moolenaar.net.

Raspunde prin e-mail lui