blob: 8f5b51f5f795552904069adfeffafae6f3369e2a [file] [log] [blame]
import re
from gitlint.rules import CommitRule, RuleViolation
from gitlint.options import IntOption
class BodyMaxLineLengthWithExceptions(CommitRule):
name = "body-max-line-length-with-exceptions"
id = "UC1"
options_spec = [IntOption("line-length", 80, "Max line length")]
line_length_violation_message = """Line exceeds max length ({0}>{1}).
It's possible you intended to use one of the following exceptions:
1. Put logs or shell script in a quoted section with triple quotes (''') before and after the section
2. Put a long link at the bottom in a footnote. example: [1] https://my_long_link.com
Line that was too long:
"""
tabs_violation_message = "Line contains hard tab characters (\\t)"
def validate(self, commit):
in_block_comment = False
for line in commit.message.body:
# allow a quoted string to be over the line limit
if (
line.startswith("'''")
or line.startswith('"""')
or line.startswith("```")
):
in_block_comment = not in_block_comment
if in_block_comment:
continue
if "\t" in line:
return [RuleViolation(self.id, self.tabs_violation_message, line)]
# allow footnote url links to be as long as needed example
# [1] http://www.myspace.com
ret = re.match(r"^\[\d+\]:? ", line)
if ret is not None:
continue
# allow signed-off-by
if line.startswith("Signed-off-by:"):
continue
max_length = self.options["line-length"].value
if len(line) > max_length:
return [
RuleViolation(
self.id,
self.line_length_violation_message.format(
len(line), max_length
),
line,
)
]
return None