summaryrefslogtreecommitdiffstats
path: root/gitlint-core/gitlint/deprecation.py
blob: b7c2f42e8de27254108126f84844fcbcdd4b6e68 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
import logging

LOG = logging.getLogger("gitlint.deprecated")
DEPRECATED_LOG_FORMAT = "%(levelname)s: %(message)s"


class Deprecation:
    """Singleton class that handles deprecation warnings and behavior."""

    # LintConfig class that is used to determine deprecation behavior
    config = None

    # Set of warning messages that have already been logged, to prevent duplicate warnings
    warning_msgs = set()

    @classmethod
    def get_regex_method(cls, rule, regex_option):
        """Returns the regex method to be used for a given rule based on general.regex-style-search option.
        Logs a warning if the deprecated re.match method is returned."""

        # if general.regex-style-search is set, just return re.search
        if cls.config.regex_style_search:
            return regex_option.value.search

        warning_msg = (
            f"{rule.id} - {rule.name}: gitlint will be switching from using Python regex 'match' (match beginning) to "
            "'search' (match anywhere) semantics. "
            f"Please review your {rule.name}.regex option accordingly. "
            "To remove this warning, set general.regex-style-search=True. "
            "More details: https://jorisroovers.github.io/gitlint/configuration/#regex-style-search"
        )

        # Only log warnings once
        if warning_msg not in cls.warning_msgs:
            log = logging.getLogger("gitlint.deprecated.regex_style_search")
            log.warning(warning_msg)
        cls.warning_msgs.add(warning_msg)

        return regex_option.value.match