misc: gitlint: python code improvements

Signed-off-by: Philipp Schuster <philipp.schuster@cyberus-technology.de>
On-behalf-of: SAP philipp.schuster@sap.com
This commit is contained in:
Philipp Schuster 2025-11-13 13:24:03 +01:00 committed by Rob Bradford
parent 62345cd6fd
commit 02da2f2d36

View file

@ -1,6 +1,7 @@
# SPDX-License-Identifier: Apache-2.0
from gitlint.rules import LineRule, RuleViolation, CommitMessageBody
from typing import List, Optional
import re
@ -29,9 +30,23 @@ IGNORE_PREFIXES = [
"\t",
]
# Pattern allowing:
# - [0]: https://example.com
# - [0] https://example.com
# - https://example.com
LINK_REGEX = re.compile(r"^(([\[0-9]+]:?\s?)?https?://).*$")
MAX_LEN = 72
class BodyMaxLineLengthEx(LineRule):
"""A rule to enforce a line limit of 72 characters, except for valid cases."""
"""
A rule to enforce a line limit of 72 characters, except for valid cases:
- Markdown-style code blocks
- Commit tags, such as Signed-off-by
- Links
"""
# A rule MUST have a human friendly name
name = "body-max-line-length-ex"
@ -43,38 +58,34 @@ class BodyMaxLineLengthEx(LineRule):
# A line-rule MUST have a target (not required for CommitRules).
target = CommitMessageBody
max_len = 72
# Updated property as the commit messages is validated line by line.
inside_open_codeblock = False
def validate(self, line, commit):
# Pattern allowing:
# - [0]: https://foobar
# - [0] https://foobar
# - https://foobar
link_regex = re.compile(r"^((\[[0-9]+\]:?\s?)?https?:\/\/).*$")
def validate(self, line, commit) -> Optional[List[RuleViolation]]:
# We keep track of whether we are in an open code block.
is_codeblock_marker = line.startswith("```")
inside_open_codeblock_ = self.inside_open_codeblock
if is_codeblock_marker:
self.inside_open_codeblock = not self.inside_open_codeblock
if len(line) > self.max_len:
is_link = link_regex.match(line)
# Begin checks
if len(line) <= MAX_LEN:
return None
if inside_open_codeblock_:
return
if inside_open_codeblock_:
return None
if is_link:
return
if None is not LINK_REGEX.match(line):
return None
# Don't check lines with allowed prefixes
for prefix in IGNORE_PREFIXES:
if line.startswith(prefix):
return None
# Don't check lines with allowed prefixes
for prefix in IGNORE_PREFIXES:
if line.startswith(prefix):
return None
return [
RuleViolation(self.id, f"Line '{line}' exceeds limit of {self.max_len}")
]
return [
RuleViolation(
self.id,
f"Line '{line}' exceeds limit of {MAX_LEN}: {len(line)}",
)
]