diff options
author | LemonBoy <thatlemon@gmail.com> | 2022-04-15 20:50:46 +0100 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2022-04-15 20:50:46 +0100 |
commit | 7714231bb5b15f7c85453f3945c108478de1d08a (patch) | |
tree | 41748cd1bbbff5097437e576c617f19f11468dcf | |
parent | 31e5c60a682840959cae6273ccadd9aae48c928d (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.c | 4 | ||||
-rw-r--r-- | src/evalvars.c | 2 | ||||
-rw-r--r-- | src/misc1.c | 17 | ||||
-rw-r--r-- | src/optionstr.c | 12 | ||||
-rw-r--r-- | src/proto/misc1.pro | 1 | ||||
-rw-r--r-- | src/testdir/test_environ.vim | 20 | ||||
-rw-r--r-- | src/version.c | 2 | ||||
-rw-r--r-- | src/vim9execute.c | 3 |
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, ¬used) == 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: |