From 0c7769b52fe3dee6afd0321c58021cf157acb964 Mon Sep 17 00:00:00 2001 From: Florian Fromm Date: Thu, 6 Oct 2022 13:10:37 +0200 Subject: [PATCH] feat(config): changelog for the last n commits (#116) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat(config): changelog for the last n commits Adds a additional configuration variable `limit_commits` to the configuration struct. `limit_commits` can be set to a positive integer number to limit the commits contained in the generated changelog. Also adjusts the default config file to contain `limit_commits` as a commented out line. Extends documentation in README.md to also cover the introduced configuration value. issue: https://github.com/orhun/git-cliff/issues/102 * test(fixture): add test fixture for limiting commits Co-authored-by: Orhun Parmaksız --- .../fixtures/test-limit-commits/cliff.toml | 30 ++++++++++++++ .github/fixtures/test-limit-commits/commit.sh | 8 ++++ .../fixtures/test-limit-commits/expected.md | 15 +++++++ README.md | 39 +++++++++++++++++++ config/cliff.toml | 2 + examples/limitedcommits.toml | 21 ++++++++++ git-cliff-core/src/config.rs | 2 + git-cliff-core/tests/integration_test.rs | 1 + git-cliff/src/changelog.rs | 1 + git-cliff/src/lib.rs | 5 ++- 10 files changed, 123 insertions(+), 1 deletion(-) create mode 100644 .github/fixtures/test-limit-commits/cliff.toml create mode 100755 .github/fixtures/test-limit-commits/commit.sh create mode 100644 .github/fixtures/test-limit-commits/expected.md create mode 100644 examples/limitedcommits.toml diff --git a/.github/fixtures/test-limit-commits/cliff.toml b/.github/fixtures/test-limit-commits/cliff.toml new file mode 100644 index 0000000000..39b12ff123 --- /dev/null +++ b/.github/fixtures/test-limit-commits/cliff.toml @@ -0,0 +1,30 @@ +[changelog] +# changelog header +header = """ +# Changelog\n +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 %} + - {% if commit.breaking %}[**breaking**] {% endif %}{{ commit.message | upper_first }}\ + {% endfor %} +{% endfor %}\n +""" +# remove the leading and trailing whitespace from the template +trim = true +# changelog footer +footer = """ + +""" + +[git] +limit_commits = 2 diff --git a/.github/fixtures/test-limit-commits/commit.sh b/.github/fixtures/test-limit-commits/commit.sh new file mode 100755 index 0000000000..958ce00ba9 --- /dev/null +++ b/.github/fixtures/test-limit-commits/commit.sh @@ -0,0 +1,8 @@ +#!/usr/bin/env bash +set -e + +GIT_COMMITTER_DATE="2022-04-06 01:25:08" git commit --allow-empty -m "Initial commit" +GIT_COMMITTER_DATE="2022-04-06 01:25:09" git commit --allow-empty -m "feat: add feature 1" +GIT_COMMITTER_DATE="2022-04-06 01:25:10" git commit --allow-empty -m "fix: fix feature 1 (#1)" +GIT_COMMITTER_DATE="2022-04-06 01:25:11" git commit --allow-empty -m "refactor: move classes" +git tag v0.1.0 diff --git a/.github/fixtures/test-limit-commits/expected.md b/.github/fixtures/test-limit-commits/expected.md new file mode 100644 index 0000000000..55ee3273f5 --- /dev/null +++ b/.github/fixtures/test-limit-commits/expected.md @@ -0,0 +1,15 @@ +# Changelog + +All notable changes to this project will be documented in this file. + +## [0.1.0] - 2022-04-05 + +### Fix + +- Fix feature 1 (#1) + +### Refactor + +- Move classes + + diff --git a/README.md b/README.md index 6dac923c59..f521fde7df 100644 --- a/README.md +++ b/README.md @@ -469,6 +469,7 @@ link_parsers = [ { pattern = "#(\\d+)", href = "https://github.com/orhun/git-cliff/issues/$1"}, { pattern = "RFC(\\d+)", text = "ietf-rfc$1", href = "https://datatracker.ietf.org/doc/html/rfc$1"}, ] +limit_commits = 42 ``` #### conventional_commits @@ -652,6 +653,12 @@ Examples: - `{ pattern = "RFC(\\d+)", text = "ietf-rfc$1", href = "https://datatracker.ietf.org/doc/html/rfc$1"}`, - Extract mentions of IETF RFCs and generate URLs linking to them. It also rewrites the text as "ietf-rfc...". +#### limit_commits + +`limit_commits` is a **optional** positive integer number that limits the number of included commits in the generated changelog. + +`limit_commits` is not part of the default configuration. + ## Project Integration ### Rust @@ -1018,6 +1025,38 @@ All notable changes to this project will be documented in this file. +#### [Limited Commits](./examples/limitedcommits.toml) + +
+ Raw Output + +``` +## [unreleased] +### Feat +- Support multiple file formats +- Use cache while fetching pages + +## [1.0.1] - 2021-07-18 +### Chore +- Add release script +``` + +
+ +
+ Rendered Output + +## [unreleased] +### Feat +- Support multiple file formats +- Use cache while fetching pages + +## [1.0.1] - 2021-07-18 +### Chore +- Add release script + +
+ #### [Detailed](./examples/detailed.toml)
diff --git a/config/cliff.toml b/config/cliff.toml index a4c50a0e74..33586805d3 100644 --- a/config/cliff.toml +++ b/config/cliff.toml @@ -66,3 +66,5 @@ ignore_tags = "" date_order = false # sort the commits inside sections by oldest/newest order sort_commits = "oldest" +# limit the number of commits included in the changelog. +# limit_commits = 42 diff --git a/examples/limitedcommits.toml b/examples/limitedcommits.toml new file mode 100644 index 0000000000..3a4632e161 --- /dev/null +++ b/examples/limitedcommits.toml @@ -0,0 +1,21 @@ +# configuration file for git-cliff (0.1.0) + +[changelog] +# 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 %}\ + - {% if commit.breaking %}[**breaking**] {% endif %}{{ commit.message | upper_first }} + {% endfor %}\ +{% endfor %}\n +""" + +[git] +limit_commits = 3 diff --git a/git-cliff-core/src/config.rs b/git-cliff-core/src/config.rs index ca29cfdefb..8fc65af684 100644 --- a/git-cliff-core/src/config.rs +++ b/git-cliff-core/src/config.rs @@ -69,6 +69,8 @@ pub struct GitConfig { pub date_order: Option, /// Sorting of the commits inside sections. pub sort_commits: Option, + /// Limit the number of commits included in the changelog. + pub limit_commits: Option, } /// Parser for grouping commits. diff --git a/git-cliff-core/tests/integration_test.rs b/git-cliff-core/tests/integration_test.rs index d9e77a4361..d449f36797 100644 --- a/git-cliff-core/tests/integration_test.rs +++ b/git-cliff-core/tests/integration_test.rs @@ -91,6 +91,7 @@ fn generate_changelog() -> Result<()> { text: Some(String::from("$1")), }, ]), + limit_commits: None, }; let releases = vec![ diff --git a/git-cliff/src/changelog.rs b/git-cliff/src/changelog.rs index 39ce6f3611..9b0cce6850 100644 --- a/git-cliff/src/changelog.rs +++ b/git-cliff/src/changelog.rs @@ -265,6 +265,7 @@ mod test { date_order: Some(false), sort_commits: Some(String::from("oldest")), link_parsers: None, + limit_commits: None, }, }; let test_release = Release { diff --git a/git-cliff/src/lib.rs b/git-cliff/src/lib.rs index 467bbaf558..13ea4f5370 100644 --- a/git-cliff/src/lib.rs +++ b/git-cliff/src/lib.rs @@ -217,8 +217,11 @@ pub fn run(mut args: Opt) -> Result<()> { } } } - let commits = + let mut commits = repository.commits(commit_range, args.include_path, args.exclude_path)?; + if let Some(commit_limit_value) = config.git.limit_commits { + commits = commits.drain(..commit_limit_value).collect(); + } // Update tags. if let Some(tag) = args.tag {