From 48cfb230813d1b568d1110b43799f2a75b5a52d0 Mon Sep 17 00:00:00 2001 From: Jonathan Miller <230051081+jmiller-moko@users.noreply.github.com> Date: Tue, 23 Dec 2025 14:00:36 -0600 Subject: [PATCH] Update version_branch.yml --- .github/workflows/version_branch.yml | 96 +++++++++++++++++++--------- 1 file changed, 65 insertions(+), 31 deletions(-) diff --git a/.github/workflows/version_branch.yml b/.github/workflows/version_branch.yml index 96052fe..146a52f 100644 --- a/.github/workflows/version_branch.yml +++ b/.github/workflows/version_branch.yml @@ -353,7 +353,6 @@ jobs: echo "[ERROR] No VERSION: (NN.NN.NN) or tags found outside .github" >&2 exit 2 fi - - name: Bump versions and update manifest dates (targeted, excluding .github) run: | source "$CI_HELPERS" @@ -374,28 +373,74 @@ jobs: stamp = datetime.now(timezone.utc).strftime('%Y-%m-%d') root = Path('.').resolve() - header_re = re.compile(r'(?im)(VERSION[ ]*:[ ]*)([0-9]{2}[.][0-9]{2}[.][0-9]{2})') + header_re = re.compile(r'(?im)(VERSION[ ]*:[ ]*)([0-9]{2}[.][0-9]{2}[.][0-9]{2})') - manifest_marker_re = re.compile(r'(?is))([^<]*?)()') + xml_date_res = [ + re.compile(r'(?is)()([^<]*?)()'), + re.compile(r'(?is)()([^<]*?)()'), + re.compile(r'(?is)()([^<]*?)()'), + ] - for rx in xml_date_res: - text3, n3 = rx.subn(lambda m: m.group(1) + stamp + m.group(3), text) - text = text3 - if n3: - counters['xml_date_replacements'] += n3 + skip_ext = { + '.json', '.png', '.jpg', '.jpeg', '.gif', '.svg', '.ico', '.pdf', + '.zip', '.7z', '.tar', '.gz', '.woff', '.woff2', '.ttf', '.otf', + '.mp3', '.mp4' + } + skip_dirs = {'.git', '.github', 'node_modules', 'vendor', '.venv', 'dist', 'build'} - if text != original: - updated_manifests.append(str(p)) - else: - counters['xml_skipped_non_manifest'] += 1s['xml_skipped_non_manifest'] += 1 + counters = defaultdict(int) + updated = [] + updated_manifests = [] + + def should_skip(p: Path) -> bool: + if p.suffix.lower() in skip_ext: + counters['skipped_by_ext'] += 1 + return True + parts = {x.lower() for x in p.parts} + if any(d in parts for d in skip_dirs): + counters['skipped_by_dir'] += 1 + return True + return False + + for p in root.rglob('*'): + if not p.is_file(): + continue + if should_skip(p): + continue + + # Release only artifacts: never version bumped on version branch creation + if p.parent == root and p.name.lower() in {'update.xml', 'updates.xml'}: + counters['skipped_release_artifacts'] += 1 + continue + + try: + text = p.read_text(encoding='utf-8', errors='replace') + except Exception: + counters['skipped_read_error'] += 1 + continue + + original = text + + text, n1 = header_re.subn(lambda m: m.group(1) + new_version, text) + if n1: + counters['header_replacements'] += n1 + + if p.suffix.lower() == '.xml' and manifest_marker_re.search(text): + text2, n2 = xml_version_re.subn(lambda m: m.group(1) + new_version + m.group(3), text) + text = text2 + if n2: + counters['xml_version_replacements'] += n2 + + for rx in xml_date_res: + text3, n3 = rx.subn(lambda m: m.group(1) + stamp + m.group(3), text) + text = text3 + if n3: + counters['xml_date_replacements'] += n3 + + if text != original: + updated_manifests.append(str(p)) if text != original: p.write_text(text, encoding='utf-8') @@ -431,21 +476,10 @@ jobs: if [[ -f "update.xml" ]]; then echo "[INFO] update.xml present at repo root. Clearing contents because it is release generated only." - - # Truncate file but keep it tracked for release workflows : > "update.xml" echo "[INFO] update.xml contents cleared" else echo "[INFO] update.xml not present. No action taken." - files --error-unmatch "update.xml" >/dev/null 2>&1; then - git rm -f "update.xml" - echo "[INFO] update.xml removed from index" - else - rm -f "update.xml" - echo "[INFO] update.xml removed from working tree" - fi - else - echo "[INFO] update.xml not present. No action taken." fi - name: Post bump audit (updates.xml date only)