Skip to content

Commit 038d01b

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 f75eddc commit 038d01b

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
@@ -91,16 +91,34 @@ def tag_included_in_changelog(
9191
return True
9292

9393

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

106124

@@ -319,7 +337,6 @@ def get_oldest_and_newest_rev(
319337
oldest, newest = version.split("..")
320338
except ValueError:
321339
newest = version
322-
323340
newest_tag = normalize_tag(newest, tag_format=tag_format, scheme=scheme)
324341

325342
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.exceptions import (
@@ -164,21 +164,17 @@ def __call__(self):
164164
# Don't continue if no `file_name` specified.
165165
assert self.file_name
166166

167-
tags = changelog.get_version_tags(self.scheme, git.get_tags()) or []
168-
167+
tags = (
168+
changelog.get_version_tags(self.scheme, git.get_tags(), self.tag_format)
169+
or []
170+
)
169171
end_rev = ""
170172
if self.incremental:
171173
changelog_meta = self.changelog_format.get_metadata(self.file_name)
172174
if changelog_meta.latest_version:
173-
latest_tag_version: str = bump.normalize_tag(
174-
changelog_meta.latest_version,
175-
tag_format=self.tag_format,
176-
scheme=self.scheme,
177-
)
178175
start_rev = self._find_incremental_rev(
179-
strip_local_version(latest_tag_version), tags
176+
strip_local_version(changelog_meta.latest_version), tags
180177
)
181-
182178
if self.rev_range:
183179
start_rev, end_rev = changelog.get_oldest_and_newest_rev(
184180
tags,
@@ -192,7 +188,6 @@ def __call__(self):
192188
self.current_version is None or not self.current_version.is_prerelease
193189
):
194190
raise NoCommitsFoundError("No commits found")
195-
196191
tree = changelog.generate_tree_from_commits(
197192
commits,
198193
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)