Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(config): add ignore_tags option #40

Merged
merged 5 commits into from
Dec 7, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 18 additions & 0 deletions .github/fixtures/answer.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
# Changelog
All notable changes to this project will be documented in this file.

## [0.2.0] - 2021-01-23

### Features

- Add feature 2
- Add feature 3

## [0.1.0] - 2021-01-23

### Features

- Add feature 1
- Fix feature 1

<!-- generated by git-cliff -->
59 changes: 59 additions & 0 deletions .github/fixtures/cliff.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
# configuration file for git-cliff (0.1.0)

[changelog]
# changelog header
header = """
# Changelog
All notable changes to this project will be documented in this file.\n
"""
# template for the changelog body
# https://tera.netlify.app/docs/#introduction
body = """
{% if version %}\
## [{{ version | trim_start_matches(pat="v") }}] - {{ timestamp | date(format="%Y-%m-%d") }}
{% else %}\
## [unreleased]
{% endif %}\
{% for group, commits in commits | group_by(attribute="group") %}
### {{ group | upper_first }}
{% for commit in commits %}
- {{ commit.message | upper_first }}\
{% endfor %}
{% endfor %}\n
"""
# remove the leading and trailing whitespaces from the template
trim = true
# changelog footer
footer = """
<!-- generated by git-cliff -->
"""

[git]
# allow only conventional commits
# https://www.conventionalcommits.org
conventional_commits = true
# regex for parsing and grouping commits
commit_parsers = [
{ message = "^feat", group = "Features"},
{ message = "^fix", group = "Bug Fixes"},
{ message = "^doc", group = "Documentation"},
{ message = "^perf", group = "Performance"},
{ message = "^refactor", group = "Refactor"},
{ message = "^style", group = "Styling"},
{ message = "^test", group = "Testing"},
{ message = "^chore\\(release\\): prepare for", skip = true},
{ message = "^chore", group = "Miscellaneous Tasks"},
{ body = ".*security", group = "Security"},
]
# filter out the commits that are not matched by commit parsers
filter_commits = false
# glob pattern for matching git tags
tag_pattern = "v[0-9]*"
# regex for skipping tags
skip_tags = "v0.1.0-beta.1"
# regex for ignoring tags
ignore_tags = "v.*-beta.*"
# sort the tags topologically
topo_order = false
# sort the commits inside sections by oldest/newest order
sort_commits = "oldest"
45 changes: 45 additions & 0 deletions .github/workflows/test-fixtures.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
name: Test fixtures
orhun marked this conversation as resolved.
Show resolved Hide resolved

on:
pull_request:

