summaryrefslogtreecommitdiffstats
path: root/pre_commit/git.py
diff options
context:
space:
mode:
Diffstat (limited to 'pre_commit/git.py')
-rw-r--r--pre_commit/git.py32
1 files changed, 21 insertions, 11 deletions
diff --git a/pre_commit/git.py b/pre_commit/git.py
index 13ba664..5096274 100644
--- a/pre_commit/git.py
+++ b/pre_commit/git.py
@@ -47,21 +47,26 @@ def no_git_env(
def get_root() -> str:
+ # 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.
try:
- root = cmd_output('git', 'rev-parse', '--show-toplevel')[1].strip()
+ root = os.path.realpath(
+ cmd_output('git', 'rev-parse', '--show-cdup')[1].strip(),
+ )
+ git_dir = os.path.realpath(get_git_dir())
except CalledProcessError:
raise FatalError(
'git failed. Is it installed, and are you in a Git repository '
'directory?',
)
- else:
- if root == '': # pragma: no cover (old git)
- raise FatalError(
- 'git toplevel unexpectedly empty! make sure you are not '
- 'inside the `.git` directory of your repository.',
- )
- else:
- return root
+ if os.path.commonpath((root, git_dir)) == git_dir:
+ raise FatalError(
+ 'git toplevel unexpectedly empty! make sure you are not '
+ 'inside the `.git` directory of your repository.',
+ )
+ return root
def get_git_dir(git_root: str = '.') -> str:
@@ -130,7 +135,9 @@ def get_staged_files(cwd: Optional[str] = None) -> List[str]:
def intent_to_add_files() -> List[str]:
- _, stdout, _ = cmd_output('git', 'status', '--porcelain', '-z')
+ _, stdout, _ = cmd_output(
+ 'git', 'status', '--ignore-submodules', '--porcelain', '-z',
+ )
parts = list(reversed(zsplit(stdout)))
intent_to_add = []
while parts:
@@ -199,7 +206,10 @@ def check_for_cygwin_mismatch() -> None:
"""See https://github.com/pre-commit/pre-commit/issues/354"""
if sys.platform in ('cygwin', 'win32'): # pragma: no cover (windows)
is_cygwin_python = sys.platform == 'cygwin'
- toplevel = get_root()
+ try:
+ toplevel = get_root()
+ except FatalError: # skip the check if we're not in a git repo
+ return
is_cygwin_git = toplevel.startswith('/')
if is_cygwin_python ^ is_cygwin_git: