@@ -2858,6 +2858,66 @@ int xwcstoutf(char *utf, const wchar_t *wcs, size_t utflen)
2858
2858
return -1 ;
2859
2859
}
2860
2860
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
+
2861
2921
static void setup_windows_environment (void )
2862
2922
{
2863
2923
char * tmp = getenv ("TMPDIR" );
@@ -2898,7 +2958,8 @@ static void setup_windows_environment(void)
2898
2958
strbuf_addstr (& buf , tmp );
2899
2959
if ((tmp = getenv ("HOMEPATH" ))) {
2900
2960
strbuf_addstr (& buf , tmp );
2901
- if (is_directory (buf .buf ))
2961
+ if (!is_system32_path (buf .buf ) &&
2962
+ is_directory (buf .buf ))
2902
2963
setenv ("HOME" , buf .buf , 1 );
2903
2964
else
2904
2965
tmp = NULL ; /* use $USERPROFILE */
@@ -2909,6 +2970,41 @@ static void setup_windows_environment(void)
2909
2970
if (!tmp && (tmp = getenv ("USERPROFILE" )))
2910
2971
setenv ("HOME" , tmp , 1 );
2911
2972
}
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 );
2912
3008
}
2913
3009
2914
3010
static void get_current_user_sid (PSID * sid , HANDLE * linked_token )
0 commit comments