@@ -37,7 +37,7 @@ static void print_error(LPCWSTR prefix, DWORD error_number)
37
37
LocalFree ((HLOCAL )buffer );
38
38
}
39
39
40
- static void setup_environment (LPWSTR exepath , int full_path )
40
+ static void setup_environment (LPWSTR top_level_path , int full_path )
41
41
{
42
42
WCHAR msystem [64 ];
43
43
LPWSTR path2 = NULL ;
@@ -90,22 +90,22 @@ static void setup_environment(LPWSTR exepath, int full_path)
90
90
len = GetEnvironmentVariable (L"PATH" , NULL , 0 );
91
91
len = sizeof (WCHAR ) * (len + 2 * MAX_PATH );
92
92
path2 = (LPWSTR )malloc (len );
93
- wcscpy (path2 , exepath );
93
+ wcscpy (path2 , top_level_path );
94
94
if (!full_path )
95
95
PathAppend (path2 , L"cmd;" );
96
96
else {
97
97
PathAppend (path2 , msystem_bin );
98
98
if (_waccess (path2 , 0 ) != -1 ) {
99
99
/* We are in an MSys2-based setup */
100
100
wcscat (path2 , L";" );
101
- wcscat (path2 , exepath );
101
+ wcscat (path2 , top_level_path );
102
102
PathAppend (path2 , L"usr\\bin;" );
103
103
}
104
104
else {
105
105
/* Fall back to MSys1 paths */
106
- wcscpy (path2 , exepath );
106
+ wcscpy (path2 , top_level_path );
107
107
PathAppend (path2 , L"bin;" );
108
- wcscat (path2 , exepath );
108
+ wcscat (path2 , top_level_path );
109
109
PathAppend (path2 , L"mingw\\bin;" );
110
110
}
111
111
}
@@ -422,18 +422,59 @@ static int configure_via_resource(LPWSTR basename, LPWSTR exepath, LPWSTR exep,
422
422
return 1 ;
423
423
}
424
424
425
+ static void initialize_top_level_path (LPWSTR top_level_path , LPWSTR exepath ,
426
+ LPWSTR msystem_bin , int strip_count )
427
+ {
428
+ wcscpy (top_level_path , exepath );
429
+
430
+ while (strip_count ) {
431
+ if (strip_count < 0 ) {
432
+ int len = wcslen (top_level_path );
433
+ PathAppend (top_level_path , msystem_bin );
434
+ if (_waccess (top_level_path , 0 ) != -1 ) {
435
+ /* We are in an MSys2-based setup */
436
+ top_level_path [len ] = L'\0' ;
437
+ return ;
438
+ }
439
+ top_level_path [len ] = L'\0' ;
440
+ PathAppend (top_level_path , L"mingw\\bin" );
441
+ if (_waccess (top_level_path , 0 ) != -1 ) {
442
+ /* We are in an MSys-based setup */
443
+ top_level_path [len ] = L'\0' ;
444
+ return ;
445
+ }
446
+ top_level_path [len ] = L'\0' ;
447
+ if (!(++ strip_count )) {
448
+ fwprintf (stderr , L"Top-level not found: %s\n" ,
449
+ exepath );
450
+ exit (1 );
451
+ }
452
+ }
453
+
454
+ if (!PathRemoveFileSpec (top_level_path )) {
455
+ fwprintf (stderr , L"Invalid executable path: %s\n" ,
456
+ exepath );
457
+ ExitProcess (1 );
458
+ }
459
+
460
+ if (strip_count > 0 )
461
+ -- strip_count ;
462
+ }
463
+ }
464
+
425
465
int main (void )
426
466
{
427
467
int r = 1 , wait = 1 , prefix_args_len = -1 , needs_env_setup = 1 ,
428
468
is_git_command = 1 , full_path = 1 , skip_arguments = 0 ,
429
469
allocate_console = 0 , show_console = 0 ;
430
- WCHAR exepath [MAX_PATH ], exe [MAX_PATH ];
470
+ WCHAR exepath [MAX_PATH ], exe [MAX_PATH ], top_level_path [ MAX_PATH ] ;
431
471
LPWSTR cmd = NULL , exep = exe , prefix_args = NULL , basename ;
432
472
LPWSTR working_directory = NULL ;
433
473
434
474
/* Determine MSys2-based Git path. */
435
475
swprintf (msystem_bin , sizeof (msystem_bin ),
436
476
L"mingw%d\\bin" , (int ) sizeof (void * ) * 8 );
477
+ * top_level_path = L'\0' ;
437
478
438
479
/* get the installation location */
439
480
GetModuleFileName (NULL , exepath , MAX_PATH );
@@ -453,25 +494,23 @@ int main(void)
453
494
static WCHAR buffer [BUFSIZE ];
454
495
wait = 0 ;
455
496
allocate_console = 1 ;
456
- if (!PathRemoveFileSpec (exepath )) {
457
- fwprintf (stderr ,
458
- L"Invalid executable path: %s\n" , exepath );
459
- ExitProcess (1 );
460
- }
497
+ initialize_top_level_path (top_level_path , exepath , NULL , 1 );
461
498
462
499
/* set the default exe module */
463
- wcscpy (exe , exepath );
500
+ wcscpy (exe , top_level_path );
464
501
PathAppend (exe , msystem_bin );
465
502
PathAppend (exe , L"wish.exe" );
466
503
if (_waccess (exe , 0 ) != -1 )
467
504
swprintf (buffer , BUFSIZE ,
468
505
L"\"%s\\%.*s\\libexec\\git-core\"" ,
469
- exepath , wcslen (msystem_bin ) - 4 , msystem_bin );
506
+ top_level_path ,
507
+ wcslen (msystem_bin ) - 4 , msystem_bin );
470
508
else {
471
- wcscpy (exe , exepath );
509
+ wcscpy (exe , top_level_path );
472
510
PathAppend (exe , L"mingw\\bin\\wish.exe" );
473
511
swprintf (buffer , BUFSIZE ,
474
- L"\"%s\\mingw\\libexec\\git-core\"" , exepath );
512
+ L"\"%s\\mingw\\libexec\\git-core\"" ,
513
+ top_level_path );
475
514
}
476
515
PathAppend (buffer , L"git-gui" );
477
516
prefix_args = buffer ;
@@ -491,39 +530,31 @@ int main(void)
491
530
PathAppend (exe , L"git.exe" );
492
531
}
493
532
else if (!wcsicmp (basename , L"git.exe" )) {
494
- if (!PathRemoveFileSpec (exepath )) {
495
- fwprintf (stderr ,
496
- L"Invalid executable path: %s\n" , exepath );
497
- ExitProcess (1 );
498
- }
533
+ initialize_top_level_path (top_level_path , exepath , NULL , 1 );
499
534
500
535
/* set the default exe module */
501
- wcscpy (exe , exepath );
536
+ wcscpy (exe , top_level_path );
502
537
PathAppend (exe , msystem_bin );
503
538
PathAppend (exe , L"git.exe" );
504
539
if (_waccess (exe , 0 ) == -1 ) {
505
- wcscpy (exe , exepath );
540
+ wcscpy (exe , top_level_path );
506
541
PathAppend (exe , L"bin\\git.exe" );
507
542
}
508
543
}
509
544
else if (!wcsicmp (basename , L"gitk.exe" )) {
510
545
static WCHAR buffer [BUFSIZE ];
511
546
allocate_console = 1 ;
512
- if (!PathRemoveFileSpec (exepath )) {
513
- fwprintf (stderr ,
514
- L"Invalid executable path: %s\n" , exepath );
515
- ExitProcess (1 );
516
- }
547
+ initialize_top_level_path (top_level_path , exepath , NULL , 1 );
517
548
518
549
/* set the default exe module */
519
- wcscpy (exe , exepath );
520
- swprintf (buffer , BUFSIZE , L"\"%s\"" , exepath );
550
+ wcscpy (exe , top_level_path );
551
+ swprintf (buffer , BUFSIZE , L"\"%s\"" , top_level_path );
521
552
PathAppend (exe , msystem_bin );
522
553
PathAppend (exe , L"wish.exe" );
523
554
if (_waccess (exe , 0 ) != -1 )
524
555
PathAppend (buffer , msystem_bin );
525
556
else {
526
- wcscpy (exe , exepath );
557
+ wcscpy (exe , top_level_path );
527
558
PathAppend (exe , L"mingw\\bin\\wish.exe" );
528
559
PathAppend (buffer , L"mingw\\bin" );
529
560
}
@@ -532,8 +563,13 @@ int main(void)
532
563
prefix_args_len = wcslen (buffer );
533
564
}
534
565
535
- if (needs_env_setup )
536
- setup_environment (exepath , full_path );
566
+ if (needs_env_setup ) {
567
+ if (!top_level_path [0 ])
568
+ initialize_top_level_path (top_level_path , exepath ,
569
+ msystem_bin , -4 );
570
+
571
+ setup_environment (top_level_path , full_path );
572
+ }
537
573
cmd = fixup_commandline (exepath , & exep , & wait ,
538
574
prefix_args , prefix_args_len , is_git_command , skip_arguments );
539
575
0 commit comments