Skip to content

Commit

Permalink
feat(config): add ignore_tags option (#40)
Browse files Browse the repository at this point in the history
* feat: add ignore_tags option

Resolves (#36)

Signed-off-by: Kenji Miyake <[email protected]>

* test: add a test using GitHub Actions

Signed-off-by: Kenji Miyake <[email protected]>

* docs: fix style

Signed-off-by: Kenji Miyake <[email protected]>

* chore: add ignore_tags to example config files

Signed-off-by: Kenji Miyake <[email protected]>

* style: refactor test-fixtures workflow

Signed-off-by: Kenji Miyake <[email protected]>
  • Loading branch information
kenji-miyake authored Dec 7, 2021
1 parent ef63727 commit de11cce
Show file tree
Hide file tree
Showing 13 changed files with 172 additions and 0 deletions.
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

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 = ""
# 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();

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

0 comments on commit de11cce

Please sign in to comment.