This is an automated email from the ASF dual-hosted git repository. xiaoxiang pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/nuttx.git
commit 56f0da2efe3b72b521c831541e2f4de212c412f4 Author: Arjav Patel <[email protected]> AuthorDate: Tue Feb 24 11:04:25 2026 +0530 tools/checkpatch.sh: Add support for breaking change commit message enforcement - Introduced a new flag '-b' to enforce breaking change format in commit messages. - Added checks to ensure that breaking change commits start with '!' and contain 'BREAKING CHANGE:' in the body before 'Signed-off-by'. - Updated usage instructions to reflect the new breaking change option. Signed-off-by: Arjav Patel <[email protected]> --- tools/checkpatch.sh | 33 ++++++++++++++++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) diff --git a/tools/checkpatch.sh b/tools/checkpatch.sh index cce2e6f2d29..bec4bae7605 100755 --- a/tools/checkpatch.sh +++ b/tools/checkpatch.sh @@ -32,6 +32,7 @@ range=0 spell=0 encoding=0 message=0 +breaking_change=0 # CMake cmake_warning_once=0 @@ -57,6 +58,7 @@ usage() { echo "-r range check only (coupled with -p or -g)" echo "-p <patch file names> (default)" echo "-m Check commit message (coupled with -g)" + echo "-b Enforce breaking change format when checking commit message (requires -m -g; use when PR has breaking change label)" echo "-g <commit list>" echo "-f <file list>" echo "-x format supported files (only .py, requires: pip install black)" @@ -286,13 +288,14 @@ check_msg() { num_lines=0 max_line_len=80 min_num_lines=5 + breaking_change_found=0 first=$(head -n1 <<< "$msg") # check for Merge line and remove from parsed string if [[ $first == *Merge* ]]; then msg="$(echo "$msg" | tail -n +2)" - first=$(head -n2 <<< "$msg") + first=$(head -n1 <<< "$msg") fi while IFS= read -r REPLY; do @@ -311,7 +314,15 @@ check_msg() { fail=1 fi + if [[ $REPLY =~ ^BREAKING\ CHANGE: ]]; then + breaking_change_found=1 + fi + if [[ $REPLY =~ ^Signed-off-by ]]; then + if [ $breaking_change != 0 ] && [ $breaking_change_found == 0 ]; then + echo "❌ BREAKING CHANGE: must appear in the commit body before Signed-off-by (see CONTRIBUTING.md 1.13)" + fail=1 + fi signedoffby_found=1 fi @@ -328,6 +339,23 @@ check_msg() { fail=1 fi + second=$(echo "$msg" | sed -n '2p') + if [ $num_lines -ge 2 ] && ! [[ "$second" =~ ^[[:space:]]*$ ]]; then + echo "❌ Commit subject must be followed by a blank line" + fail=1 + fi + + if [ $breaking_change != 0 ]; then + if [[ "${first:0:1}" != "!" ]]; then + echo "❌ Breaking change commit subject must start with '!' (e.g. '!subsystem: description')" + fail=1 + fi + if [ $breaking_change_found == 0 ]; then + echo "❌ Breaking change commit must contain 'BREAKING CHANGE:' in the body before Signed-off-by (see CONTRIBUTING.md 1.13)" + fail=1 + fi + fi + if ! [ $signedoffby_found == 1 ]; then echo "❌ Missing Signed-off-by" fail=1 @@ -383,6 +411,9 @@ while [ ! -z "$1" ]; do -m ) message=1 ;; + -b ) + breaking_change=1 + ;; -g ) check=check_commit ;;
