chavacava / changelog-lint

A simple linter for changelog files.
MIT License
4 stars 0 forks source link
changelog linter

changelog-lint

A simple linter for changelog files.

Installation

go install github.com/chavacava/changelog-lint@master

Usage

changelog-lint

will lint the CHANGELOG.md file in the current directory

changelog-lint some/path/changes.md

will lint the changes.md file in the some/path directory

To get the full list of command line flags:

$ changelog-lint -h
Usage of changelog-lint:
  -config string
        set linter configuration
  -release string
        enables release-related checks (the given string must be the release version, e.g. 1.2.3)
  -version
        get changelog-lint version

Configuration

If defaults do not fit your needs you can configure the linter by providing a configuration file with the command line flag -config

Via the configuration file you can:

The format of the configuration file is TOML. Example, the configuration to lint the CHANGELOG.md of nodejs/changelog-maker could be:

[parser.patterns]
    title=".*"
    version='^## \[(\d+\.\d+\.\d+)\]\(https:\/\/github\.com\/nodejs\/changelog-maker\/compare\/v\d+\.\d+\.\d+\.\.\.v\d+\.\d+\.\d+\) \(\d{4}-\d{2}-\d{2}\)$'
    subsection= '^### (?:⚠ )?([A-Z]+.*)$'

[rule.subsection-order]
    Disabled=true
[rule.subsection-naming]
    Arguments=["BREAKING CHANGES", "Features", "Bug Fixes", "Trivial Changes"]

Please notice some patterns require to have a capturing group (see Details below)

Error codes

Executing the linter returns one of the following error codes

Code Meaning
0 no error
1 bad execution parameters/flags (e.g. bad changelog filename)
2 syntax error in the changelog file
3 the linter found a problem in the changelog

Details

The linter will apply a set of predefined rules (se below).

The expected global format of the file is Markdown where:

By default the following patterns are expected

Section Pattern Capturing Group
title ^# .+$ N/A
version ^## (\d+\.\d+.\d+\|\[Unreleased\])( .*)*$ version name
subsection ^### ([A-Z]+[a-z]+)[ ]*$ subsection name
entry ^[*-] .+$ N/A

These patterns can be configured (see Configuration)

Check this CHANGELOG.md as example of the expected format.

Rules

Name Description Arguments
subsection-empty warns on subsections without any entry
subsection-namming warns on unknown subsection names (Added, Changed, Deprecated, Fixed, Removed, Security are known) list of accepted section names (replaces the default list)
subsection-order warns on subsections not listed alphabetically in a version
subsection-repetition warns on subsections appearing more than once under the same version
version-empty warns on versions without any subsection
version-order warns on versions not well ordered wrt their semver number
version-retpetition warns on versions appearing more than once

You can contribute new rules by implementing the linting.Rule interface:

type Rule interface {
    Apply(model.Changelog, chan Failure, RuleArgs)
    Name() string
}