Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix: Add missing warning for regular expression with [\\/] #2154

Merged
merged 2 commits into from Dec 5, 2021
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
38 changes: 14 additions & 24 deletions pre_commit/clientlib.py
Expand Up @@ -144,18 +144,13 @@ def check(self, dct: Dict[str, Any]) -> None:
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 [/\\]',
)
for fwd_slash_re in [r'[\\/]', r'[\/]', r'[/\\]']:
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this should be a tuple

while the code was originally written as separate if statements to make sure everything is covered, this is fine I guess

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed the first, and making excuses for the second:
Figured I'd remove some duplication, but if requested, I will revert it back to if statements.

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Also: should r'[\/]' trigger the warning at all? The matched character is a forward slash, mentioning "normalization to forward slashes" seems odd in this case.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is something I expected you to comment on, and I'm glad for that.

Since this was accepted in the previous pull request regarding these regexes, without any comments on the subject, I felt like confirming if this is meant to be a style guideline?
In this case, the warning would (sort of) make sense.

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hello, and thanks for working on this.

Yes, you’re right that pre-commit could warn about r'[\/]' as a suggestion about style (I assume the issue didn’t come up in the original PR for an oversight).
But in that case, I’d be more inclined to extract the check into a separate one, with its own proper message.

I understand that this could be quite a nit pick, and that grouping all the regexes under the same message would be equally acceptable, although a little less precise with regards to semantics.

@asottile any thoughts about this?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

yeah so admittedly the original task was a mistake on my part since r'[\/]' is the same as r'[/]' -- but since there's already several levels of where escaping is questionable (yaml rules, then python rules, then regex rules) I think it's still correct to warn about that

the flip r'[/\]' doesn't need a warning because it's an invalid regex (unclosed ]) so something will already let the user know something is broken

if fwd_slash_re in dct.get(self.key, ''):
logger.warning(
fr'pre-commit normalizes slashes in the {self.key!r} '
fr'field in hook {dct.get("id")!r} to forward slashes, '
fr'so you can use / instead of {fwd_slash_re}',
)


class OptionalSensibleRegexAtTop(cfgv.OptionalNoDefault):
Expand All @@ -167,18 +162,13 @@ def check(self, dct: Dict[str, Any]) -> None:
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 [/\\]',
)
for fwd_slash_re in [r'[\\/]', r'[\/]', r'[/\\]']:
if fwd_slash_re 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 '
fr'can use / instead of {fwd_slash_re}',
)


class MigrateShaToRev:
Expand Down
10 changes: 10 additions & 0 deletions tests/clientlib_test.py
Expand Up @@ -265,6 +265,11 @@ def test_warn_mutable_rev_conditional():
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):
Expand Down Expand Up @@ -295,6 +300,11 @@ def test_validate_optional_sensible_regex_at_hook(caplog, regex, warning):
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):
Expand Down