diff --git a/commitizen/changelog.py b/commitizen/changelog.py index bf0f18576f..28481a1dea 100644 --- a/commitizen/changelog.py +++ b/commitizen/changelog.py @@ -159,14 +159,13 @@ def generate_tree_from_commits( message = map_pat.match(commit.message) if message: parsed_message: dict = message.groupdict() - # change_type becomes optional by providing None - change_type = parsed_message.pop("change_type", None) - if change_type_map: - change_type = change_type_map.get(change_type, change_type) if changelog_message_builder_hook: parsed_message = changelog_message_builder_hook(parsed_message, commit) if parsed_message: + change_type = parsed_message.pop("change_type", None) + if change_type_map: + change_type = change_type_map.get(change_type, change_type) changes[change_type].append(parsed_message) # Process body from commit message @@ -177,14 +176,14 @@ def generate_tree_from_commits( continue parsed_message_body: dict = message_body.groupdict() - change_type = parsed_message_body.pop("change_type", None) - if change_type_map: - change_type = change_type_map.get(change_type, change_type) if changelog_message_builder_hook: parsed_message_body = changelog_message_builder_hook( parsed_message_body, commit ) if parsed_message_body: + change_type = parsed_message_body.pop("change_type", None) + if change_type_map: + change_type = change_type_map.get(change_type, change_type) changes[change_type].append(parsed_message_body) yield {"version": current_tag_name, "date": current_tag_date, "changes": changes} diff --git a/tests/test_changelog.py b/tests/test_changelog.py index 0aff996ff5..af7846f6f0 100644 --- a/tests/test_changelog.py +++ b/tests/test_changelog.py @@ -1347,6 +1347,37 @@ def changelog_message_builder_hook(message: dict, commit: git.GitCommit): assert RE_HEADER.match(line), f"Line {no} should not be there: {line}" +def test_changelog_message_builder_hook_can_access_and_modify_change_type( + gitcommits, tags, any_changelog_format: ChangelogFormat +): + def changelog_message_builder_hook(message: dict, commit: git.GitCommit): + assert "change_type" in message + message["change_type"] = "overridden" + return message + + parser = ConventionalCommitsCz.commit_parser + changelog_pattern = ConventionalCommitsCz.changelog_pattern + loader = ConventionalCommitsCz.template_loader + template = any_changelog_format.template + tree = changelog.generate_tree_from_commits( + gitcommits, + tags, + parser, + changelog_pattern, + changelog_message_builder_hook=changelog_message_builder_hook, + ) + result = changelog.render_changelog(tree, loader, template) + + RE_HEADER = re.compile(r"^### (?P.+)$") + # There should be only "overridden" change type headers + for no, line in enumerate(result.splitlines()): + if (line := line.strip()) and (match := RE_HEADER.match(line)): + change_type = match.group("type") + assert ( + change_type == "overridden" + ), f"Line {no}: type {change_type} should have been overridden" + + def test_get_smart_tag_range_returns_an_extra_for_a_range(tags): start, end = ( tags[0],