From: Johannes Schindelin <johannes.schindelin@xxxxxx> On Windows, we use a POSIX emulation layer, the MSYS2 runtime, to allow for running shell scripts (albeit at a hefty performance cost, Git's test suite takes ~700 seconds to complete on Linux, according to Git's CI runs, while it takes more than 6,000 seconds on Windows). This emulation layer has a funny quirk when it comes to `chmod` invocations: it pretends that it succeeded, when in reality it did not do a thing (because the Access Control Lists used in Windows' permission model are so different to Unix' default permission model that Git's test suite assumes to be in effect). Git's test suite relies on this quirk by assuming that the `chmod` calls in `test_chmod` and `test_write_script` simply succeed on Windows (without actually doing anything). However, this quirk is only in effect as long as `chmod` is run inside the pseudo Unix root directory structure or within the home directory. When run outside, such invocations fail like this: chmod: changing permissions of '<file>': Invalid argument Now, when running Git's tests in, say, Visual Studio, we frequently are in a worktree where the `chmod` invocations would fail. Let's accommodate for that by explicitly skipping those `chmod` invocations on Windows. Signed-off-by: Johannes Schindelin <johannes.schindelin@xxxxxx> --- t/test-lib-functions.sh | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/t/test-lib-functions.sh b/t/test-lib-functions.sh index 6da7273f1d5..7c63b22acab 100644 --- a/t/test-lib-functions.sh +++ b/t/test-lib-functions.sh @@ -492,7 +492,10 @@ test_commit_bulk () { # of a file in the working directory and add it to the index. test_chmod () { - chmod "$@" && + if test_have_prereq !MINGW + then + chmod "$@" + fi && git update-index --add "--chmod=$@" } @@ -548,7 +551,10 @@ write_script () { echo "#!${2-"$SHELL_PATH"}" && cat } >"$1" && - chmod +x "$1" + if test_have_prereq !MINGW + then + chmod +x "$1" + fi } # Usage: test_hook [options] <hook-name> <<-\EOF -- gitgitgadget