@@ -2903,6 +2903,66 @@ int xwcstoutf(char *utf, const wchar_t *wcs, size_t utflen)
2903
2903
return -1 ;
2904
2904
}
2905
2905
2906
+ #ifdef ENSURE_MSYSTEM_IS_SET
2907
+ #if !defined(RUNTIME_PREFIX ) || !defined(HAVE_WPGMPTR )
2908
+ static size_t append_system_bin_dirs (char * path UNUSED , size_t size UNUSED )
2909
+ {
2910
+ return 0 ;
2911
+ }
2912
+ #else
2913
+ static size_t append_system_bin_dirs (char * path , size_t size )
2914
+ {
2915
+ char prefix [32768 ];
2916
+ const char * slash ;
2917
+ size_t len = xwcstoutf (prefix , _wpgmptr , sizeof (prefix )), off = 0 ;
2918
+
2919
+ if (len == 0 || len >= sizeof (prefix ) ||
2920
+ !(slash = find_last_dir_sep (prefix )))
2921
+ return 0 ;
2922
+ /* strip trailing `git.exe` */
2923
+ len = slash - prefix ;
2924
+
2925
+ /* strip trailing `cmd` or `mingw64\bin` or `mingw32\bin` or `bin` or `libexec\git-core` */
2926
+ if (strip_suffix_mem (prefix , & len , "\\mingw64\\libexec\\git-core" ) ||
2927
+ strip_suffix_mem (prefix , & len , "\\mingw64\\bin" ))
2928
+ off += xsnprintf (path + off , size - off ,
2929
+ "%.*s\\mingw64\\bin;" , (int )len , prefix );
2930
+ else if (strip_suffix_mem (prefix , & len , "\\clangarm64\\libexec\\git-core" ) ||
2931
+ strip_suffix_mem (prefix , & len , "\\clangarm64\\bin" ))
2932
+ off += xsnprintf (path + off , size - off ,
2933
+ "%.*s\\clangarm64\\bin;" , (int )len , prefix );
2934
+ else if (strip_suffix_mem (prefix , & len , "\\mingw32\\libexec\\git-core" ) ||
2935
+ strip_suffix_mem (prefix , & len , "\\mingw32\\bin" ))
2936
+ off += xsnprintf (path + off , size - off ,
2937
+ "%.*s\\mingw32\\bin;" , (int )len , prefix );
2938
+ else if (strip_suffix_mem (prefix , & len , "\\cmd" ) ||
2939
+ strip_suffix_mem (prefix , & len , "\\bin" ) ||
2940
+ strip_suffix_mem (prefix , & len , "\\libexec\\git-core" ))
2941
+ off += xsnprintf (path + off , size - off ,
2942
+ "%.*s\\mingw%d\\bin;" , (int )len , prefix ,
2943
+ (int )(sizeof (void * ) * 8 ));
2944
+ else
2945
+ return 0 ;
2946
+
2947
+ off += xsnprintf (path + off , size - off ,
2948
+ "%.*s\\usr\\bin;" , (int )len , prefix );
2949
+ return off ;
2950
+ }
2951
+ #endif
2952
+ #endif
2953
+
2954
+ static int is_system32_path (const char * path )
2955
+ {
2956
+ WCHAR system32 [MAX_PATH ], wpath [MAX_PATH ];
2957
+
2958
+ if (xutftowcs_path (wpath , path ) < 0 ||
2959
+ !GetSystemDirectoryW (system32 , ARRAY_SIZE (system32 )) ||
2960
+ _wcsicmp (system32 , wpath ))
2961
+ return 0 ;
2962
+
2963
+ return 1 ;
2964
+ }
2965
+
2906
2966
static void setup_windows_environment (void )
2907
2967
{
2908
2968
char * tmp = getenv ("TMPDIR" );
@@ -2943,7 +3003,8 @@ static void setup_windows_environment(void)
2943
3003
strbuf_addstr (& buf , tmp );
2944
3004
if ((tmp = getenv ("HOMEPATH" ))) {
2945
3005
strbuf_addstr (& buf , tmp );
2946
- if (is_directory (buf .buf ))
3006
+ if (!is_system32_path (buf .buf ) &&
3007
+ is_directory (buf .buf ))
2947
3008
setenv ("HOME" , buf .buf , 1 );
2948
3009
else
2949
3010
tmp = NULL ; /* use $USERPROFILE */
@@ -2954,6 +3015,41 @@ static void setup_windows_environment(void)
2954
3015
if (!tmp && (tmp = getenv ("USERPROFILE" )))
2955
3016
setenv ("HOME" , tmp , 1 );
2956
3017
}
3018
+
3019
+ if (!getenv ("PLINK_PROTOCOL" ))
3020
+ setenv ("PLINK_PROTOCOL" , "ssh" , 0 );
3021
+
3022
+ #ifdef ENSURE_MSYSTEM_IS_SET
3023
+ if (!(tmp = getenv ("MSYSTEM" )) || !tmp [0 ]) {
3024
+ const char * home = getenv ("HOME" ), * path = getenv ("PATH" );
3025
+ char buf [32768 ];
3026
+ size_t off = 0 ;
3027
+
3028
+ #if defined(__aarch64__ ) || defined(_M_ARM64 ) || defined(_M_ARM64EC )
3029
+ setenv ("MSYSTEM" , "CLANGARM64" , 1 );
3030
+ #elif defined(__MINGW64__ ) || defined(_M_AMD64 )
3031
+ setenv ("MSYSTEM" , "MINGW64" , 1 );
3032
+ #else
3033
+ setenv ("MSYSTEM" , "MINGW32" , 1 );
3034
+ #endif
3035
+
3036
+ if (home )
3037
+ off += xsnprintf (buf + off , sizeof (buf ) - off ,
3038
+ "%s\\bin;" , home );
3039
+ off += append_system_bin_dirs (buf + off , sizeof (buf ) - off );
3040
+ if (path )
3041
+ off += xsnprintf (buf + off , sizeof (buf ) - off ,
3042
+ "%s" , path );
3043
+ else if (off > 0 )
3044
+ buf [off - 1 ] = '\0' ;
3045
+ else
3046
+ buf [0 ] = '\0' ;
3047
+ setenv ("PATH" , buf , 1 );
3048
+ }
3049
+ #endif
3050
+
3051
+ if (!getenv ("LC_ALL" ) && !getenv ("LC_CTYPE" ) && !getenv ("LANG" ))
3052
+ setenv ("LC_CTYPE" , "C.UTF-8" , 1 );
2957
3053
}
2958
3054
2959
3055
static void get_current_user_sid (PSID * sid , HANDLE * linked_token )
0 commit comments