3434from typing import Callable , Dict , Iterable , List , Optional , Tuple , Type
3535
3636from jinja2 import Environment , PackageLoader
37+ from packaging .version import InvalidVersion , Version
3738
3839from commitizen import defaults
3940from commitizen .bump import normalize_tag
@@ -51,6 +52,31 @@ def get_commit_tag(commit: GitCommit, tags: List[GitTag]) -> Optional[GitTag]:
5152 return next ((tag for tag in tags if tag .rev == commit .rev ), None )
5253
5354
55+ def get_version (tag : GitTag ) -> Optional [Version ]:
56+ version = None
57+ try :
58+ version = Version (tag .name )
59+ except InvalidVersion :
60+ pass
61+ return version
62+
63+
64+ def tag_included_in_changelog (
65+ tag : GitTag , used_tags : List , merge_prerelease : bool
66+ ) -> bool :
67+ if tag in used_tags :
68+ return False
69+
70+ version = get_version (tag )
71+ if version is None :
72+ return False
73+
74+ if merge_prerelease and version .is_prerelease :
75+ return False
76+
77+ return True
78+
79+
5480def generate_tree_from_commits (
5581 commits : List [GitCommit ],
5682 tags : List [GitTag ],
@@ -59,6 +85,7 @@ def generate_tree_from_commits(
5985 unreleased_version : Optional [str ] = None ,
6086 change_type_map : Optional [Dict [str , str ]] = None ,
6187 changelog_message_builder_hook : Optional [Callable ] = None ,
88+ merge_prerelease : bool = False ,
6289) -> Iterable [Dict ]:
6390 pat = re .compile (changelog_pattern )
6491 map_pat = re .compile (commit_parser , re .MULTILINE )
@@ -81,15 +108,15 @@ def generate_tree_from_commits(
81108 for commit in commits :
82109 commit_tag = get_commit_tag (commit , tags )
83110
84- if commit_tag is not None and commit_tag not in used_tags :
111+ if commit_tag is not None and tag_included_in_changelog (
112+ commit_tag , used_tags , merge_prerelease
113+ ):
85114 used_tags .append (commit_tag )
86115 yield {
87116 "version" : current_tag_name ,
88117 "date" : current_tag_date ,
89118 "changes" : changes ,
90119 }
91- # TODO: Check if tag matches the version pattern, otherwise skip it.
92- # This in order to prevent tags that are not versions.
93120 current_tag_name = commit_tag .name
94121 current_tag_date = commit_tag .date
95122 changes = defaultdict (list )
0 commit comments