Skip to content

Commit 38c50a2

Browse files
lawrence-u10dclaude
andcommitted
feat: auto-detect and adapt to CHANGELOG format
Script now detects CHANGELOG format (brackets, subsections) and adapts output accordingly. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
1 parent 07e12cc commit 38c50a2

1 file changed

Lines changed: 71 additions & 13 deletions

File tree

scripts/renovate-security-bump.sh

Lines changed: 71 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -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
211232
update_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
304354
EOF
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

Comments
 (0)