Repository: pre-commit/pre-commit
Pull request #2053 (2021-09-17 20:06:15)

Add warning for regular expression with [\/] (#2043)
Add warning about unnecessary slash regex as per #2043 


Patch:
diff --git a/pre_commit/clientlib.py b/pre_commit/clientlib.py
index bc7274a..7d87ee0 100644
--- a/pre_commit/clientlib.py
+++ b/pre_commit/clientlib.py
@@ -143,6 +143,18 @@ class OptionalSensibleRegexAtHook(cfgv.OptionalNoDefault):
                 f"regex, not a glob -- matching '/*' probably isn't what you "
                 f'want here',
             )
+        if r'[\/]' in dct.get(self.key, ''):
+            logger.warning(
+                fr'pre-commit normalizes slashes in the {self.key!r} field '
+                fr'in hook {dct.get("id")!r} to forward slashes, so you '
+                fr'can use / instead of [\/]',
+            )
+        if r'[/\\]' in dct.get(self.key, ''):
+            logger.warning(
+                fr'pre-commit normalizes slashes in the {self.key!r} field '
+                fr'in hook {dct.get("id")!r} to forward slashes, so you '
+                fr'can use / instead of [/\\]',
+            )
 
 
 class OptionalSensibleRegexAtTop(cfgv.OptionalNoDefault):
@@ -154,6 +166,18 @@ class OptionalSensibleRegexAtTop(cfgv.OptionalNoDefault):
                 f'The top-level {self.key!r} field is a regex, not a glob -- '
                 f"matching '/*' probably isn't what you want here",
             )
+        if r'[\/]' in dct.get(self.key, ''):
+            logger.warning(
+                fr'pre-commit normalizes the slashes in the top-level '
+                fr'{self.key!r} field to forward slashes, so you can use / '
+                fr'instead of [\/]',
+            )
+        if r'[/\\]' in dct.get(self.key, ''):
+            logger.warning(
+                fr'pre-commit normalizes the slashes in the top-level '
+                fr'{self.key!r} field to forward slashes, so you can use / '
+                fr'instead of [/\\]',
+            )
 
 
 class MigrateShaToRev:


Test patch:
diff --git a/tests/clientlib_test.py b/tests/clientlib_test.py
index da794e6..5427b1d 100644
--- a/tests/clientlib_test.py
+++ b/tests/clientlib_test.py
@@ -247,38 +247,64 @@ def test_warn_mutable_rev_conditional():
         cfgv.validate(config_obj, CONFIG_REPO_DICT)
 
 
-def test_validate_optional_sensible_regex_at_hook_level(caplog):
+@pytest.mark.parametrize(
+    ('regex', 'warning'),
+    (
+        (
+            r'dir/*.py',
+            "The 'files' field in hook 'flake8' is a regex, not a glob -- "
+            "matching '/*' probably isn't what you want here",
+        ),
+        (
+            r'dir[\/].*\.py',
+            r"pre-commit normalizes slashes in the 'files' field in hook "
+            r"'flake8' to forward slashes, so you can use / instead of [\/]",
+        ),
+        (
+            r'dir[/\\].*\.py',
+            r"pre-commit normalizes slashes in the 'files' field in hook "
+            r"'flake8' to forward slashes, so you can use / instead of [/\\]",
+        ),
+    ),
+)
+def test_validate_optional_sensible_regex_at_hook(caplog, regex, warning):
     config_obj = {
         'id': 'flake8',
-        'files': 'dir/*.py',
+        'files': regex,
     }
     cfgv.validate(config_obj, CONFIG_HOOK_DICT)
 
-    assert caplog.record_tuples == [
+    assert caplog.record_tuples == [('pre_commit', logging.WARNING, warning)]
+
+
+@pytest.mark.parametrize(
+    ('regex', 'warning'),
+    (
         (
-            'pre_commit',
-            logging.WARNING,
-            "The 'files' field in hook 'flake8' is a regex, not a glob -- "
+            r'dir/*.py',
+            "The top-level 'files' field is a regex, not a glob -- "
             "matching '/*' probably isn't what you want here",
         ),
-    ]
-
-
-def test_validate_optional_sensible_regex_at_top_level(caplog):
+        (
+            r'dir[\/].*\.py',
+            r"pre-commit normalizes the slashes in the top-level 'files' "
+            r'field to forward slashes, so you can use / instead of [\/]',
+        ),
+        (
+            r'dir[/\\].*\.py',
+            r"pre-commit normalizes the slashes in the top-level 'files' "
+            r'field to forward slashes, so you can use / instead of [/\\]',
+        ),
+    ),
+)
+def test_validate_optional_sensible_regex_at_top_level(caplog, regex, warning):
     config_obj = {
-        'files': 'dir/*.py',
+        'files': regex,
         'repos': [],
     }
     cfgv.validate(config_obj, CONFIG_SCHEMA)
 
-    assert caplog.record_tuples == [
-        (
-            'pre_commit',
-            logging.WARNING,
-            "The top-level 'files' field is a regex, not a glob -- matching "
-            "'/*' probably isn't what you want here",
-        ),
-    ]
+    assert caplog.record_tuples == [('pre_commit', logging.WARNING, warning)]
 
 
 @pytest.mark.parametrize('fn', (validate_config_main, validate_manifest_main))