Patch 8.0.1012
Problem: MS-Windows: Problem with $HOME when is was set internally.
Solution: Only use the $HOME default internally. (Yasuhiro Matsumoto, closes
#2013)
Files: src/misc1.c, src/testdir/Make_all.mak, src/Makefile,
src/testdir/test_windows_home.vim
*** ../vim-8.0.1011/src/misc1.c 2017-08-26 17:48:57.578995190 +0200
--- src/misc1.c 2017-08-29 21:41:28.560976549 +0200
***************
*** 3750,3760 ****
var = mch_getenv((char_u *)"HOME");
#endif
- if (var != NULL && *var == NUL) /* empty is same as not set */
- var = NULL;
-
#ifdef WIN3264
/*
* Weird but true: $HOME may contain an indirect reference to another
* variable, esp. "%USERPROFILE%". Happens when $USERPROFILE isn't set
* when $HOME is being set.
--- 3750,3783 ----
var = mch_getenv((char_u *)"HOME");
#endif
#ifdef WIN3264
/*
+ * Typically, $HOME is not defined on Windows, unless the user has
+ * specifically defined it for Vim's sake. However, on Windows NT
+ * platforms, $HOMEDRIVE and $HOMEPATH are automatically defined for
+ * each user. Try constructing $HOME from these.
+ */
+ if (var == NULL || *var == NULL)
+ {
+ char_u *homedrive, *homepath;
+
+ homedrive = mch_getenv((char_u *)"HOMEDRIVE");
+ homepath = mch_getenv((char_u *)"HOMEPATH");
+ if (homepath == NULL || *homepath == NUL)
+ homepath = (char_u *)"\\";
+ if (homedrive != NULL
+ && STRLEN(homedrive) + STRLEN(homepath) < MAXPATHL)
+ {
+ sprintf((char *)NameBuff, "%s%s", homedrive, homepath);
+ if (NameBuff[0] != NUL)
+ var = NameBuff;
+ }
+ }
+
+ if (var == NULL)
+ var = mch_getenv((char_u *)"USERPROFILE");
+
+ /*
* Weird but true: $HOME may contain an indirect reference to another
* variable, esp. "%USERPROFILE%". Happens when $USERPROFILE isn't set
* when $HOME is being set.
***************
*** 3774,3813 ****
{
vim_snprintf((char *)NameBuff, MAXPATHL, "%s%s", exp, p + 1);
var = NameBuff;
- /* Also set $HOME, it's needed for _viminfo. */
- vim_setenv((char_u *)"HOME", NameBuff);
}
}
}
! /*
! * Typically, $HOME is not defined on Windows, unless the user has
! * specifically defined it for Vim's sake. However, on Windows NT
! * platforms, $HOMEDRIVE and $HOMEPATH are automatically defined for
! * each user. Try constructing $HOME from these.
! */
! if (var == NULL)
! {
! char_u *homedrive, *homepath;
!
! homedrive = mch_getenv((char_u *)"HOMEDRIVE");
! homepath = mch_getenv((char_u *)"HOMEPATH");
! if (homepath == NULL || *homepath == NUL)
! homepath = (char_u *)"\\";
! if (homedrive != NULL
! && STRLEN(homedrive) + STRLEN(homepath) < MAXPATHL)
! {
! sprintf((char *)NameBuff, "%s%s", homedrive, homepath);
! if (NameBuff[0] != NUL)
! {
! var = NameBuff;
! /* Also set $HOME, it's needed for _viminfo. */
! vim_setenv((char_u *)"HOME", NameBuff);
! }
! }
! }
! # if defined(FEAT_MBYTE)
if (enc_utf8 && var != NULL)
{
int len;
--- 3797,3810 ----
{
vim_snprintf((char *)NameBuff, MAXPATHL, "%s%s", exp, p + 1);
var = NameBuff;
}
}
}
! if (var != NULL && *var == NUL) /* empty is same as not set */
! var = NULL;
! # ifdef FEAT_MBYTE
if (enc_utf8 && var != NULL)
{
int len;
***************
*** 3823,3831 ****
}
}
# endif
- #endif
- #if defined(MSWIN)
/*
* Default home dir is C:/
* Best assumption we can make in such a situation.
--- 3820,3826 ----
***************
*** 3833,3838 ****
--- 3828,3834 ----
if (var == NULL)
var = (char_u *)"C:/";
#endif
+
if (var != NULL)
{
#ifdef UNIX
***************
*** 4662,4667 ****
--- 4658,4667 ----
#else
homedir_env_orig = homedir_env = mch_getenv((char_u *)"HOME");
#endif
+ #ifdef WIN3264
+ if (homedir_env == NULL)
+ homedir_env_orig = homedir_env = mch_getenv((char_u *)"USERPROFILE");
+ #endif
/* Empty is the same as not set. */
if (homedir_env != NULL && *homedir_env == NUL)
homedir_env = NULL;
*** ../vim-8.0.1011/src/testdir/Make_all.mak 2017-08-07 22:02:09.319624624
+0200
--- src/testdir/Make_all.mak 2017-08-29 21:31:11.229009974 +0200
***************
*** 205,211 ****
test_writefile.res \
test_alot_latin.res \
test_alot_utf8.res \
! test_alot.res
# Explicit dependencies.
--- 205,212 ----
test_writefile.res \
test_alot_latin.res \
test_alot_utf8.res \
! test_alot.res \
! test_windows_home.res
# Explicit dependencies.
*** ../vim-8.0.1011/src/Makefile 2017-08-22 22:12:12.936882219 +0200
--- src/Makefile 2017-08-29 21:42:01.332762485 +0200
***************
*** 2278,2283 ****
--- 2278,2284 ----
test_visual \
test_window_cmd \
test_window_id \
+ test_windows_home \
test_writefile \
test_alot_latin \
test_alot_utf8 \
*** ../vim-8.0.1011/src/testdir/test_windows_home.vim 2017-08-29
21:44:31.443782267 +0200
--- src/testdir/test_windows_home.vim 2017-08-29 21:42:53.988418569 +0200
***************
*** 0 ****
--- 1,124 ----
+ " Test for $HOME on Windows.
+
+ if !has('win32')
+ finish
+ endif
+
+ let s:env = {}
+
+ func s:restore_env()
+ for i in keys(s:env)
+ exe 'let ' . i . '=s:env["' . i . '"]'
+ endfor
+ endfunc
+
+ func s:save_env(...)
+ for i in a:000
+ exe 'let s:env["' . i . '"]=' . i
+ endfor
+ endfunc
+
+ func s:unlet_env(...)
+ for i in a:000
+ exe 'let ' . i . '=""'
+ endfor
+ endfunc
+
+ func CheckHomeIsMissingFromSubprocessEnvironment()
+ silent! let out = system('set')
+ let env = filter(split(out, "\n"), 'v:val=~"^HOME="')
+ call assert_equal(0, len(env))
+ endfunc
+
+ func CheckHomeIsInSubprocessEnvironment(exp)
+ silent! let out = system('set')
+ let env = filter(split(out, "\n"), 'v:val=~"^HOME="')
+ let home = len(env) == 0 ? "" : substitute(env[0], '[^=]\+=', '', '')
+ call assert_equal(a:exp, home)
+ endfunc
+
+ func CheckHome(exp, ...)
+ "call assert_equal(a:exp, $HOME)
+ "call assert_equal(a:exp, expand('~', ':p'))
+ if !a:0
+ call CheckHomeIsMissingFromSubprocessEnvironment()
+ else
+ call CheckHomeIsInSubprocessEnvironment(a:exp)
+ endif
+ endfunc
+
+ func TestWindowsHome()
+ command! -nargs=* SaveEnv call <SID>save_env(<f-args>)
+ command! -nargs=* RestoreEnv call <SID>restore_env()
+ command! -nargs=* UnletEnv call <SID>unlet_env(<f-args>)
+
+ SaveEnv $HOME $USERPROFILE $HOMEDRIVE $HOMEPATH
+ try
+ RestoreEnv
+ UnletEnv $HOME $USERPROFILE $HOMEPATH
+ let $HOMEDRIVE = 'C:'
+ call CheckHome('C:\')
+
+ RestoreEnv
+ UnletEnv $HOME $USERPROFILE
+ let $HOMEDRIVE = 'C:'
+ let $HOMEPATH = '\foobar'
+ call CheckHome('C:\foobar')
+
+ RestoreEnv
+ UnletEnv $HOME $HOMEDRIVE $HOMEPATH
+ let $USERPROFILE = 'C:\foo'
+ call CheckHome('C:\foo')
+
+ RestoreEnv
+ UnletEnv $HOME
+ let $USERPROFILE = 'C:\foo'
+ let $HOMEDRIVE = 'C:'
+ let $HOMEPATH = '\baz'
+ call CheckHome('C:\foo')
+
+ RestoreEnv
+ let $HOME = 'C:\bar'
+ let $USERPROFILE = 'C:\foo'
+ let $HOMEDRIVE = 'C:'
+ let $HOMEPATH = '\baz'
+ call CheckHome('C:\bar', 1)
+
+ RestoreEnv
+ let $HOME = '%USERPROFILE%\bar'
+ let $USERPROFILE = 'C:\foo'
+ let $HOMEDRIVE = 'C:'
+ let $HOMEPATH = '\baz'
+ call CheckHome('%USERPROFILE%\bar', 1)
+
+ RestoreEnv
+ let $HOME = '%USERPROFILE'
+ let $USERPROFILE = 'C:\foo'
+ let $HOMEDRIVE = 'C:'
+ let $HOMEPATH = '\baz'
+ call CheckHome('%USERPROFILE', 1)
+
+ RestoreEnv
+ let $HOME = 'C:\%USERPROFILE%'
+ let $USERPROFILE = 'C:\foo'
+ let $HOMEDRIVE = 'C:'
+ let $HOMEPATH = '\baz'
+ call CheckHome('C:\%USERPROFILE%', 1)
+
+ if has('channel')
+ RestoreEnv
+ UnletEnv $HOME
+ let env = ''
+ let job = job_start('cmd /c set', {'out_cb': {ch,x->[env,execute('let
env=x')]}})
+ sleep 1
+ let env = filter(split(env, "\n"), 'v:val=="HOME"')
+ let home = len(env) == 0 ? "" : env[0]
+ call assert_equal('', home)
+ endif
+ finally
+ RestoreEnv
+ delcommand SaveEnv
+ delcommand RestoreEnv
+ delcommand UnletEnv
+ endtry
+ endfunc
*** ../vim-8.0.1011/src/version.c 2017-08-29 20:42:01.853092187 +0200
--- src/version.c 2017-08-29 21:36:09.051063567 +0200
***************
*** 771,772 ****
--- 771,774 ----
{ /* Add new patch number below this line */
+ /**/
+ 1012,
/**/
--
hundred-and-one symptoms of being an internet addict:
29. Your phone bill comes to your doorstep in a box.
/// 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.