Skip to content

Commit 15ea15d

Browse files
authored
fix(changelog): ensure changelog_message_builder_hook can access and modify change_type (#1002)
1 parent 9a49892 commit 15ea15d

File tree

2 files changed

+37
-7
lines changed

2 files changed

+37
-7
lines changed

Diff for: commitizen/changelog.py

+6-7
Original file line numberDiff line numberDiff line change
@@ -159,14 +159,13 @@ def generate_tree_from_commits(
159159
message = map_pat.match(commit.message)
160160
if message:
161161
parsed_message: dict = message.groupdict()
162-
# change_type becomes optional by providing None
163-
change_type = parsed_message.pop("change_type", None)
164162

165-
if change_type_map:
166-
change_type = change_type_map.get(change_type, change_type)
167163
if changelog_message_builder_hook:
168164
parsed_message = changelog_message_builder_hook(parsed_message, commit)
169165
if parsed_message:
166+
change_type = parsed_message.pop("change_type", None)
167+
if change_type_map:
168+
change_type = change_type_map.get(change_type, change_type)
170169
changes[change_type].append(parsed_message)
171170

172171
# Process body from commit message
@@ -177,14 +176,14 @@ def generate_tree_from_commits(
177176
continue
178177
parsed_message_body: dict = message_body.groupdict()
179178

180-
change_type = parsed_message_body.pop("change_type", None)
181-
if change_type_map:
182-
change_type = change_type_map.get(change_type, change_type)
183179
if changelog_message_builder_hook:
184180
parsed_message_body = changelog_message_builder_hook(
185181
parsed_message_body, commit
186182
)
187183
if parsed_message_body:
184+
change_type = parsed_message_body.pop("change_type", None)
185+
if change_type_map:
186+
change_type = change_type_map.get(change_type, change_type)
188187
changes[change_type].append(parsed_message_body)
189188

190189
yield {"version": current_tag_name, "date": current_tag_date, "changes": changes}

Diff for: tests/test_changelog.py

+31
Original file line numberDiff line numberDiff line change
@@ -1347,6 +1347,37 @@ def changelog_message_builder_hook(message: dict, commit: git.GitCommit):
13471347
assert RE_HEADER.match(line), f"Line {no} should not be there: {line}"
13481348

13491349

1350+
def test_changelog_message_builder_hook_can_access_and_modify_change_type(
1351+
gitcommits, tags, any_changelog_format: ChangelogFormat
1352+
):
1353+
def changelog_message_builder_hook(message: dict, commit: git.GitCommit):
1354+
assert "change_type" in message
1355+
message["change_type"] = "overridden"
1356+
return message
1357+
1358+
parser = ConventionalCommitsCz.commit_parser
1359+
changelog_pattern = ConventionalCommitsCz.changelog_pattern
1360+
loader = ConventionalCommitsCz.template_loader
1361+
template = any_changelog_format.template
1362+
tree = changelog.generate_tree_from_commits(
1363+
gitcommits,
1364+
tags,
1365+
parser,
1366+
changelog_pattern,
1367+
changelog_message_builder_hook=changelog_message_builder_hook,
1368+
)
1369+
result = changelog.render_changelog(tree, loader, template)
1370+
1371+
RE_HEADER = re.compile(r"^### (?P<type>.+)$")
1372+
# There should be only "overridden" change type headers
1373+
for no, line in enumerate(result.splitlines()):
1374+
if (line := line.strip()) and (match := RE_HEADER.match(line)):
1375+
change_type = match.group("type")
1376+
assert (
1377+
change_type == "overridden"
1378+
), f"Line {no}: type {change_type} should have been overridden"
1379+
1380+
13501381
def test_get_smart_tag_range_returns_an_extra_for_a_range(tags):
13511382
start, end = (
13521383
tags[0],

0 commit comments

Comments
 (0)