# HG changeset patch # User Bram Moolenaar # Date 1581369303 -3600 # Node ID 7894f20668b15dfab8b4b54e0c296d34dfeb3232 # Parent 54290e4957cec8ab7617c037fe9ae944a88fb0a8 patch 8.2.0239: MS-Windows: 'env' job option does not override existing vars Commit: https://github.com/vim/vim/commit/355757aed6ae2ae5446882570d89f243e4805937 Author: Bram Moolenaar Date: Mon Feb 10 22:06:32 2020 +0100 patch 8.2.0239: MS-Windows: 'env' job option does not override existing vars Problem: MS-Windows: 'env' job option does not override existing environment variables. (Tim Pope) Solution: Set the environment variables later. (Yasuhiro Matsumoto, closes #5485, closes #5608) diff --git a/src/os_win32.c b/src/os_win32.c --- a/src/os_win32.c +++ b/src/os_win32.c @@ -4948,24 +4948,6 @@ win32_build_env(dict_T *env, garray_T *g if (ga_grow(gap, 1) == FAIL) return; - if (base) - { - WCHAR *p = (WCHAR*) base; - - // for last \0 - if (ga_grow(gap, 1) == FAIL) - return; - - while (*p != 0 || *(p + 1) != 0) - { - if (ga_grow(gap, 1) == OK) - *((WCHAR*)gap->ga_data + gap->ga_len++) = *p; - p++; - } - FreeEnvironmentStrings(base); - *((WCHAR*)gap->ga_data + gap->ga_len++) = L'\0'; - } - if (env != NULL) { for (hi = env->dv_hashtab.ht_array; todo > 0; ++hi) @@ -4997,6 +4979,24 @@ win32_build_env(dict_T *env, garray_T *g } } + if (base) + { + WCHAR *p = (WCHAR*) base; + + // for last \0 + if (ga_grow(gap, 1) == FAIL) + return; + + while (*p != 0 || *(p + 1) != 0) + { + if (ga_grow(gap, 1) == OK) + *((WCHAR*)gap->ga_data + gap->ga_len++) = *p; + p++; + } + FreeEnvironmentStrings(base); + *((WCHAR*)gap->ga_data + gap->ga_len++) = L'\0'; + } + # if defined(FEAT_CLIENTSERVER) || defined(FEAT_TERMINAL) { # ifdef FEAT_CLIENTSERVER diff --git a/src/testdir/test_channel.vim b/src/testdir/test_channel.vim --- a/src/testdir/test_channel.vim +++ b/src/testdir/test_channel.vim @@ -2006,3 +2006,12 @@ func Test_issue_5150() sleep 10m call assert_equal(-1, job_info(g:job).exitval) endfunc + +func Test_issue_5485() + let $VAR1 = 'global' + let g:Ch_reply = "" + let l:job = job_start([&shell, &shellcmdflag, has('win32') ? 'echo %VAR1% %VAR2%' : 'echo $VAR1 $VAR2'], {'env': {'VAR1': 'local', 'VAR2': 'local'}, 'callback': 'Ch_handler'}) + let g:Ch_job = l:job + call WaitForAssert({-> assert_equal("local local", trim(g:Ch_reply))}) + unlet $VAR1 +endfunc diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -743,6 +743,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 239, +/**/ 238, /**/ 237,