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)