Having a major.minor version of python in the shebangs, has the unwanted
side effect of requiring an uninstallation and then reinstallation
all the pre-commit hooks, once the system updates the python
installation to a newer minor version, since it will not find the
version which the shebangs specifies.
To make matters worse the uninstallation of the hooks has to be manual
since the script will not be able to run for the aforementioned reason.
This change makes the python symlink with just the major version as the
preferred choice over the major.minor version specified shebang.
Signed-off-by: Antonio Gutierrez <chibby0ne@gmail.com>
Git 2.25 introduced a change to "rev-parse --show-toplevel" that exposed underlying volumes for Windows drives mapped with SUBST. We use "rev-parse --show-cdup" to get the appropriate path, but must perform an extra check to see if we are in the .git directory.
Writing a test for this one is tricky, because I was seeing the issue
only when the directory being removed is a docker volume, so instead of
getting EACCES we get EPERM.
This is easy to reproduce though. The existing test fails when the
directory being used for the files is a docker volume:
```
% docker run \
-v $(mktemp -d):/tmp \
-v ${PWD}:/src \
-w /src \
python:3 \
bash -c 'pip install -e . && pip install -r requirements-dev.txt && python -m pytest tests/util_test.py'
```
When git status runs in a repo with submodules, it'll recursively run
git status in every submodule as well by default (sequentially).
git status is substantially slower on Windows than on Linux. git diff
behaves similarly to git status in terms of running recursively within
all submodules. In repos with hundreds of submodules, this quickly adds
up when git status/diff are called multiple times. Pre-commit runs
git status once at the beginning of an operation and then runs git diff
before and after each hook. These calls quickly add up and make
pre-commit unusable in large repos with lots of submodules.
This commit drastically improves performance in repos with lots of
submodules and fixes#1701 by telling git status and git diff to ignore
submodules. This change is not expected to have any negative effect on
existing hooks because each submodule should manage its own hooks
instead of relying on superproject hooks to manipulate their contents.