From 262f07a33a943ac587c6f1e81500ad8b7bb65008 Mon Sep 17 00:00:00 2001 From: Igor Pecovnik Date: Mon, 24 Aug 2026 11:38:09 +0200 Subject: [PATCH 1/2] release-doc: reach the kernel and CI repos the repo table still missed Grouping by source repository landed in 49a745e, but the tables it added do not cover every repo that shows up in a quarter's digest. In 26.8 that leaves 18 entries filed by title alone: * armbian/uwe5622, the Unisoc UWE5622 wifi driver, is an out-of-tree driver repo, but its name is the chip rather than 'wifi-' or a '-dkms' suffix, so 14 of its 16 changes land in "Other" and the rest scatter across CI and Tooling. * armbian/phytium-linux-kernel puts the vendor ahead of 'linux', so the 'linux-' prefix rule does not see it. * armbian/linux, the kernel mirror, is 'linux' exactly and misses the same rule. * armbian/distribution and armbian/shallow have no entry at all. Add the repos the pattern cannot reach to REPO_FIXED, including the firmware-blob collections that sit alongside rkbin and qcombin, add the two missing CI repos and armbian/scripts to REPO_HOME, and match repo names case-insensitively -- the org spells them both ways (MorseMicro-DKMS, sunxi-DT-overlays) and the digest reports whatever GitHub reports. Replaying the real 26.8 digest through the classifier: 18 entries move, "Other" drops from 71 to 57, and Boards and Desktop are untouched. collect-board-tier-changes had a related gap. A board that moves twice in one window keeps only the newest hop's PR link, so if that hop is a merge-queue commit nothing can resolve, the entry renders unlinked even when the older hop carries a "(#123)" subject. Backfill from the older hop when the newer one has no link. Signed-off-by: Igor Pecovnik --- scripts/collect-board-tier-changes.py | 6 ++++++ scripts/generate-release-doc.py | 31 +++++++++++++++++++++------ 2 files changed, 31 insertions(+), 6 deletions(-) diff --git a/scripts/collect-board-tier-changes.py b/scripts/collect-board-tier-changes.py index 0d46245358..5566851dfa 100755 --- a/scripts/collect-board-tier-changes.py +++ b/scripts/collect-board-tier-changes.py @@ -148,6 +148,12 @@ def main(): continue if old_stem in merged: merged[old_stem][0] = old_ext + # The newest hop owns the link, since it produced the tier the + # board ends the window on. But if nothing could link that hop, + # an older one is a better answer than no link at all. + if not merged[old_stem][2] and ref: + merged[old_stem][2] = ref + merged[old_stem][3] = url else: merged[old_stem] = [old_ext, new_ext, ref, url] diff --git a/scripts/generate-release-doc.py b/scripts/generate-release-doc.py index f5512f9ed1..cdc2d204f6 100755 --- a/scripts/generate-release-doc.py +++ b/scripts/generate-release-doc.py @@ -131,12 +131,22 @@ r"generate|generation|release|repo|docker|deps|dispatch|sync)(-|$)" ) -# Repos whose entire output belongs to one group regardless of title. +# Repos whose entire output belongs to one group regardless of title. Kernel +# mirrors, firmware-blob collections and out-of-tree drivers whose names the +# pattern below does not reach: 'uwe5622' names the chip, 'mtkbin' and +# 'odroidc2-blobs' name the vendor, and 'phytium-linux-kernel' puts the vendor +# ahead of 'linux'. REPO_FIXED = { + "armbian/linux": "Kernel and U-Boot", "armbian/linux-rockchip": "Kernel and U-Boot", + "armbian/phytium-linux-kernel": "Kernel and U-Boot", "armbian/rkbin": "Kernel and U-Boot", - "armbian/firmware": "Kernel and U-Boot", + "armbian/mtkbin": "Kernel and U-Boot", "armbian/qcombin": "Kernel and U-Boot", + "armbian/odroidc2-blobs": "Kernel and U-Boot", + "armbian/firmware": "Kernel and U-Boot", + "armbian/sunxi-dt-overlays": "Kernel and U-Boot", + "armbian/uwe5622": "Kernel and U-Boot", } # Single-purpose repos supply a fallback when no title rule fires. armbian/build @@ -153,11 +163,14 @@ "armbian/docker-armbian-build": "Build framework and CI", "armbian/sdk": "Build framework and CI", "armbian/ci": "Build framework and CI", + "armbian/distribution": "Build framework and CI", + "armbian/shallow": "Build framework and CI", "armbian/configng": "Tooling", "armbian/imager": "Tooling", "armbian/documentation": "Tooling", "armbian/website": "Tooling", "armbian/armbian-router": "Tooling", + "armbian/scripts": "Tooling", } @@ -281,10 +294,16 @@ def names_a_board(title, boards, families): def repo_fixed_group(repo): - """Kernel-tree, firmware-blob and out-of-tree driver repos, by pattern.""" - if repo in REPO_FIXED: - return REPO_FIXED[repo] - name = repo.split("/", 1)[-1].lower() + """Kernel-tree, firmware-blob and out-of-tree driver repos, by pattern. + + Matched case-insensitively: the org spells repos both ways + (MorseMicro-DKMS, sunxi-DT-overlays), and the digest reports whatever + GitHub reports. + """ + lowered = repo.lower() + if lowered in REPO_FIXED: + return REPO_FIXED[lowered] + name = lowered.split("/", 1)[-1] if name.startswith(("linux-", "wifi-", "rtl", "rtw")) or name.endswith("-dkms"): return "Kernel and U-Boot" return None From 005ff9a21f70b980f67e21da6b37574822aca369 Mon Sep 17 00:00:00 2001 From: Igor Pecovnik Date: Wed, 26 Aug 2026 20:46:12 +0200 Subject: [PATCH 2/2] release-doc: case-normalize repo before REPO_HOME lookup in classify() repo_fixed_group() already matches case-insensitively (GitHub reports repos in mixed case), but classify() looked up REPO_HOME with the raw repo id while its keys are all lowercase. A mixed-case id like Armbian/distribution therefore missed its configured home and fell through to title-based classification. Lowercase the id before the lookup, matching repo_fixed_group(). Signed-off-by: Igor Pecovnik --- scripts/generate-release-doc.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/generate-release-doc.py b/scripts/generate-release-doc.py index cdc2d204f6..9ddf02673f 100755 --- a/scripts/generate-release-doc.py +++ b/scripts/generate-release-doc.py @@ -328,7 +328,7 @@ def classify(title, repo, boards, families): # a board name really does mean a kernel or board change; in configng or # imager the same words describe the subject of a tooling change. Desktop # is the one group these repos genuinely also belong to, so it may win. - home = REPO_HOME.get(repo) + home = REPO_HOME.get(repo.lower()) # keys are lowercase; GitHub reports repos in mixed case if home: if parts & PREFIX_GROUPS["Desktop"] or RE_DESKTOP.search(low): return "Desktop"