File tree Expand file tree Collapse file tree 3 files changed +37
-0
lines changed Expand file tree Collapse file tree 3 files changed +37
-0
lines changed Original file line number Diff line number Diff line change @@ -341,6 +341,27 @@ int mingw_rmdir(const char *pathname)
341
341
{
342
342
int ret , tries = 0 ;
343
343
wchar_t wpathname [MAX_PATH ];
344
+ struct stat st ;
345
+
346
+ /*
347
+ * Contrary to Linux' `rmdir()`, Windows' _wrmdir() and _rmdir()
348
+ * (and `RemoveDirectoryW()`) will attempt to remove the target of a
349
+ * symbolic link (if it points to a directory).
350
+ *
351
+ * This behavior breaks the assumption of e.g. `remove_path()` which
352
+ * upon successful deletion of a file will attempt to remove its parent
353
+ * directories recursively until failure (which usually happens when
354
+ * the directory is not empty).
355
+ *
356
+ * Therefore, before calling `_wrmdir()`, we first check if the path is
357
+ * a symbolic link. If it is, we exit and return the same error as
358
+ * Linux' `rmdir()` would, i.e. `ENOTDIR`.
359
+ */
360
+ if (!mingw_lstat (pathname , & st ) && S_ISLNK (st .st_mode )) {
361
+ errno = ENOTDIR ;
362
+ return -1 ;
363
+ }
364
+
344
365
if (xutftowcs_path (wpathname , pathname ) < 0 )
345
366
return -1 ;
346
367
Original file line number Diff line number Diff line change @@ -406,4 +406,14 @@ test_expect_success 'refuse to switch to branch checked out elsewhere' '
406
406
test_i18ngrep "already checked out" err
407
407
'
408
408
409
+ test_expect_success MINGW,SYMLINKS_WINDOWS ' rebase when .git/logs is a symlink' '
410
+ git checkout main &&
411
+ mv .git/logs actual_logs &&
412
+ cmd //c "mklink /D .git\logs ..\actual_logs" &&
413
+ git rebase -f HEAD^ &&
414
+ test -L .git/logs &&
415
+ rm .git/logs &&
416
+ mv actual_logs .git/logs
417
+ '
418
+
409
419
test_done
Original file line number Diff line number Diff line change @@ -1513,6 +1513,12 @@ test_lazy_prereq SYMLINKS '
1513
1513
ln -s x y && test -h y
1514
1514
'
1515
1515
1516
+ test_lazy_prereq SYMLINKS_WINDOWS '
1517
+ # test whether symbolic links are enabled on Windows
1518
+ test_have_prereq MINGW &&
1519
+ cmd //c "mklink y x" &> /dev/null && test -h y
1520
+ '
1521
+
1516
1522
test_lazy_prereq FILEMODE '
1517
1523
test "$(git config --bool core.filemode)" = true
1518
1524
'
You can’t perform that action at this time.
0 commit comments