Skip to content
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
6 changes: 6 additions & 0 deletions .commitlintrc.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
{
"extends": [
"@commitlint/config-conventional"
]
}

2 changes: 2 additions & 0 deletions .github/dependabot.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,3 +4,5 @@ updates:
directory: "/"
schedule:
interval: "weekly"
commit-message:
prefix: "chore(deps)"
36 changes: 0 additions & 36 deletions .github/scripts/changelog.sh

This file was deleted.

15 changes: 15 additions & 0 deletions .github/workflows/ci.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -63,3 +63,18 @@ jobs:

- name: Test fish
run: fish conf.d/forgit.plugin.fish

# Validate conventional commit messages of PRs
commitlint:
runs-on: ubuntu-latest
if: github.event_name == 'pull_request'
steps:
- uses: actions/checkout@v6
with:
fetch-depth: 0
- name: Install npm
run: sudo apt update && sudo apt install --no-install-recommends -y npm
- name: Install commitlint
run: npm install -g @commitlint/cli @commitlint/config-conventional
- name: Validate PR commits
run: npx commitlint --from ${{ github.event.pull_request.base.sha }} --to ${{ github.event.pull_request.head.sha }} --verbose
47 changes: 23 additions & 24 deletions .github/workflows/release.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -18,24 +18,8 @@ jobs:
with:
fetch-depth: 0

- name: Generate Changelog
id: changelog
run: .github/scripts/changelog.sh > CHANGELOG.md
# When the script returns with an error, it indicates that we don't have
# any public changes to be released. This is expected behavior, so we
# quit the workflow successfully in this case.
continue-on-error: true

- name: Upload Changelog
uses: actions/upload-artifact@v6
if: steps.changelog.outcome == 'success'
with:
name: changelog
path: CHANGELOG.md

- name: Set version
id: set_version
if: steps.changelog.outcome == 'success'
# Set version depending on whether this is a regular monthly release or
# a custom release triggered by a tag push.
run: |
Expand All @@ -47,8 +31,28 @@ jobs:
echo "VERSION=$VERSION"
echo "VERSION=$VERSION" >> $GITHUB_OUTPUT

- name: Generate Changelog
id: changelog
uses: orhun/git-cliff-action@v4
with:
config: cliff.toml
# Consider the changes from the pushed tag (latest) when running due to a
# tag push and consider unreleased changes when this is a regular monthly
# release. This is necessary, because on monthly releases, the tag is created later.
args: --verbose $( [ "${{github.event_name }}" == "push" ] && echo --latest || echo --unreleased --tag ${{ steps.set_version.outputs.VERSION }} )
env:
OUTPUT: CHANGELOG.md
GITHUB_REPO: ${{ github.repository }}

- name: Check Changelog
id: check_changelog
# Test if the changelog contains any entries
run: test -n "${{ steps.changelog.outputs.content }}"
continue-on-error: true

outputs:
changeLogOutcome: ${{ steps.changelog.outcome }}
changeLogOutcome: ${{ steps.check_changelog.outcome }}
changelog: ${{ steps.changelog.outputs.content }}
version: ${{ steps.set_version.outputs.VERSION }}

release:
Expand All @@ -61,18 +65,13 @@ jobs:
with:
fetch-depth: 0

- name: Download Changelog
uses: actions/download-artifact@v7
with:
name: changelog

- name: Create Package
run: tar -czf forgit-${{ needs.changelog.outputs.version }}.tar.gz --exclude LICENSE --exclude README.md *
run: tar -czf forgit-${{ needs.changelog.outputs.version }}.tar.gz --exclude LICENSE --exclude README.md --exclude cliff.toml *

- name: Release
uses: softprops/action-gh-release@v2
with:
# The release action implicitly creates the tag if it does not exist.
tag_name: ${{ needs.changelog.outputs.version }}
body_path: CHANGELOG.md
body: ${{ needs.changelog.outputs.changelog }}
files: forgit-${{ needs.changelog.outputs.version }}.tar.gz
82 changes: 82 additions & 0 deletions cliff.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,82 @@
# git-cliff ~ configuration file
# https://git-cliff.org/docs/configuration


[changelog]
# A Tera template to be rendered for each release in the changelog.
# See https://keats.github.io/tera/docs/#introduction
body = """
{% for group, commits in commits | group_by(attribute="group") %}
### {{ group | striptags | trim | upper_first }}
{% for commit in commits %}
- {% if commit.scope %}*({{ commit.scope }})* {% endif %}\
{% if commit.breaking %}[**breaking**] {% endif %}\
{{ commit.message | upper_first }}\
{% endfor %}
{% endfor %}
"""
# Remove leading and trailing whitespaces from the changelog's body.
trim = true
# Render body even when there are no releases to process.
render_always = false
# An array of regex based postprocessors to modify the changelog.
postprocessors = [
# Replace the placeholder <REPO> with a URL.
#{ pattern = '<REPO>', replace = "https://github.com/orhun/git-cliff" },
]

[git]
# Parse commits according to the conventional commits specification.
# See https://www.conventionalcommits.org
conventional_commits = true
# Exclude commits that do not match the conventional commits specification.
filter_unconventional = true
# Require all commits to be conventional.
# Takes precedence over filter_unconventional.
require_conventional = false
# Split commits on newlines, treating each line as an individual commit.
split_commits = false
# An array of regex based parsers to modify commit messages prior to further processing.
commit_preprocessors = [
# Replace issue numbers with link templates to be updated in `changelog.postprocessors`.
#{ pattern = '\((\w+\s)?#([0-9]+)\)', replace = "([#${2}](<REPO>/issues/${2}))"},
# Check spelling of the commit message using https://github.com/crate-ci/typos.
# If the spelling is incorrect, it will be fixed automatically.
#{ pattern = '.*', replace_command = 'typos --write-changes -' },
]
# Prevent commits that are breaking from being excluded by commit parsers.
protect_breaking_commits = false
# An array of regex based parsers for extracting data from the commit message.
# Assigns commits to groups.
# Optionally sets the commit's scope and can decide to exclude commits from further processing.
commit_parsers = [
{ message = "^feat", group = "<!-- 0 -->🚀 Features" },
{ message = "^fix", group = "<!-- 1 -->🐛 Bug Fixes" },
{ message = "^doc", group = "<!-- 3 -->📚 Documentation" },
{ message = "^perf", group = "<!-- 4 -->⚡ Performance" },
{ message = "^refactor", group = "<!-- 2 -->🚜 Refactor" },
{ message = "^style", group = "<!-- 5 -->🎨 Styling" },
{ message = "^test", skip = true },
{ message = "^\\w*(ci)", skip = true },
{ message = "^chore|^ci", skip = true },
{ body = ".*security", group = "<!-- 8 -->🛡️ Security" },
{ message = "^revert", group = "<!-- 9 -->◀️ Revert" },
{ message = ".*", group = "<!-- 10 -->💼 Other" },
]
# Exclude commits that are not matched by any commit parser.
filter_commits = false
# Fail on a commit that is not matched by any commit parser.
fail_on_unmatched_commit = false
# An array of link parsers for extracting external references, and turning them into URLs, using regex.
link_parsers = []
# Include only the tags that belong to the current branch.
use_branch_tags = false
# Order releases topologically instead of chronologically.
topo_order = false
# Order commits topologically instead of chronologically.
topo_order_commits = true
# Order of commits in each group/release within the changelog.
# Allowed values: newest, oldest
sort_commits = "oldest"
# Process submodules commits
recurse_submodules = false