@@ -6,6 +6,8 @@ cd "$ROOT_DIR"
66
77BASE_REF=" ${GITHUB_BASE_REF:- } "
88HEAD_REF=" ${GITHUB_HEAD_REF:- } "
9+ REQUIRE_CHANGELOG_ALWAYS=" ${REQUIRE_CHANGELOG_ALWAYS:- false} "
10+ ENFORCE_UNRELEASED_BULLET=" ${ENFORCE_UNRELEASED_BULLET:- false} "
911
1012if [[ -n " $BASE_REF " ]]; then
1113 git fetch --no-tags --depth=1 origin " $BASE_REF " > /dev/null 2>&1 || true
@@ -26,60 +28,64 @@ if [[ ${#CHANGED_FILES[@]} -eq 0 ]]; then
2628 exit 0
2729fi
2830
29- TRIGGERS=(
30- ' ^src/'
31- ' ^tests/'
32- ' ^vscode-fscript/'
33- ' ^docs/'
34- ' ^samples/'
35- )
36-
37- EXEMPTS=(
38- ' ^\.github/'
39- ' ^LICENSE$'
40- ' ^README\.md$'
41- ' ^AGENTS\.md$'
42- ' ^CHANGELOG\.md$'
43- ' ^\.gitignore$'
44- )
45-
46- needs_changelog=false
47- for file in " ${CHANGED_FILES[@]} " ; do
48- is_trigger=false
49- for pat in " ${TRIGGERS[@]} " ; do
50- if [[ " $file " =~ $pat ]]; then
51- is_trigger=true
52- break
53- fi
54- done
55-
56- if [[ " $is_trigger " == false ]]; then
57- continue
58- fi
59-
60- is_exempt=false
61- for pat in " ${EXEMPTS[@]} " ; do
62- if [[ " $file " =~ $pat ]]; then
63- is_exempt=true
64- break
31+ if ! printf ' %s\n' " ${CHANGED_FILES[@]} " | grep -qx ' CHANGELOG.md' ; then
32+ if [[ " $REQUIRE_CHANGELOG_ALWAYS " == " true" ]]; then
33+ echo " ERROR: CHANGELOG.md must be updated in every commit."
34+ exit 1
35+ else
36+ TRIGGERS=(
37+ ' ^src/'
38+ ' ^tests/'
39+ ' ^vscode-fscript/'
40+ ' ^docs/'
41+ ' ^samples/'
42+ )
43+
44+ EXEMPTS=(
45+ ' ^\.github/'
46+ ' ^LICENSE$'
47+ ' ^README\.md$'
48+ ' ^AGENTS\.md$'
49+ ' ^CHANGELOG\.md$'
50+ ' ^\.gitignore$'
51+ )
52+
53+ needs_changelog=false
54+ for file in " ${CHANGED_FILES[@]} " ; do
55+ is_trigger=false
56+ for pat in " ${TRIGGERS[@]} " ; do
57+ if [[ " $file " =~ $pat ]]; then
58+ is_trigger=true
59+ break
60+ fi
61+ done
62+
63+ if [[ " $is_trigger " == false ]]; then
64+ continue
65+ fi
66+
67+ is_exempt=false
68+ for pat in " ${EXEMPTS[@]} " ; do
69+ if [[ " $file " =~ $pat ]]; then
70+ is_exempt=true
71+ break
72+ fi
73+ done
74+
75+ if [[ " $is_exempt " == false ]]; then
76+ needs_changelog=true
77+ break
78+ fi
79+ done
80+
81+ if [[ " $needs_changelog " == true ]]; then
82+ echo " ERROR: Functional changes detected but CHANGELOG.md was not updated."
83+ echo " Add a short one-line bullet under ## [Unreleased]."
84+ exit 1
6585 fi
66- done
67-
68- if [[ " $is_exempt " == false ]]; then
69- needs_changelog=true
70- break
86+ echo " No changelog-required files changed."
87+ exit 0
7188 fi
72- done
73-
74- if [[ " $needs_changelog " == false ]]; then
75- echo " No changelog-required files changed."
76- exit 0
77- fi
78-
79- if ! printf ' %s\n' " ${CHANGED_FILES[@]} " | grep -qx ' CHANGELOG.md' ; then
80- echo " ERROR: Functional changes detected but CHANGELOG.md was not updated."
81- echo " Add a short one-line bullet under ## [Unreleased]."
82- exit 1
8389fi
8490
8591if ! grep -q ' ^## \[Unreleased\]' CHANGELOG.md; then
@@ -98,9 +104,11 @@ if [[ -z "${UNRELEASED_BLOCK//$'\n'/}" ]]; then
98104 exit 1
99105fi
100106
101- if ! printf ' %s\n' " $UNRELEASED_BLOCK " | grep -qE ' ^- ' ; then
102- echo " ERROR: ## [Unreleased] must contain at least one bullet line starting with '- '."
103- exit 1
107+ if [[ " $ENFORCE_UNRELEASED_BULLET " == " true" ]]; then
108+ if ! printf ' %s\n' " $UNRELEASED_BLOCK " | grep -qE ' ^- ' ; then
109+ echo " ERROR: ## [Unreleased] must contain at least one bullet line starting with '- '."
110+ exit 1
111+ fi
104112fi
105113
106114echo " Changelog gate passed."
0 commit comments