jobs:
test-fixtures:
name: Test fixtures
runs-on: ubuntu-20.04
container: rust:latest
steps:
- name: Checkout
uses: actions/checkout@v2
with:
fetch-depth: 0
- name: Set .gitconfig
run: |
git config --global user.name github-actions
git config --global user.email [email protected]
- name: Create commits and tags
run: |
mkdir .workspace && cd .workspace && git init
git commit --allow-empty -m "Initial commit"
git commit --allow-empty -m "feat: add skip feature"
git tag v0.1.0-beta.1
git commit --allow-empty -m "feat: add feature 1"
git commit --allow-empty -m "feat: fix feature 1"
git tag v0.1.0
git commit --allow-empty -m "feat: add feature 2"
git tag v0.2.0-beta.1
git commit --allow-empty -m "feat: add feature 3"
git tag v0.2.0
env:
GIT_AUTHOR_DATE: "2021-01-23 01:23:45"
GIT_COMMITTER_DATE: "2021-01-23 01:23:45"
- name: Generate a changelog
run: |
cd .workspace
fixtures_dir=${GITHUB_WORKSPACE}/.github/fixtures
cargo run -- --config "$fixtures_dir"/cliff.toml > "$fixtures_dir"/output.md
- name: Compare the output with the answer
run: |
cd .github/fixtures
cat output.md
diff output.md answer.md
8 changes: 8 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,7 @@
- [filter_commits](#filter_commits)
- [tag_pattern](#tag_pattern)
- [skip_tags](#skip_tags)
- [ignore_tags](#ignore_tags)
- [topo_order](#topo_order)
- [sort_commits](#sort_commits)
- [Templating](#templating)
Expand Down Expand Up @@ -386,6 +387,7 @@ commit_parsers = [
filter_commits = false
tag_pattern = "v[0-9]*"
skip_tags = "v0.1.0-beta.1"
ignore_tags = ""
topo_order = false
sort_commits = "oldest"
```
Expand Down Expand Up @@ -443,6 +445,12 @@ git tag --list 'v[0-9]*'

A regex for skip processing the matched tags.

#### ignore_tags

A regex for ignore processing the matched tags.

While `skip_tags` drop commits from the changelog, `ignore_tags` include ignored commits into the next tag.

#### topo_order

If set to `true`, tags are processed in topological order instead of chronological.
Expand Down
2 changes: 2 additions & 0 deletions config/cliff.toml
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,8 @@ filter_commits = false
tag_pattern = "v[0-9]*"
# regex for skipping tags
skip_tags = "v0.1.0-beta.1"
# regex for ignoring tags
ignore_tags = ""
orhun marked this conversation as resolved.
Show resolved Hide resolved
# sort the tags topologically
topo_order = false
# sort the commits inside sections by oldest/newest order
Expand Down
2 changes: 2 additions & 0 deletions examples/detailed.toml
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,8 @@ filter_commits = false
tag_pattern = "v[0-9]*"
# regex for skipping tags
skip_tags = "v0.1.0-beta.1"
# regex for ignoring tags
ignore_tags = ""
# sort the tags topologically
topo_order = false
# sort the commits inside sections by oldest/newest order
Expand Down
2 changes: 2 additions & 0 deletions examples/keepachangelog.toml
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,8 @@ filter_commits = true
tag_pattern = "v[0-9]*"
# regex for skipping tags
skip_tags = "v0.1.0-beta.1"
# regex for ignoring tags
ignore_tags = ""
# sort the tags topologically
topo_order = false
# sort the commits inside sections by oldest/newest order
Expand Down
2 changes: 2 additions & 0 deletions examples/scoped.toml
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,8 @@ filter_commits = false
tag_pattern = "v[0-9]*"
# regex for skipping tags
skip_tags = "v0.1.0-beta.1"
# regex for ignoring tags
ignore_tags = ""
# sort the tags topologically
topo_order = false
# sort the commits inside sections by oldest/newest order
Expand Down
2 changes: 2 additions & 0 deletions examples/scopesorted.toml
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,8 @@ filter_commits = false
tag_pattern = "v[0-9]*"
# regex for skipping tags
skip_tags = "v0.1.0-beta.1"
# regex for ignoring tags
ignore_tags = ""
# sort the tags topologically
topo_order = false
# sort the commits inside sections by oldest/newest order
Expand Down
3 changes: 3 additions & 0 deletions git-cliff-core/src/config.rs
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,9 @@ pub struct GitConfig {
#[serde(with = "serde_regex", default)]
/// Regex to skip matched tags.
pub skip_tags: Option<Regex>,
#[serde(with = "serde_regex", default)]
/// Regex to ignore matched tags.
pub ignore_tags: Option<Regex>,
/// Whether to sort tags topologically.
pub topo_order: Option<bool>,
/// Sorting of the commits inside sections.
Expand Down
1 change: 1 addition & 0 deletions git-cliff-core/tests/integration_test.rs
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,7 @@ fn generate_changelog() -> Result<()> {
filter_commits: Some(true),
tag_pattern: None,
skip_tags: None,
ignore_tags: None,
topo_order: None,
sort_commits: None,
};
Expand Down
1 change: 1 addition & 0 deletions git-cliff/src/changelog.rs
Original file line number Diff line number Diff line change
Expand Up @@ -193,6 +193,7 @@ mod test {
filter_commits: Some(false),
tag_pattern: None,
skip_tags: Regex::new("v3.*").ok(),
ignore_tags: None,
topo_order: Some(false),
sort_commits: Some(String::from("oldest")),
},
Expand Down
27 changes: 27 additions & 0 deletions git-cliff/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -114,6 +114,33 @@ pub fn run(mut args: Opt) -> Result<()> {
// Parse tags.
let mut tags = repository.tags(&config.git.tag_pattern, args.topo_order)?;

// Skip tags.
let skip_regex = config.git.skip_tags.as_ref();
let ignore_regex = config.git.ignore_tags.as_ref();
tags = tags
.into_iter()
.filter(|(_, name)| {
// Keep skip tags to drop commits in the later stage.
let skip = skip_regex.map(|r| r.is_match(name)).unwrap_or_default();
orhun marked this conversation as resolved.
Show resolved Hide resolved

let ignore = ignore_regex
.map(|r| {
if r.as_str().trim().is_empty() {
return false;
}

let ignore_tag = r.is_match(name);
if ignore_tag {
trace!("Ignoring release: {}", name)
}
ignore_tag
})
.unwrap_or_default();

skip || !ignore
})
.collect();

// Parse commits.
let mut commit_range = args.range;
if args.unreleased {
Expand Down