Source code for semantic_release.history.parser_tag
"""Legacy commit parser from Python Semantic Release 1.0"""
import logging
import re
from typing import Optional
from ..errors import UnknownCommitMessageStyleError
from ..helpers import LoggedFunction
from ..settings import config
from .parser_helpers import ParsedCommit, parse_paragraphs, re_breaking
logger = logging.getLogger(__name__)
re_parser = re.compile(r"(?P<subject>[^\n]+)" r"(:?\n\n(?P<text>.+))?", re.DOTALL)
[docs]@LoggedFunction(logger)
def parse_commit_message(
message: str,
) -> ParsedCommit:
"""
Parse a commit message according to the 1.0 version of python-semantic-release.
It expects a tag of some sort in the commit message and will use the rest of the first line
as changelog content.
:param message: A string of a commit message.
:raises UnknownCommitMessageStyleError: If it does not recognise the commit style
:return: A tuple of (level to bump, type of change, scope of change, a tuple with descriptions)
"""
# Attempt to parse the commit message with a regular expression
parsed = re_parser.match(message)
if not parsed:
raise UnknownCommitMessageStyleError(
f"Unable to parse the given commit message: {message}"
)
subject = parsed.group("subject")
# Check tags for minor or patch
if config.get("minor_tag") in message:
level = "feature"
level_bump = 2
if subject:
subject = subject.replace(config.get("minor_tag"), "")
elif config.get("fix_tag") in message:
level = "fix"
level_bump = 1
if subject:
subject = subject.replace(config.get("fix_tag"), "")
else:
# We did not find any tags in the commit message
raise UnknownCommitMessageStyleError(
f"Unable to parse the given commit message: {message}"
)
if parsed.group("text"):
descriptions = parse_paragraphs(parsed.group("text"))
else:
descriptions = list()
descriptions.insert(0, subject.strip())
# Look for descriptions of breaking changes
breaking_descriptions = [
match.group(1)
for match in (re_breaking.match(p) for p in descriptions[1:])
if match
]
if breaking_descriptions:
level = "breaking"
level_bump = 3
return ParsedCommit(level_bump, level, None, descriptions, breaking_descriptions)