From e7b840550b4cb8a04332c7aaceea809082dfdbf8 Mon Sep 17 00:00:00 2001 From: Jonathan Miller <230051081+jmiller-moko@users.noreply.github.com> Date: Tue, 16 Dec 2025 17:16:56 -0600 Subject: [PATCH] Update version_branch.yml --- .github/workflows/version_branch.yml | 76 ++++++++++++++++++++++++++++ 1 file changed, 76 insertions(+) diff --git a/.github/workflows/version_branch.yml b/.github/workflows/version_branch.yml index 07083c7..2d5b416 100644 --- a/.github/workflows/version_branch.yml +++ b/.github/workflows/version_branch.yml @@ -95,6 +95,82 @@ jobs: git checkout -B "${BRANCH_NAME}" "origin/${BASE_BRANCH}" echo "BRANCH_NAME=${BRANCH_NAME}" >> "$GITHUB_ENV" + - name: Ensure CHANGELOG.md has an H2 immediately after TODO block (repo creation) + shell: bash + run: | + set -Eeuo pipefail + trap 'echo "[FATAL] CHANGELOG initialization failed at line $LINENO" >&2; echo "[FATAL] Last command: $BASH_COMMAND" >&2' ERR + + if [[ ! -f "CHANGELOG.md" ]]; then + echo "[INFO] CHANGELOG.md missing. Pulling baseline from MokoDefaults/generic-git (main)." + + BASE_URL="https://raw.githubusercontent.com/mokoconsulting-tech/MokoDefaults/main/generic-git/CHANGELOG.md" + + if ! curl -fsSL "${BASE_URL}" -o CHANGELOG.md; then + echo "[FATAL] Unable to fetch baseline CHANGELOG.md from: ${BASE_URL}" >&2 + echo "[FATAL] Validate repository visibility and path: MokoDefaults/main/generic-git/CHANGELOG.md" >&2 + exit 2 + fi + + echo "[INFO] Baseline CHANGELOG.md retrieved" + fi + + python3 - <<'PY' +import os +import re +from datetime import datetime, timezone +from pathlib import Path + +new_version = os.environ.get('NEW_VERSION', '').strip() or '00.00.00' + +p = Path('CHANGELOG.md') +text = p.read_text(encoding='utf-8', errors='replace').splitlines(True) + +todo_re = re.compile(r'^##\s*\[?TODO\]?\s*$', re.IGNORECASE) +h2_re = re.compile(r'^##\s+') +bullet_re = re.compile(r'^\s*[-*+]\s+') +blank_re = re.compile(r'^\s*$') + +idx = None +for i, line in enumerate(text): + if todo_re.match(line.rstrip('\n').rstrip('\r')): + idx = i + break + +if idx is None: + print('[INFO] No TODO section found. No action taken.') + raise SystemExit(0) + +j = idx + 1 +saw_bullet = False +while j < len(text): + line = text[j].rstrip('\n').rstrip('\r') + if bullet_re.match(line): + saw_bullet = True + j += 1 + continue + if blank_re.match(line): + j += 1 + continue + break + +if not saw_bullet: + print('[INFO] TODO section missing bullet list, inserting placeholder bullet') + text.insert(idx + 1, '- Placeholder TODO item\n') + j = idx + 2 + +if j < len(text) and h2_re.match(text[j]): + print('[INFO] TODO block already followed by an H2. No action taken.') + raise SystemExit(0) + +stamp = datetime.now(timezone.utc).strftime('%Y-%m-%d') +insert = f"\n## [{new_version}] {stamp}\n" +print('[INFO] Inserting initial H2 after TODO block') + +text.insert(j, insert) +p.write_text(''.join(text), encoding='utf-8') +PY + - name: Preflight discovery (src and docs only) shell: bash run: |