]> git.ipfire.org Git - thirdparty/git.git/commit - t/test-lib.sh
mingw: align symlinks-related rmdir() behavior with Linux
authorThomas Bétous <tomspycell@gmail.com>
Mon, 2 Aug 2021 21:07:30 +0000 (21:07 +0000)
committerJunio C Hamano <gitster@pobox.com>
Mon, 2 Aug 2021 22:10:58 +0000 (15:10 -0700)
commit3e7d4888e5b83f1ed75667ff557b8996f427adf0
tree558f1c282646845fd7a5a406f5b8e286293b29e2
parentebf3c04b262aa27fbb97f8a0156c2347fecafafb
mingw: align symlinks-related rmdir() behavior with Linux

When performing a rebase, rmdir() is called on the folder .git/logs. On
Unix rmdir() exits without deleting anything in case .git/logs is a
symbolic link but the equivalent functions on Windows (_rmdir, _wrmdir
and RemoveDirectoryW) do not behave the same and remove the folder if it
is symlinked even if it is not empty.

This creates issues when folders in .git/ are symlinks which is
especially the case when git-repo[1] is used: It replaces `.git/logs/`
with a symlink.

One such issue is that the _target_ of that symlink is removed e.g.
during a `git rebase`, where `delete_reflog("REBASE_HEAD")` will not
only try to remove `.git/logs/REBASE_HEAD` but then recursively try to
remove the parent directories until an error occurs, a technique that
obviously relies on `rmdir()` refusing to remove a symlink.

This was reported in https://github.com/git-for-windows/git/issues/2967.

This commit updates mingw_rmdir() so that its behavior is the same as
Linux rmdir() in case of symbolic links.

To verify that Git does not regress on the reported issue, this patch
adds a regression test for the `git rebase` symptom, even if the same
`rmdir()` behavior is quite likely to cause potential problems in other
Git commands as well.

[1]: git-repo is a python tool built on top of Git which helps manage
many Git repositories. It stores all the .git/ folders in a central
place by taking advantage of symbolic links.
More information: https://gerrit.googlesource.com/git-repo/

Signed-off-by: Thomas Bétous <tomspycell@gmail.com>
Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
compat/mingw.c
t/t3400-rebase.sh
t/test-lib.sh