You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Pre-commit fails for git >=2.25 if repo is on a Windows subst drive #1610
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 in pre_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, after pre_commit.main._adjust_args_and_chdir() calls pre_commit.main.get_root() and does a chdir to the returned location, the following call to os.path.relpath(args.config) then fails with the ValueError as above, because it sees the path to the config file being on Z: but the current location being on C:.
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.
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 pre_commit.main._adjust_args_and_chdir:
Probably should have if sys.platform == "win32" in there.
In the case of subst, Path.resolve will give the underlying location C:\subst_dir. For mapped drives it will return the network path, e.g. \\MyServer\Directory.
Using --show-cdup instead of --show-toplevel, as was suggested in the VSCode issue listed in the OP, is worth considering.
defget_root() ->str:
try:
root=cmd_output('git', 'rev-parse', '--show-cdup')[1].strip()
exceptCalledProcessError:
raiseFatalError(
'git failed. Is it installed, and are you in a Git repository ''directory?',
)
ifnotroot:
returnos.getcwd()
returnroot
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 return os.path.abspath(root) to retain the original behaviour -- one thing to check would be the version in which --show-cdup was added in case that limits compatibility (but as long as it's sufficiently old it should be fine without needing a fallback)
Activity
christopherdoyle commentedon Oct 30, 2020
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
pre_commit.main._adjust_args_and_chdir:Probably should have
if sys.platform == "win32"in there.In the case of subst,
Path.resolvewill give the underlying locationC:\subst_dir. For mapped drives it will return the network path, e.g.\\MyServer\Directory.mrogaski commentedon Dec 6, 2020
Using
--show-cdupinstead of--show-toplevel, as was suggested in the VSCode issue listed in the OP, is worth considering.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.
asottile commentedon Dec 6, 2020
can probably be
return os.path.abspath(root)to retain the original behaviour -- one thing to check would be the version in which--show-cdupwas added in case that limits compatibility (but as long as it's sufficiently old it should be fine without needing a fallback)asottile commentedon Dec 6, 2020
yeah it's super old so that should be a fine patch!
jcameron73 commentedon Dec 12, 2020
I've pulled this into the project where the issue first arose and it's working beautifully - thank you!