Files
RedBear-OS/local/external-upstream-map.toml
T
vasilito 99e5641127 feat: release-bump pipeline + external graphics version sync
Pipeline (3 operator asks):
- bump-release.sh: canonical orchestrator (forks + sources + external)
- upgrade-forks.sh --to=<tag>: rebase forks with diverged-mode guard
- bump-graphics-recipes.sh: map-driven group-aware graphics bumps
- check-external-versions.sh: drift checker for Qt6/KF6/Plasma/Mesa/Wayland
- refresh-fork-upstream-map.sh: append-only map updater with --check
- post-checkout-version-sync.sh + install-git-hooks.sh: opt-in branch hook
- external_version_lib.py: shared version-parsing/bumping library
- external-upstream-map.toml: ~80 external package entries
- bump-fork.sh: deprecated (REDBEAR_I_KNOW_BUMP_FORK_IS_DEPRECATED=1)
- RELEASE-BUMP-WORKFLOW.md: operator runbook

Quality fixes (8 defects from two independent audits):
- blake2b stable cache keys (was hash(), non-portable)
- atomic cache writes via os.replace
- version_sort_key pre-release demotion (was sorting after finals)
- apply_ver_transform re.error tolerance
- grep || true (pipefail abort)
- cd failure detection in upgrade-forks
- sed URL escape (injection hardening)
- refresh-fork-upstream-map last-row drop fix

Doc cleanup:
- Archive 5 obsolete plans to local/docs/archived/
- Remove 14 stale/superseded docs
- Update 18 docs to reference bump-release.sh and fix inbound links
- TOOLS.md drift fixes
2026-07-18 14:45:41 +09:00

356 lines
17 KiB
TOML

# ============================================================================
# external-upstream-map.toml — Red Bear OS graphical/desktop external sources
# ============================================================================
#
# Purpose
# Declarative description of every external (non-fork, non-path) upstream
# source consumed by the graphical / desktop build surface. Drives two
# tools:
# - local/scripts/check-external-versions.sh (read-only status report)
# - local/scripts/bump-graphics-recipes.sh (rewrites tar=/rev=/blake3=)
#
# Schema
# [groups.<id>] a version-coherent family (one version resolved, applied
# to every member). Qt6 / KF6 / Plasma each resolve their
# upstream version ONCE per group.
# version_index URL listing available versions (HTML or JSON).
# version_regex Python regex; capture group 1 holds the version token.
# resolve "version" (default; index lists full X.Y.Z) or
# "majmin" (index lists X.Y series dirs; full version
# is constructed as "<majmin>.0").
# recipe_root directory holding every member recipe (e.g.
# "local/recipes/kde"). Members are "<recipe_root>/<member>".
# tar_template default tar URL; supports {ver}, {majmin}, {name}.
# url_name_strip_prefix strip this prefix from a member's directory name
# to get its URL name (e.g. "kf6-" → "attica"). Members
# not starting with the prefix are used verbatim.
# members explicit recipe directory-name list.
# member_url_names overrides: { "<member>" = "<url_name>" } for irregulars
# (kf6-kded6 → kded, qt6-sensors → qtsensors, ...).
# member_templates overrides: { "<member>" = { tar_template = "..." } }
# for members whose URL family differs from the group
# default (kirigami on invent.kde.org, plasma members
# on invent.kde.org, ...).
#
# [packages.<id>] a singleton (one recipe, independently versioned).
# kind "tar" — version_index + tar_template bump model.
# "git-rev" — git ls-remote --tags + tag_regex bump model.
# recipe canonical recipe directory ("local/recipes/...").
# For kind = "tar": version_index, version_regex, resolve, tar_template.
# For kind = "git-rev": git_url, tag_regex.
#
# Update policy
# - Operator-edited. Agents MUST NOT edit this file without operator approval.
# - Every entry MUST be verifiable against the real recipe.toml before commit
# (run check-external-versions.sh and confirm CURRENT/OUTDATED is accurate).
# - When a series moves (e.g. Qt 6.11 → 6.12, KF6 6.28 → 6.29, GNOME series
# bump), update the affected version_index URL. The bumper then resolves
# the new series automatically.
# - series-locked indexes (glib/pango point at a specific X.Y subdir of
# download.gnome.org) are intentional: GNOME ships many patch releases
# within a series; locking the index avoids cross-series noise. Bump the
# series in this map when GNOME moves.
#
# Exclusions (deliberately NOT in this map)
# - Git branch-followers (curl, openssl, sdl2, seatd, polkit-qt6, icon themes):
# they track a branch tip, not a versioned release.
# - path = recipes (libepoxy, libdisplay-info, libpciaccess, libudev,
# libxcvt, zbus, pam-redbear, qt6-wayland-smoke): in-tree sources, no
# upstream tarball.
# - recipes/core/*: fork territory, managed by the fork pipeline.
# - icu: non-standard tag/tarball separator transform (release-75-1 tag vs
# icu4c-75_1-src.tgz); cannot be expressed by {ver}/{majmin} cleanly.
# Manually managed until the templating supports separator transforms.
# - fontconfig, gdk-pixbuf: no local/recipes/ entry exists (only mainline
# recipes/dev/*). Added to the map when a local fork/recipe is created.
#
# Verified 2026-07-18 against actual recipe.toml tar=/rev= lines.
# ============================================================================
# ---------------------------------------------------------------------------
# Groups
# ---------------------------------------------------------------------------
# ---- KF6 Frameworks -------------------------------------------------------
# 45 members: 44 tar from download.kde.org/stable/frameworks/<majmin>/ +
# kirigami (same 6.28.0 version, different host/template).
# Irregulars verified against recipe.toml:
# kf6-extra-cmake-modules → extra-cmake-modules
# kf6-kded6 → kded
# kf6-pty → kpty
# kf6-notifyconfig → knotifyconfig
# kf6-parts → kparts
# kf6-syntaxhighlighting → syntax-highlighting
# NOTE: kf6-kwayland and kf6-plasma-activities are Plasma-group members
# (they pull from stable/plasma/) and are listed under [groups.plasma].
[groups.kf6]
version_index = "https://download.kde.org/stable/frameworks/"
version_regex = 'href="([0-9]+\.[0-9]+)/"'
resolve = "majmin"
recipe_root = "local/recipes/kde"
url_name_strip_prefix = "kf6-"
tar_template = "https://download.kde.org/stable/frameworks/{majmin}/{name}-{ver}.tar.xz"
members = [
"kf6-attica", "kf6-extra-cmake-modules", "kf6-karchive", "kf6-kauth",
"kf6-kbookmarks", "kf6-kcmutils", "kf6-kcodecs", "kf6-kcolorscheme",
"kf6-kcompletion", "kf6-kconfig", "kf6-kconfigwidgets", "kf6-kcoreaddons",
"kf6-kcrash", "kf6-kdbusaddons", "kf6-kdeclarative", "kf6-kded6",
"kf6-kglobalaccel", "kf6-kguiaddons", "kf6-ki18n", "kf6-kiconthemes",
"kf6-kidletime", "kf6-kimageformats", "kf6-kio", "kf6-kitemmodels",
"kf6-kitemviews", "kf6-kjobwidgets", "kf6-knewstuff", "kf6-knotifications",
"kf6-kpackage", "kf6-kservice", "kf6-ksvg", "kf6-ktexteditor",
"kf6-ktextwidgets", "kf6-kwallet", "kf6-kwidgetsaddons",
"kf6-kwindowsystem", "kf6-kxmlgui", "kf6-notifyconfig", "kf6-parts",
"kf6-prison", "kf6-pty", "kf6-solid", "kf6-sonnet",
"kf6-syntaxhighlighting", "kirigami",
]
[groups.kf6.member_url_names]
"kf6-extra-cmake-modules" = "extra-cmake-modules"
"kf6-kded6" = "kded"
"kf6-notifyconfig" = "knotifyconfig"
"kf6-parts" = "kparts"
"kf6-pty" = "kpty"
"kf6-syntaxhighlighting" = "syntax-highlighting"
# kirigami ships the same framework version but via invent.kde.org archive.
[groups.kf6.member_templates.kirigami]
tar_template = "https://invent.kde.org/frameworks/kirigami/-/archive/v{ver}/kirigami-v{ver}.tar.gz"
# ---- Qt6 ------------------------------------------------------------------
# 6 members. qt6-sensors recipe → "qtsensors" URL submodule name.
[groups.qt6]
version_index = "https://download.qt.io/official_releases/qt/6.11/"
version_regex = 'href="([0-9]+\.[0-9]+\.[0-9]+)/"'
resolve = "version"
recipe_root = "local/recipes/qt"
url_name_strip_prefix = ""
tar_template = "https://download.qt.io/official_releases/qt/{majmin}/{ver}/submodules/{name}-everywhere-src-{ver}.tar.xz"
members = ["qtbase", "qtdeclarative", "qtsvg", "qtwayland", "qtshadertools", "qt6-sensors"]
[groups.qt6.member_url_names]
"qt6-sensors" = "qtsensors"
# ---- Plasma ---------------------------------------------------------------
# Version resolved ONCE from download.kde.org/stable/plasma/, applied to:
# - download.kde.org/stable/plasma/ family (default template):
# breeze, kf6-kwayland(→kwayland), kf6-plasma-activities(→plasma-activities),
# plasma-workspace
# - invent.kde.org/plasma/<name>/ family (per-member overrides):
# kwin, kdecoration, kglobalacceld, kde-cli-tools, plasma-desktop
# - invent.kde.org/frameworks/plasma-framework/ (different group path):
# plasma-framework
# plasma-wayland-protocols is intentionally OUT of this group (independent
# 1.21.0 versioning); it is a singleton below.
[groups.plasma]
version_index = "https://download.kde.org/stable/plasma/"
version_regex = 'href="([0-9]+\.[0-9]+\.[0-9]+)/"'
resolve = "version"
recipe_root = "local/recipes/kde"
url_name_strip_prefix = "kf6-"
tar_template = "https://download.kde.org/stable/plasma/{ver}/{name}-{ver}.tar.xz"
members = [
"breeze", "kf6-kwayland", "kf6-plasma-activities", "plasma-workspace",
"kwin", "kdecoration", "kglobalacceld", "kde-cli-tools",
"plasma-desktop", "plasma-framework",
]
[groups.plasma.member_url_names]
"kf6-kwayland" = "kwayland"
"kf6-plasma-activities" = "plasma-activities"
[groups.plasma.member_templates.kwin]
tar_template = "https://invent.kde.org/plasma/kwin/-/archive/v{ver}/kwin-v{ver}.tar.gz"
[groups.plasma.member_templates.kdecoration]
tar_template = "https://invent.kde.org/plasma/kdecoration/-/archive/v{ver}/kdecoration-v{ver}.tar.gz"
[groups.plasma.member_templates.kglobalacceld]
tar_template = "https://invent.kde.org/plasma/kglobalacceld/-/archive/v{ver}/kglobalacceld-v{ver}.tar.gz"
[groups.plasma.member_templates.kde-cli-tools]
tar_template = "https://invent.kde.org/plasma/kde-cli-tools/-/archive/v{ver}/kde-cli-tools-v{ver}.tar.gz"
[groups.plasma.member_templates.plasma-desktop]
tar_template = "https://invent.kde.org/plasma/plasma-desktop/-/archive/v{ver}/plasma-desktop-v{ver}.tar.gz"
[groups.plasma.member_templates.plasma-framework]
tar_template = "https://invent.kde.org/frameworks/plasma-framework/-/archive/v{ver}/plasma-framework-v{ver}.tar.gz"
# ---------------------------------------------------------------------------
# Singletons — tar
# ---------------------------------------------------------------------------
# mesa — software 3D / LLVMpipe / virgl. GitLab archive URL.
[packages.mesa]
kind = "tar"
recipe = "local/recipes/libs/mesa"
version_index = "https://archive.mesa3d.org/"
version_regex = 'href="mesa-([0-9]+\.[0-9]+\.[0-9]+)\.tar'
resolve = "version"
tar_template = "https://gitlab.freedesktop.org/mesa/mesa/-/archive/mesa-{ver}/mesa-mesa-{ver}.tar.gz"
# libdrm — DRM user-space library. Static dri.freedesktop.org listing for
# version discovery; tarball from GitLab archive.
[packages.libdrm]
kind = "tar"
recipe = "local/recipes/libs/libdrm"
version_index = "https://dri.freedesktop.org/libdrm/"
version_regex = 'href="libdrm-([0-9]+\.[0-9]+\.[0-9]+)\.tar'
resolve = "version"
tar_template = "https://gitlab.freedesktop.org/mesa/libdrm/-/archive/libdrm-{ver}/libdrm-libdrm-{ver}.tar.gz"
# libwayland — Wayland protocol C library.
[packages.libwayland]
kind = "tar"
recipe = "local/recipes/wayland/libwayland"
version_index = "https://gitlab.freedesktop.org/wayland/wayland/-/tags"
version_regex = '/wayland/wayland/-/tags/([0-9]+\.[0-9]+\.[0-9]+)'
resolve = "version"
tar_template = "https://gitlab.freedesktop.org/wayland/wayland/-/releases/{ver}/downloads/wayland-{ver}.tar.xz"
# wayland-protocols — Wayland protocol XML.
[packages.wayland-protocols]
kind = "tar"
recipe = "local/recipes/wayland/wayland-protocols"
version_index = "https://gitlab.freedesktop.org/wayland/wayland-protocols/-/tags"
version_regex = '/wayland/wayland-protocols/-/tags/([0-9]+\.[0-9]+(?:\.[0-9]+)?)'
resolve = "version"
tar_template = "https://gitlab.freedesktop.org/wayland/wayland-protocols/-/releases/{ver}/downloads/wayland-protocols-{ver}.tar.xz"
# libevdev — evdev wrapper. Static freedesktop.org listing.
[packages.libevdev]
kind = "tar"
recipe = "local/recipes/libs/libevdev"
version_index = "https://www.freedesktop.org/software/libevdev/"
version_regex = 'libevdev-([0-9]+\.[0-9]+\.[0-9]+)\.tar'
resolve = "version"
tar_template = "https://www.freedesktop.org/software/libevdev/libevdev-{ver}.tar.xz"
# libinput — input device management. GitLab tags page.
[packages.libinput]
kind = "tar"
recipe = "local/recipes/libs/libinput"
version_index = "https://gitlab.freedesktop.org/libinput/libinput/-/tags"
version_regex = '/libinput/libinput/-/tags/([0-9]+\.[0-9]+\.[0-9]+)'
resolve = "version"
tar_template = "https://gitlab.freedesktop.org/libinput/libinput/-/archive/{ver}/libinput-{ver}.tar.bz2"
# libxkbcommon — keyboard description library. GitHub archive tag.
[packages.libxkbcommon]
kind = "tar"
recipe = "local/recipes/libs/libxkbcommon"
version_index = "https://github.com/xkbcommon/libxkbcommon/tags"
version_regex = 'xkbcommon-([0-9]+\.[0-9]+\.[0-9]+)'
resolve = "version"
tar_template = "https://github.com/xkbcommon/libxkbcommon/archive/refs/tags/xkbcommon-{ver}.tar.gz"
# dbus — system + session message bus. Static freedesktop.org releases listing.
[packages.dbus]
kind = "tar"
recipe = "local/recipes/system/dbus"
version_index = "https://dbus.freedesktop.org/releases/dbus/"
version_regex = 'dbus-([0-9]+\.[0-9]+\.[0-9]+)\.tar'
resolve = "version"
tar_template = "https://dbus.freedesktop.org/releases/dbus/dbus-{ver}.tar.xz"
# glib — GNOME core library. Series-locked index (operator bumps series here).
[packages.glib]
kind = "tar"
recipe = "local/recipes/libs/glib"
version_index = "https://download.gnome.org/sources/glib/2.89/"
version_regex = 'glib-([0-9]+\.[0-9]+\.[0-9]+)\.tar'
resolve = "version"
tar_template = "https://download.gnome.org/sources/glib/{majmin}/glib-{ver}.tar.xz"
# cairo — 2D graphics. Static cairographics.org releases listing.
[packages.cairo]
kind = "tar"
recipe = "local/recipes/libs/cairo"
version_index = "https://www.cairographics.org/releases/"
version_regex = 'cairo-([0-9]+\.[0-9]+\.[0-9]+)\.tar'
resolve = "version"
tar_template = "https://www.cairographics.org/releases/cairo-{ver}.tar.xz"
# pango — text layout. Series-locked GNOME index.
[packages.pango]
kind = "tar"
recipe = "local/recipes/libs/pango"
version_index = "https://download.gnome.org/sources/pango/1.56/"
version_regex = 'pango-([0-9]+\.[0-9]+\.[0-9]+)\.tar'
resolve = "version"
tar_template = "https://download.gnome.org/sources/pango/{majmin}/pango-{ver}.tar.xz"
# harfbuzz — text shaping. GitHub tags HTML is JS-only; use the API (JSON).
[packages.harfbuzz]
kind = "tar"
recipe = "local/recipes/libs/harfbuzz"
version_index = "https://api.github.com/repos/harfbuzz/harfbuzz/tags"
version_regex = '"name":\s*"([0-9]+\.[0-9]+\.[0-9]+)"'
resolve = "version"
tar_template = "https://github.com/harfbuzz/harfbuzz/releases/download/{ver}/harfbuzz-{ver}.tar.xz"
# freetype2 — font rendering. GitLab tags use VER-X-Y-Z format; ver_transform
# converts the captured dashes to dots. Tarball via sourceforge (canonical URL
# used by the recipe).
[packages.freetype2]
kind = "tar"
recipe = "local/recipes/libs/freetype2"
version_index = "https://gitlab.freedesktop.org/freetype/freetype/-/tags"
version_regex = '/freetype/freetype/-/tags/VER-([0-9]+-[0-9]+-[0-9]+)'
ver_transform = "s/-/./g"
resolve = "version"
tar_template = "https://sourceforge.net/projects/freetype/files/freetype2/{ver}/freetype-{ver}.tar.xz/download"
# lcms2 — Little CMS. GitHub archive tag (tag "lcms2.19" → version "2.19").
[packages.lcms2]
kind = "tar"
recipe = "local/recipes/libs/lcms2"
version_index = "https://github.com/mm2/Little-CMS/tags"
version_regex = 'lcms([0-9]+\.[0-9]+)'
resolve = "version"
tar_template = "https://github.com/mm2/Little-CMS/archive/refs/tags/lcms{ver}.tar.gz"
# konsole — KDE terminal. Independent release cycle (KDE Gear, not Frameworks).
# invent.kde.org tags page.
[packages.konsole]
kind = "tar"
recipe = "local/recipes/kde/konsole"
version_index = "https://invent.kde.org/utilities/konsole/-/tags"
version_regex = '/utilities/konsole/-/tags/v([0-9]+\.[0-9]+\.[0-9]+)'
resolve = "version"
tar_template = "https://invent.kde.org/utilities/konsole/-/archive/v{ver}/konsole-v{ver}.tar.gz"
# plasma-wayland-protocols — INDEPENDENT versioning (1.21.0, NOT plasma 6.7.x).
[packages.plasma-wayland-protocols]
kind = "tar"
recipe = "local/recipes/kde/plasma-wayland-protocols"
version_index = "https://invent.kde.org/libraries/plasma-wayland-protocols/-/tags"
version_regex = '/libraries/plasma-wayland-protocols/-/tags/v([0-9]+\.[0-9]+\.[0-9]+)'
resolve = "version"
tar_template = "https://invent.kde.org/libraries/plasma-wayland-protocols/-/archive/v{ver}/plasma-wayland-protocols-v{ver}.tar.gz"
# ---------------------------------------------------------------------------
# Singletons — git-rev
# ---------------------------------------------------------------------------
# sddm — display manager. rev is a commit sha; resolve latest tag's sha.
[packages.sddm]
kind = "git-rev"
recipe = "local/recipes/kde/sddm"
git_url = "https://github.com/sddm/sddm.git"
tag_regex = '^v?[0-9]+\.[0-9]+\.[0-9]+$'
# pipewire — audio/video server. rev is a tag name (e.g. "0.3.85").
[packages.pipewire]
kind = "git-rev"
recipe = "local/recipes/libs/pipewire"
git_url = "https://gitlab.freedesktop.org/pipewire/pipewire.git"
tag_regex = '^[0-9]+\.[0-9]+\.[0-9]+$'
# wireplumber — PipeWire session manager. rev is a tag name (e.g. "0.4.14").
[packages.wireplumber]
kind = "git-rev"
recipe = "local/recipes/libs/wireplumber"
git_url = "https://gitlab.freedesktop.org/pipewire/wireplumber.git"
tag_regex = '^[0-9]+\.[0-9]+\.[0-9]+$'