summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLemonBoy <thatlemon@gmail.com>2022-04-15 20:50:46 +0100
committerBram Moolenaar <Bram@vim.org>2022-04-15 20:50:46 +0100
commit7714231bb5b15f7c85453f3945c108478de1d08a (patch)
tree41748cd1bbbff5097437e576c617f19f11468dcf
parent31e5c60a682840959cae6273ccadd9aae48c928d (diff)
patch 8.2.4754: using cached values after unsetting some environment variablesv8.2.4754
Problem: Still using cached values after unsetting some known environment variables. Solution: Take care of the side effects. (closes #10194)
-rw-r--r--src/evalfunc.c4
-rw-r--r--src/evalvars.c2
-rw-r--r--src/misc1.c17
-rw-r--r--src/optionstr.c12
-rw-r--r--src/proto/misc1.pro1
-rw-r--r--src/testdir/test_environ.vim20
-rw-r--r--src/version.c2
-rw-r--r--src/vim9execute.c3
8 files changed, 46 insertions, 15 deletions
diff --git a/src/evalfunc.c b/src/evalfunc.c
index da8f8457c5..690b921082 100644
--- a/src/evalfunc.c
+++ b/src/evalfunc.c
@@ -9223,9 +9223,9 @@ f_setenv(typval_T *argvars, typval_T *rettv UNUSED)
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);
+ vim_unsetenv_ext(name);
else
- vim_setenv(name, tv_get_string_buf(&argvars[1], valbuf));
+ vim_setenv_ext(name, tv_get_string_buf(&argvars[1], valbuf));
}
/*
diff --git a/src/evalvars.c b/src/evalvars.c
index 4690d1ac47..8f8df0cf9d 100644
--- a/src/evalvars.c
+++ b/src/evalvars.c
@@ -1795,7 +1795,7 @@ do_unlet_var(
// Environment variable, normal name or expanded name.
if (*lp->ll_name == '$')
- vim_unsetenv(lp->ll_name + 1);
+ vim_unsetenv_ext(lp->ll_name + 1);
else if (do_unlet(lp->ll_name, forceit) == FAIL)
ret = FAIL;
*name_end = cc;
diff --git a/src/misc1.c b/src/misc1.c
index af83c108b7..9aa8ecfba8 100644
--- a/src/misc1.c
+++ b/src/misc1.c
@@ -1910,6 +1910,20 @@ vim_unsetenv(char_u *var)
#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,8 +1936,7 @@ vim_setenv_ext(char_u *name, char_u *val)
init_homedir();
else if (didset_vim && STRICMP(name, "VIM") == 0)
didset_vim = FALSE;
- else if (didset_vimruntime
- && STRICMP(name, "VIMRUNTIME") == 0)
+ else if (didset_vimruntime && STRICMP(name, "VIMRUNTIME") == 0)
didset_vimruntime = FALSE;
}
#endif
diff --git a/src/optionstr.c b/src/optionstr.c
index 698a3f3f9b..26dd55120b 100644
--- a/src/optionstr.c
+++ b/src/optionstr.c
@@ -644,7 +644,7 @@ check_stl_option(char_u *s)
/*
* Handle string options that need some action to perform when changed.
- * Returns NULL for success, or an error message for an error.
+ * Returns NULL for success, or an unstranslated error message for an error.
*/
char *
did_set_string_option(
@@ -787,15 +787,9 @@ did_set_string_option(
{
// May compute new values for $VIM and $VIMRUNTIME
if (didset_vim)
- {
- vim_setenv((char_u *)"VIM", (char_u *)"");
- didset_vim = FALSE;
- }
+ vim_unsetenv_ext((char_u *)"VIM");
if (didset_vimruntime)
- {
- vim_setenv((char_u *)"VIMRUNTIME", (char_u *)"");
- didset_vimruntime = FALSE;
- }
+ vim_unsetenv_ext((char_u *)"VIMRUNTIME");
}
#ifdef FEAT_SYN_HL
diff --git a/src/proto/misc1.pro b/src/proto/misc1.pro
index cc7e07a20c..167805bd52 100644
--- a/src/proto/misc1.pro
+++ b/src/proto/misc1.pro
@@ -32,6 +32,7 @@ void expand_env(char_u *src, char_u *dst, int dstlen);
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);
diff --git a/src/testdir/test_environ.vim b/src/testdir/test_environ.vim
index dd34983ee5..d8344817f5 100644
--- a/src/testdir/test_environ.vim
+++ b/src/testdir/test_environ.vim
@@ -28,6 +28,26 @@ func Test_setenv()
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')
diff --git a/src/version.c b/src/version.c
index 97683b459a..e833b78be7 100644
--- a/src/version.c
+++ b/src/version.c
@@ -747,6 +747,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 4754,
+/**/
4753,
/**/
4752,
diff --git a/src/vim9execute.c b/src/vim9execute.c
index da2822c1b5..afa0dcf198 100644
--- a/src/vim9execute.c
+++ b/src/vim9execute.c
@@ -2656,6 +2656,7 @@ exec_instructions(ectx_T *ectx)
case ISN_SOURCE:
{
int notused;
+
SOURCING_LNUM = iptr->isn_lnum;
if (may_load_script((int)iptr->isn_arg.number, &notused)
== FAIL)
@@ -3490,7 +3491,7 @@ exec_instructions(ectx_T *ectx)
goto on_error;
break;
case ISN_UNLETENV:
- vim_unsetenv(iptr->isn_arg.unlet.ul_name);
+ vim_unsetenv_ext(iptr->isn_arg.unlet.ul_name);
break;
case ISN_LOCKUNLOCK: