@@ -207,6 +207,27 @@ detect_changed_packages() {
207207 echo " Changelog entry: $CHANGELOG_ENTRY "
208208}
209209
210+ # Detect CHANGELOG format from existing entries
211+ detect_changelog_format () {
212+ # Check if headers use brackets: ## [1.2.3] vs ## 1.2.3
213+ if grep -q -m 1 -E ' ^## \[[0-9]+\.[0-9]+\.[0-9]+' " $CHANGELOG_FILE " 2> /dev/null; then
214+ CHANGELOG_USE_BRACKETS=true
215+ echo " Detected CHANGELOG format: bracketed headers (## [version])"
216+ else
217+ CHANGELOG_USE_BRACKETS=false
218+ echo " Detected CHANGELOG format: plain headers (## version)"
219+ fi
220+
221+ # Check if CHANGELOG uses subsections (### Fixes) or direct bullets
222+ if grep -q -m 1 ' ^### ' " $CHANGELOG_FILE " 2> /dev/null; then
223+ CHANGELOG_USE_SUBSECTIONS=true
224+ echo " Detected CHANGELOG format: uses subsections (### Fixes)"
225+ else
226+ CHANGELOG_USE_SUBSECTIONS=false
227+ echo " Detected CHANGELOG format: direct bullet points"
228+ fi
229+ }
230+
210231# Update CHANGELOG.md
211232update_changelog () {
212233 echo " Updating CHANGELOG..."
@@ -217,12 +238,19 @@ update_changelog() {
217238 return 0
218239 fi
219240
241+ # Detect the format
242+ detect_changelog_format
243+
220244 # Only look for -dev version to rename if CURRENT_VERSION had -dev suffix
221245 if [[ -n " ${DEV_SUFFIX:- } " ]]; then
222246 # Look for -dev version header in CHANGELOG that matches our version exactly (not substring)
223- # Escape dots for regex, then match with end-of-line or whitespace anchor
247+ # Escape dots for regex, handle brackets if used
224248 ESCAPED_VERSION=" ${CURRENT_VERSION// ./ \\ .} "
225- DEV_VERSION_HEADER=$( grep -m 1 -E " ^## ${ESCAPED_VERSION} (\s*$)" " $CHANGELOG_FILE " || true)
249+ if [ " $CHANGELOG_USE_BRACKETS " = true ]; then
250+ DEV_VERSION_HEADER=$( grep -m 1 -E " ^## \[${ESCAPED_VERSION} \]" " $CHANGELOG_FILE " || true)
251+ else
252+ DEV_VERSION_HEADER=$( grep -m 1 -E " ^## ${ESCAPED_VERSION} (\s*$)" " $CHANGELOG_FILE " || true)
253+ fi
226254
227255 if [[ -n " $DEV_VERSION_HEADER " ]]; then
228256 echo " Found dev version in CHANGELOG: $DEV_VERSION_HEADER "
@@ -234,32 +262,42 @@ update_changelog() {
234262
235263 awk -v dev_version=" $DEV_VERSION " \
236264 -v release_version=" $RELEASE_VERSION " \
237- -v security_entry=" $CHANGELOG_ENTRY " '
265+ -v security_entry=" $CHANGELOG_ENTRY " \
266+ -v use_brackets=" $CHANGELOG_USE_BRACKETS " \
267+ -v use_subsections=" $CHANGELOG_USE_SUBSECTIONS " '
238268 BEGIN {
239269 in_target_version = 0
240270 found_fixes = 0
241271 added_entry = 0
242272 }
243273
244274 /^## / {
245- if (index($0, "## " dev_version) == 1) {
246- print "## " release_version
275+ # Match the dev version header (with or without brackets)
276+ dev_header = use_brackets == "true" ? "## [" dev_version "]" : "## " dev_version
277+ release_header = use_brackets == "true" ? "## [" release_version "]" : "## " release_version
278+
279+ if (index($0, dev_header) == 1) {
280+ print release_header
247281 in_target_version = 1
248282 next
249283 } else {
250284 if (in_target_version && !found_fixes && !added_entry) {
251- print ""
252- print "### Fixes"
285+ if (use_subsections == "true") {
286+ print ""
287+ print "### Fixes"
288+ }
253289 print security_entry
254- print ""
290+ if (use_subsections == "true") {
291+ print ""
292+ }
255293 added_entry = 1
256294 }
257295 in_target_version = 0
258296 found_fixes = 0
259297 }
260298 }
261299
262- /^### Fixes/ && in_target_version {
300+ /^### Fixes/ && in_target_version && use_subsections == "true" {
263301 print
264302 print security_entry
265303 found_fixes = 1
@@ -271,8 +309,10 @@ update_changelog() {
271309
272310 END {
273311 if (in_target_version && !found_fixes && !added_entry) {
274- print ""
275- print "### Fixes"
312+ if (use_subsections == "true") {
313+ print ""
314+ print "### Fixes"
315+ }
276316 print security_entry
277317 }
278318 }
@@ -295,13 +335,31 @@ create_new_changelog_entry() {
295335 local tmp_file
296336 tmp_file=$( mktemp)
297337
298- cat > " $tmp_file " << EOF
299- ## $RELEASE_VERSION
338+ # Format header based on detected style
339+ local header
340+ if [ " $CHANGELOG_USE_BRACKETS " = true ]; then
341+ header=" ## [$RELEASE_VERSION ]"
342+ else
343+ header=" ## $RELEASE_VERSION "
344+ fi
345+
346+ # Build entry based on subsection style
347+ if [ " $CHANGELOG_USE_SUBSECTIONS " = true ]; then
348+ cat > " $tmp_file " << EOF
349+ $header
300350
301351### Fixes
302352$CHANGELOG_ENTRY
303353
304354EOF
355+ else
356+ cat > " $tmp_file " << EOF
357+ $header
358+
359+ $CHANGELOG_ENTRY
360+
361+ EOF
362+ fi
305363
306364 cat " $tmp_file " " $CHANGELOG_FILE " > " $CHANGELOG_FILE .tmp"
307365 mv " $CHANGELOG_FILE .tmp" " $CHANGELOG_FILE "
0 commit comments