Skip to content

Commit 318be66

Browse files
authored
fix(generation): ensure skip_tags condition is evaluated first (#1190)
* fix: ensure all skip_tags conditions are evaluated first Signed-off-by: Shingo OKAWA <shingo.okawa.g.h.c@gmail.com> * ci: trigger GitHub Actions Signed-off-by: Shingo OKAWA <shingo.okawa.g.h.c@gmail.com> * chore(test): update changelog::test::changelog_generator_render_always regarding rebase Signed-off-by: Shingo OKAWA <shingo.okawa.g.h.c@gmail.com> --------- Signed-off-by: Shingo OKAWA <shingo.okawa.g.h.c@gmail.com>
1 parent 4f7379a commit 318be66

4 files changed

Lines changed: 87 additions & 14 deletions

File tree

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
# git-cliff ~ configuration file
2+
# https://git-cliff.org/docs/configuration
3+
4+
[changelog]
5+
# A Tera template to be rendered for each release in the changelog.
6+
# See https://keats.github.io/tera/docs/#introduction
7+
body = """
8+
{% if version %}\
9+
## [{{ version | trim_start_matches(pat="v") }}] - {{ timestamp | date(format="%Y-%m-%d") }}
10+
{% else %}\
11+
## [unreleased]
12+
{% endif %}\
13+
{% for group, commits in commits | group_by(attribute="group") %}
14+
### {{ group | upper_first }}
15+
{% for commit in commits %}
16+
- {% if commit.breaking %}[**breaking**] {% endif %}{{ commit.message | upper_first }}\
17+
{% endfor %}
18+
{% endfor %}\n
19+
"""
20+
21+
[git]
22+
# Regex to select git tags that do not represent proper releases.
23+
# Takes precedence over `tag_pattern`.
24+
# Changes belonging to these releases will be included in the next release.
25+
skip_tags = "v0.0.1"
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
set -e
2+
3+
GIT_COMMITTER_DATE="2025-06-24 21:01:21" git commit --allow-empty -m "init"
4+
git tag v0.0.1
5+
6+
GIT_COMMITTER_DATE="2025-06-24 21:01:22" git commit --allow-empty -m "feat: add feature 0"
7+
GIT_COMMITTER_DATE="2025-06-24 21:01:23" git commit --allow-empty -m "feat: add feature 1"
8+
git tag v0.1.0
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
## [0.1.0] - 2025-06-24
2+
3+
### <!-- 0 -->🚀 Features
4+
5+
- Add feature 0
6+
- Add feature 1
7+

git-cliff-core/src/changelog.rs

Lines changed: 47 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -195,28 +195,25 @@ impl<'a> Changelog<'a> {
195195
.into_iter()
196196
.rev()
197197
.filter(|release| {
198+
if let Some(version) = &release.version {
199+
if skip_regex.is_some_and(|r| r.is_match(version)) {
200+
skipped_tags.push(version.clone());
201+
trace!("Skipping release: {}", version);
202+
return false;
203+
}
204+
}
198205
if release.commits.is_empty() {
199206
if let Some(version) = release.version.clone() {
200207
trace!("Release doesn't have any commits: {}", version);
201208
}
202209
match &release.previous {
203210
Some(prev_release) if prev_release.commits.is_empty() => {
204-
self.config.changelog.render_always
211+
return self.config.changelog.render_always;
205212
}
206-
_ => false,
213+
_ => return false,
207214
}
208-
} else if let Some(version) = &release.version {
209-
!skip_regex.is_some_and(|r| {
210-
let skip_tag = r.is_match(version);
211-
if skip_tag {
212-
skipped_tags.push(version.clone());
213-
trace!("Skipping release: {}", version);
214-
}
215-
skip_tag
216-
})
217-
} else {
218-
true
219215
}
216+
true
220217
})
221218
.map(|release| release.with_statistics())
222219
.collect();
@@ -1268,6 +1265,7 @@ mod test {
12681265
#[test]
12691266
fn changelog_generator() -> Result<()> {
12701267
let (config, releases) = get_test_data();
1268+
12711269
let mut changelog = Changelog::new(releases, &config, None)?;
12721270
changelog.bump_version()?;
12731271
changelog.releases[0].timestamp = Some(0);
@@ -1358,6 +1356,41 @@ mod test {
13581356
.replace(" ", ""),
13591357
str::from_utf8(&out).unwrap_or_default()
13601358
);
1359+
1360+
Ok(())
1361+
}
1362+
1363+
#[test]
1364+
fn changelog_generator_render_always() -> Result<()> {
1365+
let (mut config, mut releases) = get_test_data();
1366+
config.changelog.render_always = true;
1367+
1368+
releases[0].commits = Vec::new();
1369+
releases[2].commits = Vec::new();
1370+
releases[2].previous = Some(Box::new(releases[0].clone()));
1371+
let changelog = Changelog::new(releases, &config, None)?;
1372+
let mut out = Vec::new();
1373+
changelog.generate(&mut out)?;
1374+
assert_eq!(
1375+
String::from(
1376+
r#"# Changelog
1377+
1378+
## Unreleased
1379+
1380+
### Commit Statistics
1381+
1382+
- 0 commit(s) contributed to the release.
1383+
- 0 day(s) passed between the first and last commit.
1384+
- 0 commit(s) parsed as conventional.
1385+
- 0 linked issue(s) detected in commits.
1386+
- -578 day(s) passed between releases.
1387+
-- total releases: 1 --
1388+
"#
1389+
)
1390+
.replace(" ", ""),
1391+
str::from_utf8(&out).unwrap_or_default()
1392+
);
1393+
13611394
Ok(())
13621395
}
13631396

@@ -1367,7 +1400,6 @@ mod test {
13671400
config.git.split_commits = true;
13681401
config.git.filter_unconventional = false;
13691402
config.git.protect_breaking_commits = true;
1370-
13711403
for parser in config
13721404
.git
13731405
.commit_parsers
@@ -1522,6 +1554,7 @@ chore(deps): fix broken deps
15221554
.replace(" ", ""),
15231555
str::from_utf8(&out).unwrap_or_default()
15241556
);
1557+
15251558
Ok(())
15261559
}
15271560

0 commit comments

Comments
 (0)