@@ -2846,6 +2846,66 @@ int xwcstoutf(char *utf, const wchar_t *wcs, size_t utflen)
28462846 return -1 ;
28472847}
28482848
2849+ #ifdef ENSURE_MSYSTEM_IS_SET
2850+ #if !defined(RUNTIME_PREFIX ) || !defined(HAVE_WPGMPTR )
2851+ static size_t append_system_bin_dirs (char * path UNUSED , size_t size UNUSED )
2852+ {
2853+ return 0 ;
2854+ }
2855+ #else
2856+ static size_t append_system_bin_dirs (char * path , size_t size )
2857+ {
2858+ char prefix [32768 ];
2859+ const char * slash ;
2860+ size_t len = xwcstoutf (prefix , _wpgmptr , sizeof (prefix )), off = 0 ;
2861+
2862+ if (len == 0 || len >= sizeof (prefix ) ||
2863+ !(slash = find_last_dir_sep (prefix )))
2864+ return 0 ;
2865+ /* strip trailing `git.exe` */
2866+ len = slash - prefix ;
2867+
2868+ /* strip trailing `cmd` or `mingw64\bin` or `mingw32\bin` or `bin` or `libexec\git-core` */
2869+ if (strip_suffix_mem (prefix , & len , "\\mingw64\\libexec\\git-core" ) ||
2870+ strip_suffix_mem (prefix , & len , "\\mingw64\\bin" ))
2871+ off += xsnprintf (path + off , size - off ,
2872+ "%.*s\\mingw64\\bin;" , (int )len , prefix );
2873+ else if (strip_suffix_mem (prefix , & len , "\\clangarm64\\libexec\\git-core" ) ||
2874+ strip_suffix_mem (prefix , & len , "\\clangarm64\\bin" ))
2875+ off += xsnprintf (path + off , size - off ,
2876+ "%.*s\\clangarm64\\bin;" , (int )len , prefix );
2877+ else if (strip_suffix_mem (prefix , & len , "\\mingw32\\libexec\\git-core" ) ||
2878+ strip_suffix_mem (prefix , & len , "\\mingw32\\bin" ))
2879+ off += xsnprintf (path + off , size - off ,
2880+ "%.*s\\mingw32\\bin;" , (int )len , prefix );
2881+ else if (strip_suffix_mem (prefix , & len , "\\cmd" ) ||
2882+ strip_suffix_mem (prefix , & len , "\\bin" ) ||
2883+ strip_suffix_mem (prefix , & len , "\\libexec\\git-core" ))
2884+ off += xsnprintf (path + off , size - off ,
2885+ "%.*s\\mingw%d\\bin;" , (int )len , prefix ,
2886+ (int )(sizeof (void * ) * 8 ));
2887+ else
2888+ return 0 ;
2889+
2890+ off += xsnprintf (path + off , size - off ,
2891+ "%.*s\\usr\\bin;" , (int )len , prefix );
2892+ return off ;
2893+ }
2894+ #endif
2895+ #endif
2896+
2897+ static int is_system32_path (const char * path )
2898+ {
2899+ WCHAR system32 [MAX_PATH ], wpath [MAX_PATH ];
2900+
2901+ if (xutftowcs_path (wpath , path ) < 0 ||
2902+ !GetSystemDirectoryW (system32 , ARRAY_SIZE (system32 )) ||
2903+ _wcsicmp (system32 , wpath ))
2904+ return 0 ;
2905+
2906+ return 1 ;
2907+ }
2908+
28492909static void setup_windows_environment (void )
28502910{
28512911 char * tmp = getenv ("TMPDIR" );
@@ -2886,7 +2946,8 @@ static void setup_windows_environment(void)
28862946 strbuf_addstr (& buf , tmp );
28872947 if ((tmp = getenv ("HOMEPATH" ))) {
28882948 strbuf_addstr (& buf , tmp );
2889- if (is_directory (buf .buf ))
2949+ if (!is_system32_path (buf .buf ) &&
2950+ is_directory (buf .buf ))
28902951 setenv ("HOME" , buf .buf , 1 );
28912952 else
28922953 tmp = NULL ; /* use $USERPROFILE */
@@ -2897,6 +2958,41 @@ static void setup_windows_environment(void)
28972958 if (!tmp && (tmp = getenv ("USERPROFILE" )))
28982959 setenv ("HOME" , tmp , 1 );
28992960 }
2961+
2962+ if (!getenv ("PLINK_PROTOCOL" ))
2963+ setenv ("PLINK_PROTOCOL" , "ssh" , 0 );
2964+
2965+ #ifdef ENSURE_MSYSTEM_IS_SET
2966+ if (!(tmp = getenv ("MSYSTEM" )) || !tmp [0 ]) {
2967+ const char * home = getenv ("HOME" ), * path = getenv ("PATH" );
2968+ char buf [32768 ];
2969+ size_t off = 0 ;
2970+
2971+ #if defined(__aarch64__ ) || defined(_M_ARM64 ) || defined(_M_ARM64EC )
2972+ setenv ("MSYSTEM" , "CLANGARM64" , 1 );
2973+ #elif defined(__MINGW64__ ) || defined(_M_AMD64 )
2974+ setenv ("MSYSTEM" , "MINGW64" , 1 );
2975+ #else
2976+ setenv ("MSYSTEM" , "MINGW32" , 1 );
2977+ #endif
2978+
2979+ if (home )
2980+ off += xsnprintf (buf + off , sizeof (buf ) - off ,
2981+ "%s\\bin;" , home );
2982+ off += append_system_bin_dirs (buf + off , sizeof (buf ) - off );
2983+ if (path )
2984+ off += xsnprintf (buf + off , sizeof (buf ) - off ,
2985+ "%s" , path );
2986+ else if (off > 0 )
2987+ buf [off - 1 ] = '\0' ;
2988+ else
2989+ buf [0 ] = '\0' ;
2990+ setenv ("PATH" , buf , 1 );
2991+ }
2992+ #endif
2993+
2994+ if (!getenv ("LC_ALL" ) && !getenv ("LC_CTYPE" ) && !getenv ("LANG" ))
2995+ setenv ("LC_CTYPE" , "C.UTF-8" , 1 );
29002996}
29012997
29022998static void get_current_user_sid (PSID * sid , HANDLE * linked_token )
0 commit comments