mirror of
				https://github.com/neovim/neovim.git
				synced 2025-10-26 12:27:24 +00:00 
			
		
		
		
	win: expand nested env var #10662
Vim-compatible behavior for a Windows edge case.
This commit is contained in:
		| @@ -304,6 +304,30 @@ void init_homedir(void) | |||||||
|   if (var == NULL) { |   if (var == NULL) { | ||||||
|     var = os_getenv("USERPROFILE"); |     var = os_getenv("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. | ||||||
|  |   if (var != NULL && *var == '%') { | ||||||
|  |     const char *p = strchr(var + 1, '%'); | ||||||
|  |     if (p != NULL) { | ||||||
|  |       vim_snprintf(os_buf, (size_t)(p - var), "%s", var + 1); | ||||||
|  |       const char *exp = os_getenv(os_buf); | ||||||
|  |       if (exp != NULL && *exp != NUL | ||||||
|  |           && STRLEN(exp) + STRLEN(p) < MAXPATHL) { | ||||||
|  |         vim_snprintf(os_buf, MAXPATHL, "%s%s", exp, p + 1); | ||||||
|  |         var = os_buf; | ||||||
|  |       } | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   // Default home dir is C:/ | ||||||
|  |   // Best assumption we can make in such a situation. | ||||||
|  |   if (var == NULL | ||||||
|  |       // Empty means "undefined" | ||||||
|  |       || *var == NUL) { | ||||||
|  |     var = "C:/"; | ||||||
|  |   } | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
|   if (var != NULL) { |   if (var != NULL) { | ||||||
| @@ -705,17 +729,17 @@ char *vim_getenv(const char *name) | |||||||
|   // init_path() should have been called before now. |   // init_path() should have been called before now. | ||||||
|   assert(get_vim_var_str(VV_PROGPATH)[0] != NUL); |   assert(get_vim_var_str(VV_PROGPATH)[0] != NUL); | ||||||
|  |  | ||||||
|   const char *kos_env_path = os_getenv(name); |  | ||||||
|   if (kos_env_path != NULL) { |  | ||||||
|     return xstrdup(kos_env_path); |  | ||||||
|   } |  | ||||||
|  |  | ||||||
| #ifdef WIN32 | #ifdef WIN32 | ||||||
|   if (strcmp(name, "HOME") == 0) { |   if (strcmp(name, "HOME") == 0) { | ||||||
|     return xstrdup(homedir); |     return xstrdup(homedir); | ||||||
|   } |   } | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
|  |   const char *kos_env_path = os_getenv(name); | ||||||
|  |   if (kos_env_path != NULL) { | ||||||
|  |     return xstrdup(kos_env_path); | ||||||
|  |   } | ||||||
|  |  | ||||||
|   bool vimruntime = (strcmp(name, "VIMRUNTIME") == 0); |   bool vimruntime = (strcmp(name, "VIMRUNTIME") == 0); | ||||||
|   if (!vimruntime && strcmp(name, "VIM") != 0) { |   if (!vimruntime && strcmp(name, "VIM") != 0) { | ||||||
|     return NULL; |     return NULL; | ||||||
|   | |||||||
| @@ -86,7 +86,7 @@ func Test_WindowsHome() | |||||||
|     let $HOME = '%USERPROFILE%\bar' |     let $HOME = '%USERPROFILE%\bar' | ||||||
|     let $HOMEDRIVE = 'unused' |     let $HOMEDRIVE = 'unused' | ||||||
|     let $HOMEPATH = 'unused' |     let $HOMEPATH = 'unused' | ||||||
|     " call CheckHome('C:\foo\bar', '%USERPROFILE%\bar') |     call CheckHome('C:\foo\bar', '%USERPROFILE%\bar') | ||||||
|  |  | ||||||
|     " Invalid $HOME is kept |     " Invalid $HOME is kept | ||||||
|     let $USERPROFILE = 'C:\foo' |     let $USERPROFILE = 'C:\foo' | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 erw7
					erw7