From 8492af84125461d3a2b0939ee81b1679d77b022f Mon Sep 17 00:00:00 2001 From: "Axel H." Date: Sun, 10 Mar 2024 16:54:57 +0100 Subject: [PATCH] feat(changelog): expose commits `sha1`, `author` and `author_email` in changelog tree (fix #987) --- commitizen/changelog.py | 7 ++++++- docs/customization.md | 3 +++ tests/test_changelog.py | 22 ++++++++++++++++++---- 3 files changed, 27 insertions(+), 5 deletions(-) diff --git a/commitizen/changelog.py b/commitizen/changelog.py index 5c713af0e6..3f048a420e 100644 --- a/commitizen/changelog.py +++ b/commitizen/changelog.py @@ -188,7 +188,12 @@ def process_commit_message( changes: dict[str | None, list], change_type_map: dict[str, str] | None = None, ): - message: dict = parsed.groupdict() + message: dict = { + "sha1": commit.rev, + "author": commit.author, + "author_email": commit.author_email, + **parsed.groupdict(), + } if processed := hook(message, commit) if hook else message: messages = [processed] if isinstance(processed, dict) else processed diff --git a/docs/customization.md b/docs/customization.md index 7d352f0313..a36d85df99 100644 --- a/docs/customization.md +++ b/docs/customization.md @@ -500,6 +500,9 @@ Each `Change` has the following fields: | ---- | ---- | ----------- | | scope | `str | None` | An optional scope | | message | `str` | The commit message body | +| sha1 | `str` | The commit `sha1` | +| author | `str` | The commit author name | +| author_email | `str` | The commit author email | !!! Note The field values depend on the customization class and/or the settings you provide diff --git a/tests/test_changelog.py b/tests/test_changelog.py index 7944f66dd8..93cdf77015 100644 --- a/tests/test_changelog.py +++ b/tests/test_changelog.py @@ -1083,10 +1083,24 @@ def test_generate_tree_from_commits(gitcommits, tags, merge_prereleases): tree = changelog.generate_tree_from_commits( gitcommits, tags, parser, changelog_pattern, merge_prerelease=merge_prereleases ) - if merge_prereleases: - assert tuple(tree) == COMMITS_TREE_AFTER_MERGED_PRERELEASES - else: - assert tuple(tree) == COMMITS_TREE + expected = ( + COMMITS_TREE_AFTER_MERGED_PRERELEASES if merge_prereleases else COMMITS_TREE + ) + + for release, expected_release in zip(tree, expected): + assert release["version"] == expected_release["version"] + assert release["date"] == expected_release["date"] + assert release["changes"].keys() == expected_release["changes"].keys() + for change_type in release["changes"]: + changes = release["changes"][change_type] + expected_changes = expected_release["changes"][change_type] + for change, expected_change in zip(changes, expected_changes): + assert change["scope"] == expected_change["scope"] + assert change["breaking"] == expected_change["breaking"] + assert change["message"] == expected_change["message"] + assert change["author"] == "Commitizen" + assert change["author_email"] in "author@cz.dev" + assert "sha1" in change def test_generate_tree_from_commits_with_no_commits(tags):