Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/platisd/bad-commit-message-blocker
Inhibits commits with bad messages from getting merged
https://github.com/platisd/bad-commit-message-blocker
best-practices code-review commit-message continuous-integration git nlp nltk textblob travis-ci
Last synced: 11 days ago
JSON representation
Inhibits commits with bad messages from getting merged
- Host: GitHub
- URL: https://github.com/platisd/bad-commit-message-blocker
- Owner: platisd
- License: mit
- Created: 2019-04-30T19:21:01.000Z (over 5 years ago)
- Default Branch: master
- Last Pushed: 2022-01-22T11:27:03.000Z (almost 3 years ago)
- Last Synced: 2024-03-15T11:01:02.266Z (8 months ago)
- Topics: best-practices, code-review, commit-message, continuous-integration, git, nlp, nltk, textblob, travis-ci
- Language: Python
- Size: 23.4 KB
- Stars: 62
- Watchers: 4
- Forks: 10
- Open Issues: 5
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# Bad Commit Message Blocker [![Build Status](https://travis-ci.org/platisd/bad-commit-message-blocker.svg?branch=master)](https://travis-ci.org/platisd/bad-commit-message-blocker)
A simple script, doing some natural language processing, to inhibit
*git commits* with *bad messages* from getting merged.![screenshot](https://i.imgur.com/B52Qxo7.png)
## What?
A Python3 script, easy to integrate with various CI machinery
(e.g. see [GitHub Actions example](#github-action))
that is meant to keep bad commit messages out of a project. It verifies
whether the [seven rules of a great Git commit message](https://chris.beams.io/posts/git-commit/)
by Chris Beams, are being followed:1. Separate subject from body with a blank line
2. Limit the subject line to 50 characters
3. Capitalize the subject line
4. Do not end the subject line with a period
5. Use the imperative mood in the subject line
6. Wrap the body at 72 characters
7. Use the body to explain what and why vs. how## Why?
The more a project grows in contributors and size, the more important
the quality of its commit messages becomes.It is ultimately hard to quantify what makes a *good* commit message.
However, we can easily determine automatically whether it adheres to
most of the git commit message best practices. Having a script to
automatically verify that, aside of other rules that you might already
enforce (e.g. checking whether a task or a requirement is referenced)
can save a lot of time in the long run as well as even avoid conflicts
between the reviewer(s) and the reviewee.After adopting this script, what you get is a set of best practices,
agreed upon by the project and automatically applied. This way,
everyone has to follow them or CI will not allow that commit in.
Simple as that! :innocent:## How?
Most of the rules are trivial to implement in code, except two of them,
*no. 5* and *no. 7*. Specifically, checking whether the commit subject
begins with *imperative* mood is tricky due to limitations of the Natural
Language Processing libraries being utilized. You can read more about the
constraints [here](https://stackoverflow.com/a/9572724/6485320).
Essentially, it boils down to the lack of many imperative sentences
existing in the datasets used when training the relevant statistical
models. Subsequently, **the enforcement of this rule might produce some**
**false positive and false negative errors**.On the other hand, verifying whether the commit body actually explains
*what* and *why* instead of *how* is not (?) possible, due to the
subjective nature of the problem.
All in all, in most cases, this is all the reviewers would have to do
themselves *manually*, to ensure the quality of a commit message.### Get started
You need to have Python3 installed and follow the steps bellow:
* Install [TextBlob](https://textblob.readthedocs.io/en/dev/)
* `pip3 install --user textblob`
* Install NLTK corpora
* `python3 -m textblob.download_corpora`
* Run the script to verify a commit message
* `python3 bad_commit_message_blocker.py --message "Add a really cool feature"`
* To define your own maximum character limits, call the script with the
appropriate arguments:
* `--subject-limit` (defaults to `50`) to set the subject line limit. E.g.:
* `python3 bad_commit_message_blocker.py --subject-limit 80 --message "Add a really cool feature"`
* `--body-limit` (defaults to `72`) to set the body line limit. E.g.:
* `python3 bad_commit_message_blocker.py --body-limit 120 --message "Add a really cool feature"`## GitHub Action
Now you can use this script as part of your **GitHub Actions** CI pipeline.
An example configuration can be seen below:
```yaml
name: Commit messageson: [pull_request]
jobs:
check-commit-message:
if: github.event.pull_request.user.type != 'Bot' # a number of GitHub Apps that can send PRs don't have configurable commits
runs-on: ubuntu-20.04
steps:
- name: Verify commit messages follow best practices in CI
uses: platisd/bad-commit-message-blocker@master
with:
github_token: ${{ secrets.GITHUB_TOKEN }}
# Optionally set the subject character limit (default `50`)
subject_limit: 60
# Optionally set the body character limit (default `72`)
body_limit: 100
# Optionally set the remote branch name to merge (default `master`)
remote_branch: dev
# Optionally allow "conventional commits" (default `false`)
allow_conventional_commits: true
```