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