@@ -2860,6 +2860,66 @@ int xwcstoutf(char *utf, const wchar_t *wcs, size_t utflen)
28602860 return -1 ;
28612861}
28622862
2863+ #ifdef ENSURE_MSYSTEM_IS_SET
2864+ #if !defined(RUNTIME_PREFIX ) || !defined(HAVE_WPGMPTR )
2865+ static size_t append_system_bin_dirs (char * path UNUSED , size_t size UNUSED )
2866+ {
2867+ return 0 ;
2868+ }
2869+ #else
2870+ static size_t append_system_bin_dirs (char * path , size_t size )
2871+ {
2872+ char prefix [32768 ];
2873+ const char * slash ;
2874+ size_t len = xwcstoutf (prefix , _wpgmptr , sizeof (prefix )), off = 0 ;
2875+
2876+ if (len == 0 || len >= sizeof (prefix ) ||
2877+ !(slash = find_last_dir_sep (prefix )))
2878+ return 0 ;
2879+ /* strip trailing `git.exe` */
2880+ len = slash - prefix ;
2881+
2882+ /* strip trailing `cmd` or `mingw64\bin` or `mingw32\bin` or `bin` or `libexec\git-core` */
2883+ if (strip_suffix_mem (prefix , & len , "\\mingw64\\libexec\\git-core" ) ||
2884+ strip_suffix_mem (prefix , & len , "\\mingw64\\bin" ))
2885+ off += xsnprintf (path + off , size - off ,
2886+ "%.*s\\mingw64\\bin;" , (int )len , prefix );
2887+ else if (strip_suffix_mem (prefix , & len , "\\clangarm64\\libexec\\git-core" ) ||
2888+ strip_suffix_mem (prefix , & len , "\\clangarm64\\bin" ))
2889+ off += xsnprintf (path + off , size - off ,
2890+ "%.*s\\clangarm64\\bin;" , (int )len , prefix );
2891+ else if (strip_suffix_mem (prefix , & len , "\\mingw32\\libexec\\git-core" ) ||
2892+ strip_suffix_mem (prefix , & len , "\\mingw32\\bin" ))
2893+ off += xsnprintf (path + off , size - off ,
2894+ "%.*s\\mingw32\\bin;" , (int )len , prefix );
2895+ else if (strip_suffix_mem (prefix , & len , "\\cmd" ) ||
2896+ strip_suffix_mem (prefix , & len , "\\bin" ) ||
2897+ strip_suffix_mem (prefix , & len , "\\libexec\\git-core" ))
2898+ off += xsnprintf (path + off , size - off ,
2899+ "%.*s\\mingw%d\\bin;" , (int )len , prefix ,
2900+ (int )(sizeof (void * ) * 8 ));
2901+ else
2902+ return 0 ;
2903+
2904+ off += xsnprintf (path + off , size - off ,
2905+ "%.*s\\usr\\bin;" , (int )len , prefix );
2906+ return off ;
2907+ }
2908+ #endif
2909+ #endif
2910+
2911+ static int is_system32_path (const char * path )
2912+ {
2913+ WCHAR system32 [MAX_PATH ], wpath [MAX_PATH ];
2914+
2915+ if (xutftowcs_path (wpath , path ) < 0 ||
2916+ !GetSystemDirectoryW (system32 , ARRAY_SIZE (system32 )) ||
2917+ _wcsicmp (system32 , wpath ))
2918+ return 0 ;
2919+
2920+ return 1 ;
2921+ }
2922+
28632923static void setup_windows_environment (void )
28642924{
28652925 char * tmp = getenv ("TMPDIR" );
@@ -2900,7 +2960,8 @@ static void setup_windows_environment(void)
29002960 strbuf_addstr (& buf , tmp );
29012961 if ((tmp = getenv ("HOMEPATH" ))) {
29022962 strbuf_addstr (& buf , tmp );
2903- if (is_directory (buf .buf ))
2963+ if (!is_system32_path (buf .buf ) &&
2964+ is_directory (buf .buf ))
29042965 setenv ("HOME" , buf .buf , 1 );
29052966 else
29062967 tmp = NULL ; /* use $USERPROFILE */
@@ -2911,6 +2972,41 @@ static void setup_windows_environment(void)
29112972 if (!tmp && (tmp = getenv ("USERPROFILE" )))
29122973 setenv ("HOME" , tmp , 1 );
29132974 }
2975+
2976+ if (!getenv ("PLINK_PROTOCOL" ))
2977+ setenv ("PLINK_PROTOCOL" , "ssh" , 0 );
2978+
2979+ #ifdef ENSURE_MSYSTEM_IS_SET
2980+ if (!(tmp = getenv ("MSYSTEM" )) || !tmp [0 ]) {
2981+ const char * home = getenv ("HOME" ), * path = getenv ("PATH" );
2982+ char buf [32768 ];
2983+ size_t off = 0 ;
2984+
2985+ #if defined(__aarch64__ ) || defined(_M_ARM64 ) || defined(_M_ARM64EC )
2986+ setenv ("MSYSTEM" , "CLANGARM64" , 1 );
2987+ #elif defined(__MINGW64__ ) || defined(_M_AMD64 )
2988+ setenv ("MSYSTEM" , "MINGW64" , 1 );
2989+ #else
2990+ setenv ("MSYSTEM" , "MINGW32" , 1 );
2991+ #endif
2992+
2993+ if (home )
2994+ off += xsnprintf (buf + off , sizeof (buf ) - off ,
2995+ "%s\\bin;" , home );
2996+ off += append_system_bin_dirs (buf + off , sizeof (buf ) - off );
2997+ if (path )
2998+ off += xsnprintf (buf + off , sizeof (buf ) - off ,
2999+ "%s" , path );
3000+ else if (off > 0 )
3001+ buf [off - 1 ] = '\0' ;
3002+ else
3003+ buf [0 ] = '\0' ;
3004+ setenv ("PATH" , buf , 1 );
3005+ }
3006+ #endif
3007+
3008+ if (!getenv ("LC_ALL" ) && !getenv ("LC_CTYPE" ) && !getenv ("LANG" ))
3009+ setenv ("LC_CTYPE" , "C.UTF-8" , 1 );
29143010}
29153011
29163012static void get_current_user_sid (PSID * sid , HANDLE * linked_token )
0 commit comments