Repository: pre-commit/pre-commit
Pull request #2459 (2022-07-12 18:09:20)

adjust relative --commit-msg-filename if in subdir


Patch:
diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
index 511ffd5..94a35a7 100644
--- a/.pre-commit-config.yaml
+++ b/.pre-commit-config.yaml
@@ -14,7 +14,7 @@ repos:
     hooks:
     -   id: setup-cfg-fmt
 -   repo: https://github.com/asottile/reorder_python_imports
-    rev: v3.8.1
+    rev: v3.3.0
     hooks:
     -   id: reorder-python-imports
         exclude: ^(pre_commit/resources/|testing/resources/python3_hooks_repo/)
@@ -25,7 +25,7 @@ repos:
     -   id: add-trailing-comma
         args: [--py36-plus]
 -   repo: https://github.com/asottile/pyupgrade
-    rev: v2.37.1
+    rev: v2.34.0
     hooks:
     -   id: pyupgrade
         args: [--py37-plus]
diff --git a/pre_commit/main.py b/pre_commit/main.py
index b4fa966..3915993 100644
--- a/pre_commit/main.py
+++ b/pre_commit/main.py
@@ -155,6 +155,10 @@ def _adjust_args_and_chdir(args: argparse.Namespace) -> None:
         args.config = os.path.abspath(args.config)
     if args.command in {'run', 'try-repo'}:
         args.files = [os.path.abspath(filename) for filename in args.files]
+        if args.commit_msg_filename is not None:
+            args.commit_msg_filename = os.path.abspath(
+                args.commit_msg_filename,
+            )
     if args.command == 'try-repo' and os.path.exists(args.repo):
         args.repo = os.path.abspath(args.repo)
 
@@ -164,6 +168,10 @@ def _adjust_args_and_chdir(args: argparse.Namespace) -> None:
     args.config = os.path.relpath(args.config)
     if args.command in {'run', 'try-repo'}:
         args.files = [os.path.relpath(filename) for filename in args.files]
+        if args.commit_msg_filename is not None:
+            args.commit_msg_filename = os.path.relpath(
+                args.commit_msg_filename,
+            )
     if args.command == 'try-repo' and os.path.exists(args.repo):
         args.repo = os.path.relpath(args.repo)
 


Test patch:
diff --git a/tests/main_test.py b/tests/main_test.py
index a7afd6d..5115926 100644
--- a/tests/main_test.py
+++ b/tests/main_test.py
@@ -17,6 +17,8 @@ from testing.util import cwd
 def _args(**kwargs):
     kwargs.setdefault('command', 'help')
     kwargs.setdefault('config', C.CONFIG_FILE)
+    if kwargs['command'] in {'run', 'try-repo'}:
+        kwargs.setdefault('commit_msg_filename', None)
     return argparse.Namespace(**kwargs)
 
 
@@ -35,13 +37,24 @@ def test_adjust_args_and_chdir_noop(in_git_dir):
 
 def test_adjust_args_and_chdir_relative_things(in_git_dir):
     in_git_dir.join('foo/cfg.yaml').ensure()
-    in_git_dir.join('foo').chdir()
-
-    args = _args(command='run', files=['f1', 'f2'], config='cfg.yaml')
-    main._adjust_args_and_chdir(args)
-    assert os.getcwd() == in_git_dir
-    assert args.config == os.path.join('foo', 'cfg.yaml')
-    assert args.files == [os.path.join('foo', 'f1'), os.path.join('foo', 'f2')]
+    with in_git_dir.join('foo').as_cwd():
+        args = _args(command='run', files=['f1', 'f2'], config='cfg.yaml')
+        main._adjust_args_and_chdir(args)
+        assert os.getcwd() == in_git_dir
+        assert args.config == os.path.join('foo', 'cfg.yaml')
+        assert args.files == [
+            os.path.join('foo', 'f1'),
+            os.path.join('foo', 'f2'),
+        ]
+
+
+def test_adjust_args_and_chdir_relative_commit_msg(in_git_dir):
+    in_git_dir.join('foo/cfg.yaml').ensure()
+    with in_git_dir.join('foo').as_cwd():
+        args = _args(command='run', files=[], commit_msg_filename='t.txt')
+        main._adjust_args_and_chdir(args)
+        assert os.getcwd() == in_git_dir
+        assert args.commit_msg_filename == os.path.join('foo', 't.txt')
 
 
 @pytest.mark.skipif(os.name != 'nt', reason='windows feature')
@@ -56,24 +69,22 @@ def test_install_on_subst(in_git_dir, store):  # pragma: posix no cover
 
 
 def test_adjust_args_and_chdir_non_relative_config(in_git_dir):
-    in_git_dir.join('foo').ensure_dir().chdir()
-
-    args = _args()
-    main._adjust_args_and_chdir(args)
-    assert os.getcwd() == in_git_dir
-    assert args.config == C.CONFIG_FILE
+    with in_git_dir.join('foo').ensure_dir().as_cwd():
+        args = _args()
+        main._adjust_args_and_chdir(args)
+        assert os.getcwd() == in_git_dir
+        assert args.config == C.CONFIG_FILE
 
 
 def test_adjust_args_try_repo_repo_relative(in_git_dir):
-    in_git_dir.join('foo').ensure_dir().chdir()
-
-    args = _args(command='try-repo', repo='../foo', files=[])
-    assert args.repo is not None
-    assert os.path.exists(args.repo)
-    main._adjust_args_and_chdir(args)
-    assert os.getcwd() == in_git_dir
-    assert os.path.exists(args.repo)
-    assert args.repo == 'foo'
+    with in_git_dir.join('foo').ensure_dir().as_cwd():
+        args = _args(command='try-repo', repo='../foo', files=[])
+        assert args.repo is not None
+        assert os.path.exists(args.repo)
+        main._adjust_args_and_chdir(args)
+        assert os.getcwd() == in_git_dir
+        assert os.path.exists(args.repo)
+        assert args.repo == 'foo'
 
 
 FNS = (