Skip to content

Commit cf69409

Browse files
committed
fix(changelog): handle custom tag_format in changelog generation
When the tag_format does not follow the allowed schemas patterns then changlog generation fails.
1 parent 8daca3f commit cf69409

File tree

3 files changed

+37
-19
lines changed

3 files changed

+37
-19
lines changed

commitizen/changelog.py

+25-8
Original file line numberDiff line numberDiff line change
@@ -93,16 +93,34 @@ def tag_included_in_changelog(
9393
return True
9494

9595

96-
def get_version_tags(scheme: type[BaseVersion], tags: list[GitTag]) -> list[GitTag]:
96+
def get_version_tags(
97+
scheme: type[BaseVersion], tags: list[GitTag], tag_format: str
98+
) -> list[GitTag]:
9799
valid_tags: list[GitTag] = []
100+
TAG_FORMAT_REGEXS = {
101+
"$version": str(scheme.parser.pattern),
102+
"$major": r"(?P<major>\d+)",
103+
"$minor": r"(?P<minor>\d+)",
104+
"$patch": r"(?P<patch>\d+)",
105+
"$prerelease": r"(?P<prerelease>\w+\d+)?",
106+
"$devrelease": r"(?P<devrelease>\.dev\d+)?",
107+
"${version}": str(scheme.parser.pattern),
108+
"${major}": r"(?P<major>\d+)",
109+
"${minor}": r"(?P<minor>\d+)",
110+
"${patch}": r"(?P<patch>\d+)",
111+
"${prerelease}": r"(?P<prerelease>\w+\d+)?",
112+
"${devrelease}": r"(?P<devrelease>\.dev\d+)?",
113+
}
114+
tag_format_regex = tag_format
115+
for pattern, regex in TAG_FORMAT_REGEXS.items():
116+
tag_format_regex = tag_format_regex.replace(pattern, regex)
98117
for tag in tags:
99-
try:
100-
scheme(tag.name)
101-
except InvalidVersion:
102-
out.warn(f"InvalidVersion {tag}")
103-
else:
118+
if re.match(tag_format_regex, tag.name):
104119
valid_tags.append(tag)
105-
120+
else:
121+
out.warn(
122+
f"InvalidVersion {tag.name} doesn't match configured tag format {tag_format}"
123+
)
106124
return valid_tags
107125

108126

@@ -351,7 +369,6 @@ def get_oldest_and_newest_rev(
351369
oldest, newest = version.split("..")
352370
except ValueError:
353371
newest = version
354-
355372
newest_tag = normalize_tag(newest, tag_format=tag_format, scheme=scheme)
356373

357374
oldest_tag = None

commitizen/commands/changelog.py

+6-11
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
from pathlib import Path
77
from typing import Callable
88

9-
from commitizen import bump, changelog, defaults, factory, git, out
9+
from commitizen import changelog, defaults, factory, git, out
1010

1111
from commitizen.config import BaseConfig
1212
from commitizen.cz.base import MessageBuilderHook, ChangelogReleaseHook
@@ -169,21 +169,17 @@ def __call__(self):
169169
# Don't continue if no `file_name` specified.
170170
assert self.file_name
171171

172-
tags = changelog.get_version_tags(self.scheme, git.get_tags()) or []
173-
172+
tags = (
173+
changelog.get_version_tags(self.scheme, git.get_tags(), self.tag_format)
174+
or []
175+
)
174176
end_rev = ""
175177
if self.incremental:
176178
changelog_meta = self.changelog_format.get_metadata(self.file_name)
177179
if changelog_meta.latest_version:
178-
latest_tag_version: str = bump.normalize_tag(
179-
changelog_meta.latest_version,
180-
tag_format=self.tag_format,
181-
scheme=self.scheme,
182-
)
183180
start_rev = self._find_incremental_rev(
184-
strip_local_version(latest_tag_version), tags
181+
strip_local_version(changelog_meta.latest_version), tags
185182
)
186-
187183
if self.rev_range:
188184
start_rev, end_rev = changelog.get_oldest_and_newest_rev(
189185
tags,
@@ -197,7 +193,6 @@ def __call__(self):
197193
self.current_version is None or not self.current_version.is_prerelease
198194
):
199195
raise NoCommitsFoundError("No commits found")
200-
201196
tree = changelog.generate_tree_from_commits(
202197
commits,
203198
tags,

commitizen/providers/scm_provider.py

+6
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,12 @@ class ScmProvider(VersionProvider):
3131
"$patch": r"(?P<patch>\d+)",
3232
"$prerelease": r"(?P<prerelease>\w+\d+)?",
3333
"$devrelease": r"(?P<devrelease>\.dev\d+)?",
34+
"${version}": r"(?P<version>.+)",
35+
"${major}": r"(?P<major>\d+)",
36+
"${minor}": r"(?P<minor>\d+)",
37+
"${patch}": r"(?P<patch>\d+)",
38+
"${prerelease}": r"(?P<prerelease>\w+\d+)?",
39+
"${devrelease}": r"(?P<devrelease>\.dev\d+)?",
3440
}
3541

3642
def _tag_format_matcher(self) -> Callable[[str], VersionProtocol | None]:

0 commit comments

Comments
 (0)