Pre-commit fails for git >=2.25 if repo is on a Windows subst drive #1610
Comments
I've come across this because I'm having a similar issue with mapped network drives (e.g. net use). I've replicated your issue with pre-commit 2.8.1 and git 2.29.1. My fist stab at a solution that works in both git 2.17 and 2.29 is the following change to from pathlib import Path
toplevel = Path(git.get_root()).resolve()
os.chdir(toplevel)
args.config = os.path.relpath(Path(args.config).resolve()) Probably should have In the case of subst, |
Using def get_root() -> str:
try:
root = cmd_output('git', 'rev-parse', '--show-cdup')[1].strip()
except CalledProcessError:
raise FatalError(
'git failed. Is it installed, and are you in a Git repository '
'directory?',
)
if not root:
return os.getcwd()
return root The original failure mode (ie. issuing the command from in .git) will fail, but will be a non-zero return code from Git and be caught by CalledProcessError. |
can probably be |
yeah it's super old so that should be a fine patch!
|
I've pulled this into the project where the issue first arose and it's working beautifully - thank you! |
Cross reference for another issue with same apparent root cause: microsoft/vscode#100274 (comment)
Issue observed with pre-commit==2.7.1 and git 2.27.
Issue resolved with downgrading git to 2.21 (I only have access to certain versions on my work machine).
Steps to recreate for pre-commit (some taken from the above cross-reference):
Install git >= 2.25 on Windows
Create a subst drive (
mkdir C:\subst_dir && subst Z: C:\subst_dir
)Create a git repo in there (
mkdir Z:\repo && cd /d Z:\repo && git init
)Add some python code, configure pre-commit, and run pre-commit.
Failure observed:
An unexpected error has occurred: ValueError: path is on mount 'Z:', start on mount 'C:'
Diagnosis - it appears that the use of
git rev-parse --show-toplevel
inpre_commit.main.get_root()
is suffering the same issue as seen in cross-referenced ticket; git will "see through" the subst command and rather than return a path on the subst-defined Z: drive, it will return the path from the C: drive. With this, afterpre_commit.main._adjust_args_and_chdir()
callspre_commit.main.get_root()
and does a chdir to the returned location, the following call toos.path.relpath(args.config)
then fails with the ValueError as above, because it sees the path to the config file being onZ:
but the current location being onC:
.Afraid I don't have a suggested resolution but wanted to flag this up. I'm not too familiar with Windows systems and I'm a long way from Admin access on my work machine so opportunities for testing are limited; this was discovered as my scratch space for repos is a subst drive.
The text was updated successfully, but these errors were encountered: