99e5641127
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
356 lines
17 KiB
TOML
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]+$'
|