feat: record the build file behind a held pin

pin_frozen was prose, and no tool read the build file it cites, so a platform building another revision left the profile holding one nobody ships. pin_build records the platform, its repository, the revision read, the file, the variable and its value. check_freshness reads the file again where the platform's YAML now stands and reports STALE when the value moved. 36 of the 46 held profiles carry it, each value read from the build file at the platform's scraped revision. The other ten name no build file and are counted on one row: six RetroBat binary packages and four holds not tied to a platform build.
This commit is contained in:
Abdessamad Derraz committed 2026-11-05 19:54:48 +01:00
1 parent c1f0e8c2ca
commit 3011ee498e
43 files changed
+571 -4

No files matched your search

+7
View File
@@ -7,6 +7,13 @@ author: "trngaje (hooks), Exophase (DraStic)"
profiled_date: "2026-10-22"
source_commit: "eaf41ab9bc8adcc15c010bf9517bc94c38e7bffd"
pin_frozen: "KNULLI, the only platform that ships it, builds this revision (KNULLI package/emulators/advanced_drastic/advanced_drastic.mk:7 at tag 20260511). Later commits are not part of that build."
pin_build:
- platform: knulli
repo: "https://github.com/knulli-cfw/knulli-linux"
revision: "20260511"
path: "package/emulators/advanced_drastic/advanced_drastic.mk"
variable: ADVANCED_DRASTIC_VERSION
value: "eaf41ab9bc8adcc15c010bf9517bc94c38e7bffd"
core_version: "r2.5.2.0"
version_basis:
kind: file
+7
View File
@@ -6,6 +6,13 @@ upstream: "https://www.mamedev.org"
profiled_date: "2026-10-20"
source_commit: "237ca5c898e51e1b7a70ce52bccf008aa722e924"
pin_frozen: "RetroPie builds the advancemame-1.4 release tarball, whose src/ tree is this tag. Later commits are not part of that build."
pin_build:
- platform: retropie
repo: "https://github.com/RetroPie/RetroPie-Setup"
revision: "46128cd252cdecae852a4d0bafa2aaf9d03ab563"
path: "scriptmodules/emulators/advmame-1.4.sh"
variable: rp_module_repo
value: "file $__archive_url/advancemame-1.4.tar.gz"
core_version: "advancemame-1.4"
version_basis:
kind: tag
+7
View File
@@ -6,6 +6,13 @@ upstream: "https://github.com/Aleph-One-Marathon/alephone"
profiled_date: "2026-10-20"
source_commit: "07a9c36aff403d143a0608815f725631a01e382c"
pin_frozen: "RetroPie, the only platform that ships it, builds the release-20250829 tag at this commit (scriptmodules/ports/alephone.sh, _get_branch_alephone). Debian 10 and older get release-20250302."
pin_build:
- platform: retropie
repo: "https://github.com/RetroPie/RetroPie-Setup"
revision: "46128cd252cdecae852a4d0bafa2aaf9d03ab563"
path: "scriptmodules/ports/alephone.sh"
variable: version
value: "20250829"
core_version: "release-20250829"
version_basis:
kind: tag
+7
View File
@@ -5,6 +5,13 @@ source: "https://github.com/johndoe6345789/azahar_libretro"
profiled_date: "2026-10-22"
source_commit: "c8d39853c1ebacc5657e51d601713a09404ca8a7"
pin_frozen: "KNULLI, the only platform that ships it, builds this revision (KNULLI package/emulators/azahar/azahar.mk:7 at tag 20260511). Later commits are not part of that build."
pin_build:
- platform: knulli
repo: "https://github.com/knulli-cfw/knulli-linux"
revision: "20260511"
path: "package/emulators/azahar/azahar.mk"
variable: AZAHAR_VERSION
value: "c8d39853c1ebacc5657e51d601713a09404ca8a7"
core_version: "2122-rc1-178-gc8d3985"
version_basis:
kind: tag
+7
View File
@@ -5,6 +5,13 @@ source: "https://github.com/christianhaitian/bennugd-monolithic"
profiled_date: "2026-10-22"
source_commit: "60ee3389efcf9b402d66035e87f33d17d70cbd83"
pin_frozen: "EmuELEC, the only platform that ships it, builds this revision (EmuELEC packages/sx05re/emuelec-ports/bennugd-monolithic/package.mk:5 at v4.8). Later commits are not part of that build."
pin_build:
- platform: emuelec
repo: "https://github.com/EmuELEC/EmuELEC"
revision: "v4.8"
path: "packages/sx05re/emuelec-ports/bennugd-monolithic/package.mk"
variable: PKG_VERSION
value: "60ee3389efcf9b402d66035e87f33d17d70cbd83"
core_version: "1.0.0"
version_basis:
kind: file
+7
View File
@@ -5,6 +5,13 @@ source: "https://github.com/cyxx/bermuda"
profiled_date: "2026-10-22"
source_commit: "cf6bdb68d53a1618967da565a44c931b15daf791"
pin_frozen: "EmuELEC, the only platform that ships it, builds this revision (EmuELEC packages/sx05re/emuelec-ports/bermuda/package.mk:5 at v4.8). Later commits are not part of that build."
pin_build:
- platform: emuelec
repo: "https://github.com/EmuELEC/EmuELEC"
revision: "v4.8"
path: "packages/sx05re/emuelec-ports/bermuda/package.mk"
variable: PKG_VERSION
value: "cf6bdb68d53a1618967da565a44c931b15daf791"
core_version: "0.1.7"
version_basis:
kind: file
+7
View File
@@ -5,6 +5,13 @@ source: "https://github.com/lemon32767/ccleste"
profiled_date: "2026-10-22"
source_commit: "261d96f15af430b8111abc7a5250229246654f52"
pin_frozen: "EmuELEC, the only platform that ships it, builds this revision (EmuELEC packages/sx05re/emuelec-ports/ccleste/package.mk:5 at v4.8). Later commits are not part of that build."
pin_build:
- platform: emuelec
repo: "https://github.com/EmuELEC/EmuELEC"
revision: "v4.8"
path: "packages/sx05re/emuelec-ports/ccleste/package.mk"
variable: PKG_VERSION
value: "261d96f15af430b8111abc7a5250229246654f52"
core_version: "v1.4.0"
version_basis:
kind: tag
+7
View File
@@ -5,6 +5,13 @@ source: "https://github.com/chocolate-doom/chocolate-doom"
profiled_date: "2026-10-22"
source_commit: "72d9e9318c4ccc61dab29bb9cc30bc8a9a93266d"
pin_frozen: "EmuELEC, the only platform that ships it, builds this revision (EmuELEC packages/sx05re/emuelec-ports/chocolate-doom/package.mk:5). Later commits are not part of that build."
pin_build:
- platform: emuelec
repo: "https://github.com/EmuELEC/EmuELEC"
revision: "v4.8"
path: "packages/sx05re/emuelec-ports/chocolate-doom/package.mk"
variable: PKG_VERSION
value: "72d9e9318c4ccc61dab29bb9cc30bc8a9a93266d"
core_version: "3.0.0"
version_basis:
kind: file
+7
View File
@@ -5,6 +5,13 @@ source: "https://github.com/DaedalusX64/daedalus"
profiled_date: "2026-10-17"
source_commit: "f17e9ed86f3806fadeb69abd29c9526ab2d4bd1b"
pin_frozen: "ROCKNIX 20261001 builds this revision. Later upstream commits are not part of that build."
pin_build:
- platform: rocknix
repo: "https://github.com/ROCKNIX/distribution"
revision: "20261001"
path: "projects/ROCKNIX/packages/emulators/standalone/daedalusx64-sa/package.mk"
variable: PKG_VERSION
value: "f17e9ed86f3806fadeb69abd29c9526ab2d4bd1b"
core_version: "1.1.8-837-gf17e9ed"
version_basis:
kind: tag
+7
View File
@@ -5,6 +5,13 @@ source: "https://github.com/beebono/DSperate"
profiled_date: "2026-10-17"
source_commit: "81b73832c2e68e2b10cb5850f0a6d393ffc6fbb7"
pin_frozen: "ROCKNIX 20261001 ships the v2.0.1 release binaries, built by CI from the v2.0.1 tag at this commit."
pin_build:
- platform: rocknix
repo: "https://github.com/ROCKNIX/distribution"
revision: "20261001"
path: "projects/ROCKNIX/packages/emulators/standalone/dsperate-sa/package.mk"
variable: PKG_VERSION
value: "2.0.1"
core_version: "v2.0.1"
version_basis:
kind: tag
+7
View File
@@ -5,6 +5,13 @@ source: "https://github.com/stenzek/duckstation"
profiled_date: "2026-10-22"
source_commit: "56ac3d6c324ec4520dac433b071ecab6227fb459"
pin_frozen: "Batocera builds this revision of 4 August 2023 as duckstation-legacy, its package marked not to be bumped, and KNULLI ships the same package."
pin_build:
- platform: batocera
repo: "https://github.com/batocera-linux/batocera.linux"
revision: "batocera-43.1"
path: "package/batocera/emulators/duckstation-legacy/duckstation-legacy.mk"
variable: DUCKSTATION_LEGACY_VERSION
value: "56ac3d6c324ec4520dac433b071ecab6227fb459"
core_version: "0.1-5612-g56ac3d6"
version_basis:
kind: tag
+7
View File
@@ -11,6 +11,13 @@ version_basis:
tag: "v1.2"
distance: 0
pin_frozen: "Recalbox, the only platform that ships this core, builds its tag v1.2 (Recalbox package/libretro-eightyone/libretro-eightyone.mk:8 at tag 10.1.1)."
pin_build:
- platform: recalbox
repo: "https://gitlab.com/recalbox/recalbox"
revision: "10.1.1"
path: "package/libretro-eightyone/libretro-eightyone.mk"
variable: LIBRETRO_EIGHTYONE_VERSION
value: "v1.2"
display_name: "Sinclair - ZX81 / ZX Spectrum (EightyOne, Recalbox)"
cores: ["eightyone"]
built_by: [recalbox]
+7
View File
@@ -11,6 +11,13 @@ version_basis:
tag: "v0.9"
distance: 0
pin_frozen: "Recalbox, the only platform that ships this core, builds its tag v0.9 (Recalbox package/libretro-exel-hence/libretro-exel-hence.mk:9 at tag 10.1.1)."
pin_build:
- platform: recalbox
repo: "https://gitlab.com/recalbox/recalbox"
revision: "10.1.1"
path: "package/libretro-exel-hence/libretro-exel-hence.mk"
variable: LIBRETRO_EXEL_HENCE_VERSION
value: "v0.9"
display_name: "Exelvision - EXL 100 (Exel-Hence)"
cores:
- "exel-hence"
+7
View File
@@ -7,6 +7,13 @@ profiled_date: "2026-10-17"
source_commit: "0581797db6fdffd826086b053ced4b6b29bb6678"
upstream_commit: "416948158d88ba17f87813419ddc3c1209ef68c0"
pin_frozen: "ROCKNIX 20261001 builds this revision as fbalpha2019. Later commits on libretro/fbalpha are not part of that build."
pin_build:
- platform: rocknix
repo: "https://github.com/ROCKNIX/distribution"
revision: "20261001"
path: "projects/ROCKNIX/packages/emulators/libretro/fbalpha2019-lr/package.mk"
variable: PKG_VERSION
value: "0581797db6fdffd826086b053ced4b6b29bb6678"
core_version: "v0.2.97.44"
version_basis:
kind: file
+7
View File
@@ -5,6 +5,13 @@ source: "https://github.com/ihhub/fheroes2"
profiled_date: "2026-10-22"
source_commit: "35ca4c915be00098547d5050412a325dd55cfd7f"
pin_frozen: "EmuELEC, the only platform that ships it, builds this revision (EmuELEC packages/sx05re/emuelec-ports/fheroes2/package.mk:5). Later commits are not part of that build."
pin_build:
- platform: emuelec
repo: "https://github.com/EmuELEC/EmuELEC"
revision: "v4.8"
path: "packages/sx05re/emuelec-ports/fheroes2/package.mk"
variable: PKG_VERSION
value: "35ca4c915be00098547d5050412a325dd55cfd7f"
core_version: "1.0.11"
version_basis:
kind: file
+7
View File
@@ -7,6 +7,13 @@ profiled_date: "2026-10-17"
source_commit: "603814c9f73b773c455d9a497f389d2f93a257fd"
upstream_commit: "4c293f306bc16a265c2d768af5d0cea138426054"
pin_frozen: "ROCKNIX 20261001 builds this revision. No branch of metallic77/flycast holds it any more: master was put back on the libretro merge base 4c293f30, so HEAD is the code before the fork's own commits."
pin_build:
- platform: rocknix
repo: "https://github.com/ROCKNIX/distribution"
revision: "20261001"
path: "projects/ROCKNIX/packages/emulators/libretro/flycast2021-lr/package.mk"
variable: PKG_VERSION
value: "603814c9f73b773c455d9a497f389d2f93a257fd"
core_version: "0.1"
version_basis:
kind: file
+7
View File
@@ -7,6 +7,13 @@ profiled_date: "2026-10-22"
source_commit: "bf93aece5db7050667075a1107ab380856b44a23"
upstream_commit: "4c293f306bc16a265c2d768af5d0cea138426054"
pin_frozen: "AmberELEC, the only platform that ships it, builds this revision (AmberELEC packages/games/libretro/flycast2021le/package.mk:5). Later commits are not part of that build."
pin_build:
- platform: amberelec
repo: "https://github.com/AmberELEC/AmberELEC"
revision: "a21975bfb1a3af68f66e07a931b994b523e1e6e2"
path: "packages/games/libretro/flycast2021le/package.mk"
variable: PKG_VERSION
value: "bf93aece5db7050667075a1107ab380856b44a23"
core_version: "0.1"
version_basis:
kind: file
+7
View File
@@ -7,6 +7,13 @@ source: "https://github.com/digarok/gsplus-legacy-archive"
profiled_date: "2026-10-20"
source_commit: "480572054518112647c8fae5d7ea7046a6d6ecfb"
pin_frozen: "Recalbox builds this commit (Recalbox package/gsplus/gsplus.mk:8-9 at tag 10.1.1). Batocera builds the applemu fork and RetroBat its release build, as the notes say."
pin_build:
- platform: recalbox
repo: "https://gitlab.com/recalbox/recalbox"
revision: "10.1.1"
path: "package/gsplus/gsplus.mk"
variable: GSPLUS_VERSION
value: "480572054518112647c8fae5d7ea7046a6d6ecfb"
core_version: "0.14"
version_basis:
kind: file
+7
View File
@@ -5,6 +5,13 @@ source: "https://github.com/usineur/hode"
profiled_date: "2026-10-22"
source_commit: "59f3c466923c6b8d49e29176ff697a91165e7efc"
pin_frozen: "EmuELEC, the only platform that ships it, builds this revision (EmuELEC packages/sx05re/emuelec-ports/hodesdl/package.mk:6 at v4.8). Later commits are not part of that build."
pin_build:
- platform: emuelec
repo: "https://github.com/EmuELEC/EmuELEC"
revision: "v4.8"
path: "packages/sx05re/emuelec-ports/hodesdl/package.mk"
variable: PKG_VERSION
value: "59f3c466923c6b8d49e29176ff697a91165e7efc"
core_version: "0.2.9f"
version_basis:
kind: file
+7
View File
@@ -6,6 +6,13 @@ upstream: "https://github.com/love2d/love"
profiled_date: "2026-10-20"
source_commit: "9e139779956ddba89333eece8104bd7b1b4ff2e7"
pin_frozen: "RetroPie, the only platform that ships it, builds the 0.10.2 tag at this commit (RetroPie scriptmodules/ports/love-0.10.2.sh:16). Later releases are packaged separately as love."
pin_build:
- platform: retropie
repo: "https://github.com/RetroPie/RetroPie-Setup"
revision: "46128cd252cdecae852a4d0bafa2aaf9d03ab563"
path: "scriptmodules/ports/love-0.10.2.sh"
variable: rp_module_repo
value: "git https://github.com/love2d/love 0.10.2"
core_version: "0.10.2"
version_basis:
kind: tag
+13
View File
@@ -5,6 +5,19 @@ source: "https://github.com/drfrag666/lzdoom"
profiled_date: "2026-10-20"
source_commit: "4ce19a12164ebd6802b7fb2f94d700a6e736d0fb"
pin_frozen: "The platforms that ship it run the 3.88 line: RetroPie builds tag 3.88b (RetroPie scriptmodules/ports/lzdoom.sh:15) and AmberELEC a fork of the g3.3mgw branch that still reports 3.88b (AmberELEC packages/games/emulators/lzdoom/package.mk:5). The l4.x releases are a GZDoom 4 based line that no platform ships."
pin_build:
- platform: retropie
repo: "https://github.com/RetroPie/RetroPie-Setup"
revision: "46128cd252cdecae852a4d0bafa2aaf9d03ab563"
path: "scriptmodules/ports/lzdoom.sh"
variable: rp_module_repo
value: "git https://github.com/drfrag666/gzdoom 3.88b"
- platform: amberelec
repo: "https://github.com/AmberELEC/AmberELEC"
revision: "a21975bfb1a3af68f66e07a931b994b523e1e6e2"
path: "packages/games/emulators/lzdoom/package.mk"
variable: PKG_VERSION
value: "8e12e62164ea1ba52625c63bc0f1c9e0076bff4c"
core_version: "3.88b"
version_basis:
kind: tag
+7
View File
@@ -7,6 +7,13 @@ profiled_date: '2026-10-22'
source_commit: dc1a96537089d6d4ecd01d9886b21061471c70c0
upstream_commit: 2e0aa823508663c4a27164be43467d1ef740cdcd
pin_frozen: 'Recalbox, the only platform that ships it, builds this revision (Recalbox package/libretro-mame0258/libretro-mame0258.mk:8 at tag 10.1.1). Later commits are not part of that build.'
pin_build:
- platform: recalbox
repo: "https://gitlab.com/recalbox/recalbox"
revision: "10.1.1"
path: "package/libretro-mame0258/libretro-mame0258.mk"
variable: LIBRETRO_MAME0258_VERSION
value: "dc1a96537089d6d4ecd01d9886b21061471c70c0"
core_version: "0.258"
version_basis:
kind: file
+7
View File
@@ -7,6 +7,13 @@ profiled_date: '2026-10-22'
source_commit: fba50741006fa3e27e1897f589d2048a505b8fd6
upstream_commit: eb05584a2b8d98d5af5587244c9cb7dcccf660fd
pin_frozen: 'Recalbox, the only platform that ships it, builds this revision (Recalbox package/libretro-mame0278/libretro-mame0278.mk:8 at tag 10.1.1). Later commits are not part of that build.'
pin_build:
- platform: recalbox
repo: "https://gitlab.com/recalbox/recalbox"
revision: "10.1.1"
path: "package/libretro-mame0278/libretro-mame0278.mk"
variable: LIBRETRO_MAME0278_VERSION
value: "fba50741006fa3e27e1897f589d2048a505b8fd6"
core_version: "0.278"
version_basis:
kind: file
+7
View File
@@ -5,6 +5,13 @@ source: "https://github.com/nba-emu/NanoBoyAdvance"
profiled_date: "2026-10-17"
source_commit: "3bb6f478f977dbfd3106508536e5fbce90d1898b"
pin_frozen: "ROCKNIX 20261001 builds this revision of the SDL2 frontend (v1.6 plus four commits). Later upstream work is not part of that build."
pin_build:
- platform: rocknix
repo: "https://github.com/ROCKNIX/distribution"
revision: "20261001"
path: "projects/ROCKNIX/packages/emulators/standalone/nanoboyadvance-sa/package.mk"
variable: PKG_VERSION
value: "3bb6f478f977dbfd3106508536e5fbce90d1898b"
core_version: "v1.6-4-g3bb6f47"
version_basis:
kind: tag
+7
View File
@@ -7,6 +7,13 @@ profiled_date: "2026-10-22"
source_commit: "0785214f13746bdfd709b1909f007e213b470ba1"
upstream_commit: "23208626e16e53b73fd21a2fbd0c429338625dc4"
pin_frozen: "AmberELEC, the only platform that ships it, builds this revision (AmberELEC packages/games/emulators/piemu/package.mk:5). Later commits are not part of that build."
pin_build:
- platform: amberelec
repo: "https://github.com/AmberELEC/AmberELEC"
revision: "a21975bfb1a3af68f66e07a931b994b523e1e6e2"
path: "packages/games/emulators/piemu/package.mk"
variable: PKG_VERSION
value: "0785214f13746bdfd709b1909f007e213b470ba1"
core_version: "20030430"
version_basis:
kind: file
+7
View File
@@ -5,6 +5,13 @@ source: "https://github.com/hrydgard/ppsspp"
profiled_date: "2026-10-20"
source_commit: "a1e74d0d4f89ba3fa2d4fe64bac7a0fa16fc146f"
pin_frozen: "RetroPie, the only platform that ships it, builds the v1.5.4 tag at this commit (RetroPie scriptmodules/emulators/ppsspp-1.5.4.sh:16). Later releases are packaged separately as ppsspp."
pin_build:
- platform: retropie
repo: "https://github.com/RetroPie/RetroPie-Setup"
revision: "46128cd252cdecae852a4d0bafa2aaf9d03ab563"
path: "scriptmodules/emulators/ppsspp-1.5.4.sh"
variable: rp_module_repo
value: "git https://github.com/hrydgard/ppsspp.git v1.5.4"
core_version: "v1.5.4"
version_basis:
kind: tag
+7
View File
@@ -10,6 +10,13 @@ source_commit:
standalone: "8c75a4b48a5222b0332d0508600f8ddc7ac1191c"
libretro: "7464996aa0cb1be77abf495dc901117e1af36e02"
pin_frozen: "Recalbox, the only platform that ships the standalone build, builds its tag v1.1 at this standalone revision (Recalbox package/rb5000/rb5000.mk:7). Later commits are not part of that build. The libretro pin is the HEAD of libretro-rb5000."
pin_build:
- platform: recalbox
repo: "https://gitlab.com/recalbox/recalbox"
revision: "10.1.1"
path: "package/rb5000/rb5000.mk"
variable: RB5000_VERSION
value: "v1.1"
core_version:
standalone: "v1.1"
libretro: "v0.9"
+7
View File
@@ -6,6 +6,13 @@ upstream: "https://github.com/skmp/reicast-emulator"
profiled_date: "2026-10-17"
source_commit: "ad61f95dd6b4c6218846a25de6194550311a5d28"
pin_frozen: "Recalbox 10.1.1 builds this revision (package/reicast/reicast.mk REICAST_VERSION). Later commits on reicast-emulator are not part of that build."
pin_build:
- platform: recalbox
repo: "https://gitlab.com/recalbox/recalbox"
revision: "10.1.1"
path: "package/reicast/reicast.mk"
variable: REICAST_VERSION
value: "ad61f95dd6b4c6218846a25de6194550311a5d28"
core_version: "r8.1-243-gad61f95"
version_basis:
kind: tag
+7
View File
@@ -6,6 +6,13 @@ upstream: "https://github.com/lethal-guitar/RigelEngine"
profiled_date: "2026-10-22"
source_commit: "f05996f9b3ad3b3ea5bb818e49e7977636746343"
pin_frozen: "EmuELEC, the only platform that ships it, builds this revision (EmuELEC packages/sx05re/emuelec-ports/rigelengine/package.mk:5 at v4.8). Later commits are not part of that build."
pin_build:
- platform: emuelec
repo: "https://github.com/EmuELEC/EmuELEC"
revision: "v4.8"
path: "packages/sx05re/emuelec-ports/rigelengine/package.mk"
variable: PKG_VERSION
value: "f05996f9b3ad3b3ea5bb818e49e7977636746343"
core_version: "0.9.1"
version_basis:
kind: file
+7
View File
@@ -5,6 +5,13 @@ source: "https://github.com/mmatyas/supermariowar"
profiled_date: "2026-10-22"
source_commit: "ed60ed45e296ff88a8883cbc51f5bf5aed880636"
pin_frozen: "EmuELEC, the only platform that ships it, builds this revision (EmuELEC packages/sx05re/emuelec-ports/supermariowar/package.mk:5). Later commits are not part of that build."
pin_build:
- platform: emuelec
repo: "https://github.com/EmuELEC/EmuELEC"
revision: "v4.8"
path: "packages/sx05re/emuelec-ports/supermariowar/package.mk"
variable: PKG_VERSION
value: "ed60ed45e296ff88a8883cbc51f5bf5aed880636"
core_version: "2.0.0"
version_basis:
kind: file
+7
View File
@@ -6,6 +6,13 @@ upstream: "https://github.com/trzy/Supermodel"
profiled_date: "2026-10-17"
source_commit: "0eef09ba2b74e48fd5cfd388ee69a3743fd5f618"
pin_frozen: "Batocera's supermodel-legacy package builds this revision, held before the renderer moved to OpenGL 4.1. Recaling would repoint these refs at code this build never had."
pin_build:
- platform: batocera
repo: "https://github.com/batocera-linux/batocera.linux"
revision: "batocera-43.1"
path: "package/batocera/emulators/supermodel-legacy/supermodel-legacy.mk"
variable: SUPERMODEL_LEGACY_VERSION
value: "0eef09ba2b74e48fd5cfd388ee69a3743fd5f618"
core_version: "0.3a-WIP"
version_basis:
kind: file
+7
View File
@@ -6,6 +6,13 @@ upstream: "https://github.com/snes9xgit/snes9x"
profiled_date: "2026-10-17"
source_commit: "691e47b40fb38fa522a5471462344a2f0206b7a8"
pin_frozen: "ROCKNIX 20261001 builds this revision. Later commits on shanytc/snes9x rework the Super Famicom Box loader and are not part of that build."
pin_build:
- platform: rocknix
repo: "https://github.com/ROCKNIX/distribution"
revision: "20261001"
path: "projects/ROCKNIX/packages/emulators/libretro/supersnes9x-lr/package.mk"
variable: PKG_VERSION
value: "691e47b40fb38fa522a5471462344a2f0206b7a8"
core_version: "1.63.29"
version_basis:
kind: file
+7
View File
@@ -5,6 +5,13 @@ source: "https://github.com/SuperTux/supertux"
profiled_date: "2026-10-22"
source_commit: "37cddf24a4abfdec7931a84afd9e87fb8ea18767"
pin_frozen: "EmuELEC, the only platform that ships it, builds this revision, v0.6.3 (EmuELEC packages/sx05re/emuelec-ports/supertux/package.mk:5). Later commits are not part of that build."
pin_build:
- platform: emuelec
repo: "https://github.com/EmuELEC/EmuELEC"
revision: "v4.8"
path: "packages/sx05re/emuelec-ports/supertux/package.mk"
variable: PKG_VERSION
value: "37cddf24a4abfdec7931a84afd9e87fb8ea18767"
core_version: "v0.6.3-1020-g37cddf2"
version_basis:
kind: tag
+7
View File
@@ -5,6 +5,13 @@ source: "https://github.com/supertuxkart/stk-code"
profiled_date: "2026-10-22"
source_commit: "fab79150111944c9e33396db68eb5de84f2efeaa"
pin_frozen: "EmuELEC, the only platform that ships it, builds this revision (EmuELEC packages/sx05re/emuelec-ports/supertuxkart/package.mk:5). Later commits are not part of that build."
pin_build:
- platform: emuelec
repo: "https://github.com/EmuELEC/EmuELEC"
revision: "v4.8"
path: "packages/sx05re/emuelec-ports/supertuxkart/package.mk"
variable: PKG_VERSION
value: "fab79150111944c9e33396db68eb5de84f2efeaa"
core_version: "preview-582-gfab7915"
version_basis:
kind: tag
+7
View File
@@ -5,6 +5,13 @@ source: "https://github.com/touchHLE/touchHLE"
profiled_date: "2026-10-17"
source_commit: "3c5850585ba55615b17a58c58331b6d6f52d4a9d"
pin_frozen: "ROCKNIX 20261001 builds this revision. Later upstream commits are not part of that build."
pin_build:
- platform: rocknix
repo: "https://github.com/ROCKNIX/distribution"
revision: "20261001"
path: "projects/ROCKNIX/packages/emulators/standalone/touchhle-sa/package.mk"
variable: PKG_VERSION
value: "3c5850585ba55615b17a58c58331b6d6f52d4a9d"
core_version: "0.2.3"
version_basis:
kind: file
+7
View File
@@ -7,6 +7,13 @@ logo: "https://raw.githubusercontent.com/VICE-Team/svn-mirror/main/vice/data/com
profiled_date: "2026-10-24"
source_commit: "81546e60c222fe4aef750b890b0dbe3a5ac280d8"
pin_frozen: "ROCKNIX, the only platform that ships it, builds this revision (ROCKNIX projects/ROCKNIX/packages/emulators/standalone/vice-sa/package.mk:5). Later commits are not part of that build."
pin_build:
- platform: rocknix
repo: "https://github.com/ROCKNIX/distribution"
revision: "20261001"
path: "projects/ROCKNIX/packages/emulators/standalone/vice-sa/package.mk"
variable: PKG_VERSION
value: "3.8"
core_version: "3.8"
version_basis:
kind: file
+50
View File
@@ -10,6 +10,19 @@
"type"
],
"allOf": [
{
"comment": "A build reference documents why a pin is held: it never stands without the pin_frozen that says so.",
"if": {
"required": [
"pin_build"
]
},
"then": {
"required": [
"pin_frozen"
]
}
},
{
"comment": "An alias profile points at another profile and carries no files of its own.",
"if": {
@@ -991,6 +1004,43 @@
"type": "string",
"description": "Why source_commit is held on purpose rather than followed. The profile is then judged against its own revision, like one pinned to a superseded tag: comparing it to HEAD says nothing and recaling would repoint its refs at code the build it documents never had."
},
"pin_build": {
"type": "array",
"minItems": 1,
"description": "The build file each platform that ships a pin_frozen build reads its revision from, so check_freshness can read it again where the platform's YAML now stands and say when the platform builds another revision.",
"items": {
"type": "object",
"additionalProperties": false,
"required": ["platform", "repo", "revision", "path", "variable", "value"],
"properties": {
"platform": {
"type": "string",
"description": "Registry slug of the platform (platforms/<platform>.yml)."
},
"repo": {
"type": "string",
"format": "uri",
"description": "The platform's own repository, the one its YAML is scraped from."
},
"revision": {
"type": "string",
"description": "Tag or commit of that repository the build file was read at."
},
"path": {
"type": "string",
"description": "The build file, from the repository root (package.mk, a Buildroot .mk, a RetroPie scriptmodule)."
},
"variable": {
"type": "string",
"description": "The variable the file sets to the revision it builds (PKG_VERSION, <PKG>_VERSION, rp_module_repo)."
},
"value": {
"type": "string",
"description": "What the variable held at revision, quotes and trailing comment removed."
}
}
}
},
"pin_follows": {
"type": "string",
"description": "Why source_commit follows the branch tip although a single platform ships the profile: that platform builds the tip, cited by its build file. Without it or pin_frozen, a bump refuses a profile one platform ships."
+112
View File
@@ -1461,6 +1461,117 @@ def check_source_paths(profiles: dict) -> Finding:
)
def build_variable(lines: list[str], variable: str) -> str | None:
"""The value the first assignment to ``variable`` gives in a build file.
Read as a Buildroot .mk (`X_VERSION = sha`), a LibreELEC package.mk
(`PKG_VERSION="sha"`) or a RetroPie scriptmodule (`rp_module_repo="git
URL tag"`, `local version="20250829"`): quotes and a trailing comment go,
the rest is compared as written.
"""
assignment = re.compile(
rf"^\s*(?:local\s+|export\s+)?{re.escape(variable)}\s*[:?+]?=\s*(.*)$"
)
for line in lines:
match = assignment.match(line)
if not match:
continue
value = match.group(1).strip()
if value[:1] in "\"'":
end = value.find(value[0], 1)
return value[1:end] if end > 0 else value[1:]
return value.split(" #", 1)[0].strip()
return None
def pin_build_revision(reference: dict, platforms_dir: Path) -> str:
"""The revision of the platform repository its YAML was last scraped at,
'' when the platform is not registered or reads another repository."""
path = platforms_dir / f"{reference.get('platform', '')}.yml"
repo = upstream.parse_repo(str(reference.get("repo") or ""))
if repo is None or not path.is_file():
return ""
with path.open(encoding="utf-8") as fh:
source = str((yaml_load(fh) or {}).get("source") or "")
if f"/{repo.slug.lower()}/" not in source.lower() + "/":
return ""
return export_native.source_revision(source)
def check_pin_builds(
profiles: dict, platforms_dir: Path, cache_dir: str, offline: bool,
) -> list[Finding]:
"""Each `pin_build:` read again where the platform now stands.
A pin_frozen pin is held because one platform builds that revision, and
nothing read the build file again: Recalbox moving mame0278 to another
commit left the profile describing a build no platform ships. The file
is read at the revision the platform's own YAML was scraped at, or at
the repository's branch head for a platform this repository does not
scrape, and its variable compared with the value the profile recorded.
"""
findings: list[Finding] = []
unreferenced = sorted(
name for name, profile in profiles.items()
if profile.get("pin_frozen") and not profile.get("pin_build")
)
if unreferenced:
findings.append(Finding(
"profiles", "pin_frozen without pin_build", SKIPPED,
local=f"{len(unreferenced)} profiles",
detail="no platform build file names their revision: "
+ ", ".join(unreferenced[:SHOWN_NAMES])
+ (", ..." if len(unreferenced) > SHOWN_NAMES else ""),
items=unreferenced,
))
for name, profile in sorted(profiles.items()):
for reference in profile.get("pin_build") or []:
subject = f"{name} ({reference['platform']})"
recorded = str(reference["value"])
revision = pin_build_revision(reference, platforms_dir)
if revision == str(reference["revision"]):
findings.append(Finding(
"profiles", subject, OK, local=recorded[:12],
detail=f"read where platforms/{reference['platform']}.yml is",
))
continue
repo = upstream.parse_repo(str(reference["repo"]))
try:
at = revision or upstream.resolve_head(repo, cache_dir, offline)
lines = upstream.fetch_file(repo, at, reference["path"], cache_dir, offline) \
if at else None
except upstream.NotCachedError:
findings.append(Finding("profiles", subject, SKIPPED, local=recorded[:12],
detail="offline, the build file is not cached"))
continue
except upstream.UpstreamError as exc:
findings.append(Finding("profiles", subject, UNKNOWN, local=recorded[:12],
detail=str(exc)))
continue
if not at:
findings.append(Finding("profiles", subject, UNKNOWN, local=recorded[:12],
detail=f"{repo.slug} answered no branch head"))
continue
current = None if lines is None else build_variable(lines, reference["variable"])
if current == recorded:
findings.append(Finding(
"profiles", subject, OK, local=recorded[:12], remote=at[:12],
detail=f"{reference['path']} still builds it",
))
continue
findings.append(Finding(
"profiles", subject, STALE, local=recorded[:12],
remote=(current or "gone")[:12],
detail=(
f"{reference['path']} is gone at {at[:12]}" if lines is None
else f"{reference['variable']} is no longer set there" if current is None
else f"{reference['platform']} now builds {current} "
f"({reference['path']} at {at[:12]}): the pin follows the build"
),
))
return findings
def check_profiles(run: bool, offline: bool) -> list[Finding]:
if not run:
return [
@@ -1708,6 +1819,7 @@ def main() -> int:
findings.extend(check_ci(args.cache_dir, args.offline))
if "profiles" in areas:
findings.append(check_source_paths(profiles))
findings.extend(check_pin_builds(profiles, platforms_dir, args.cache_dir, args.offline))
findings.extend(check_profiles(args.profiles, args.offline))
if args.json:
+1 -1
View File
@@ -538,7 +538,7 @@ class ProfileFieldsRequired(unittest.TestCase):
section = _section(_page("profiling.md"), "Profile fields")
marked = {
row[0].strip("`") for row in _table_rows(section)
if row[1].startswith(("yes", "for `type"))
if row[1].startswith(("yes", "for `type", "with `"))
}
self.assertEqual(marked, required)
+138
View File
@@ -0,0 +1,138 @@
"""Held pins name the build file that holds them.
pin_frozen was free prose and no tool read the build file it cites: a
platform moving mame0278 to another commit would have left the profile
holding a revision no platform builds, in silence. `pin_build` records the
file, and check_freshness reads it again where the platform now stands.
"""
from __future__ import annotations
import sys
import tempfile
import unittest
from pathlib import Path
from unittest import mock
REPO_ROOT = Path(__file__).resolve().parents[1]
sys.path.insert(0, str(REPO_ROOT / "scripts"))
import check_freshness as cf # noqa: E402
RECALBOX = "https://gitlab.com/recalbox/recalbox"
class HeldPinsReadTheirBuildFileAgain(unittest.TestCase):
REF = {"platform": "recalbox", "repo": RECALBOX,
"revision": "10.1.1", "path": "package/libretro-mame0278/libretro-mame0278.mk",
"variable": "LIBRETRO_MAME0278_VERSION", "value": "a" * 40}
def setUp(self):
self._tmp = tempfile.TemporaryDirectory()
self.addCleanup(self._tmp.cleanup)
self.platforms = Path(self._tmp.name)
def _platform(self, revision: str) -> None:
(self.platforms / "recalbox.yml").write_text(
f'source: "{RECALBOX}/-/raw/{revision}/board/es_bios.xml"\n'
)
def _check(self, lines=None, offline=False):
profiles = {"mame0278": {"pin_frozen": "Recalbox builds it.", "pin_build": [self.REF]},
"raine": {"pin_frozen": "RetroBat installs this release."}}
with mock.patch.object(cf.upstream, "fetch_file", return_value=lines) as fetched:
findings = cf.check_pin_builds(profiles, self.platforms, "cache", offline)
return {f.subject: f for f in findings}, fetched
def test_the_variable_forms_the_platforms_write(self):
cases = [
(["LIBRETRO_MAME0278_VERSION = fba5074"], "LIBRETRO_MAME0278_VERSION", "fba5074"),
(['PKG_VERSION="37cddf2" #v0.6.3'], "PKG_VERSION", "37cddf2"),
(['rp_module_repo="file $__archive_url/advancemame-1.4.tar.gz"'], "rp_module_repo",
"file $__archive_url/advancemame-1.4.tar.gz"),
(["function f() {", ' local version="20250829"', ' version="20250302"'],
"version", "20250829"),
(["OTHER_VERSION = 1"], "PKG_VERSION", None),
]
for lines, variable, expected in cases:
with self.subTest(variable=variable):
self.assertEqual(cf.build_variable(lines, variable), expected)
def test_the_platform_read_at_the_same_revision_needs_no_network(self):
self._platform("10.1.1")
found, fetched = self._check()
fetched.assert_not_called()
self.assertEqual(found["mame0278 (recalbox)"].status, cf.OK)
def test_a_new_revision_building_another_commit_is_stale(self):
self._platform("10.2")
found, fetched = self._check([f"LIBRETRO_MAME0278_VERSION = {'b' * 40}"])
self.assertEqual(fetched.call_args.args[1:3],
("10.2", "package/libretro-mame0278/libretro-mame0278.mk"))
row = found["mame0278 (recalbox)"]
self.assertEqual(row.status, cf.STALE)
self.assertIn("now builds " + "b" * 40, row.detail)
def test_a_new_revision_building_the_same_commit_is_ok(self):
self._platform("10.2")
found, _ = self._check([f"LIBRETRO_MAME0278_VERSION = {'a' * 40}"])
self.assertEqual(found["mame0278 (recalbox)"].status, cf.OK)
def test_a_build_file_gone_is_stale(self):
self._platform("10.2")
found, _ = self._check(None)
self.assertEqual(found["mame0278 (recalbox)"].status, cf.STALE)
self.assertIn("is gone", found["mame0278 (recalbox)"].detail)
def test_offline_and_uncached_is_skipped(self):
self._platform("10.2")
profiles = {"mame0278": {"pin_frozen": "x", "pin_build": [self.REF]}}
cold = cf.upstream.NotCachedError("not cached")
with mock.patch.object(cf.upstream, "fetch_file", side_effect=cold):
(row,) = cf.check_pin_builds(profiles, self.platforms, "cache", True)
self.assertEqual(row.status, cf.SKIPPED)
def test_a_hold_with_no_build_file_is_counted(self):
self._platform("10.1.1")
found, _ = self._check()
row = found["pin_frozen without pin_build"]
self.assertEqual(row.status, cf.SKIPPED)
self.assertEqual(row.items, ["raine"])
class EveryBuildReferenceNamesThePin(unittest.TestCase):
"""Reads the repository: a pin_build value is what the platform builds,
so it is the profile's source_commit or names its core_version, and the
platform's own YAML was scraped from that repository."""
def test_the_values_agree(self):
from common import load_emulator_profiles
disagree = []
for name, profile in load_emulator_profiles(str(REPO_ROOT / "emulators")).items():
references = profile.get("pin_build") or []
if not references:
continue
pins = profile.get("source_commit")
pins = set(pins.values()) if isinstance(pins, dict) else {pins}
versions = profile.get("core_version")
versions = (
{str(v) for v in versions.values()} if isinstance(versions, dict)
else {str(versions)} if versions else set()
)
def names_it(value: str) -> bool:
token = value.split()[-1].rsplit("/", 1)[-1].removesuffix(".tar.gz")
return value in pins or any(token in v or v in value for v in versions)
if not any(names_it(str(r["value"])) for r in references):
disagree.append(name)
for reference in references:
if not cf.pin_build_revision(reference, REPO_ROOT / "platforms"):
disagree.append(f"{name}: {reference['platform']} is not read from "
f"{reference['repo']}")
self.assertEqual(disagree, [])
if __name__ == "__main__":
unittest.main()
+2 -1
View File
@@ -522,7 +522,8 @@ reports the profile as uncheckable, and the CI job that runs
| `version_basis` | every profile (`tests/test_version_basis.py`) | where `core_version` is read, by `kind`: `file` (`path`, `pattern`, optional `format`, and `url` with its `commit` for a file outside the profile's repositories, such as the package file of a build a platform ships), `tag` (the nearest `tag` in the pin's history and its `distance`, `core_version` in git describe's form, `match` the glob a tag must fit), `alias` (`of`), `package` (`artifact`, the APK or binary read, `url` where it was obtained), `none` (the code states no version: `core_version` null) or `unverified` (no reading could be made: `core_version` stays as written and is reported unconfirmed, `why` says why: `no_pin`, `host_unsupported`, `host_gone`, `host_unreachable`, `pin_off_branch`, `no_artifact`, `no_source`). `repo` names `upstream` or `source_mirror` when the version is that tree's. `profile_sync --verify-version` reads it again, and a pin advance rewrites `core_version` from it |
| `source_commit` | see above | commit SHA of `source` the code was read at. Anchors every `source_ref` line number |
| `upstream_commit` | no | same, for `upstream` |
| `pin_frozen` | no | why `source_commit` is held on purpose rather than followed. The profile is then judged against its own revision, like one pinned to a superseded tag |
| `pin_frozen` | with `pin_build` | why `source_commit` is held on purpose rather than followed. The profile is then judged against its own revision, like one pinned to a superseded tag |
| `pin_build` | no | the build file each platform shipping a `pin_frozen` build reads its revision from: a list of `platform` (registry slug), `repo` (the platform's own repository), `revision` (the tag or commit the file was read at), `path`, `variable` (`PKG_VERSION`, `<PKG>_VERSION`, `rp_module_repo`) and `value` (what it held there). `check_freshness.py` reads the file again where the platform's YAML now stands and reports the profile `STALE` when the platform builds another revision. A hold that no build file names (a release binary, an abandoned repository) carries `pin_frozen` alone |
| `pin_follows` | no | why `source_commit` follows the branch tip when a single platform ships the profile: that platform builds the tip, cited by its build file. A bump refuses a profile one platform ships until it carries `pin_frozen` or `pin_follows` |
| `data_root` | no | per operating system (`android`, `ios`, `windows`, `macos`, `linux`), the folder the app reads its user data from, under which `standalone_path` destinations sit: `path` as the user finds it (`Android/data/<package>/files`, `%APPDATA%/...`), with the `source_ref` that builds it. Only the systems the app runs on are keyed |
| `upstream_frozen` | no | why `upstream_commit` is held: the port vendors that upstream tree, synced to that release, or merged that commit. The upstream view is read at its own pin and a bump leaves it. Without it, a port that is a GitHub fork of its upstream follows the merge base of the two |
+1 -1
View File
@@ -65,7 +65,7 @@ Every module in `tests/`, by the area it guards.
| Pack probe | the cores a platform runs for a system, staging grown to a fixed point, runs mapped to pack and manifest entries, the line and its schema, the probe lock per run, that no page shows its lines. One class builds a real pack narrowed to PlayStation and lays it out both ways, from the archive and with `install.py --dest`, and skips without the collection | `test_pack_probe` |
| Automation runner, disk cleanup, asset sync and bit-flip repair | fake jobs, git repositories with a bare origin and session worktrees, a committed file with one bit flipped, canned CI runs in place of `gh` | `test_autorun` |
| Truth and native export | synthetic + cached originals | `test_export_counts`, `test_export_native_layer`, `test_export_report`, `test_exporters`, `test_truth_data_dir_readers`, `test_truth_diff`, `test_truth_layout` |
| Scrapers, upstream and provenance | inline sources, synthetic | `test_batocera_md5_list`, `test_check_freshness`, `test_contributing_text`, `test_coverage_cache`, `test_data_dir_refs`, `test_dataclass_defaults`, `test_dedup`, `test_doc_pages`, `test_doc_surfaces`, `test_elec_scrapers`, `test_fbneo_parser`, `test_find_pinned_revision`, `test_hash_merge`, `test_launchers`, `test_launchers_emudeck`, `test_launchers_recalbox`, `test_launchers_retrobat`, `test_launchers_retrodeck`, `test_launchers_retropie`, `test_launchers_rocknix`, `test_mame_devices`, `test_mame_parser`, `test_mame_ref_audit`, `test_optional_dependencies`, `test_profile_sync`, `test_prose_style`, `test_provenance`, `test_refresh_data_dirs`, `test_refresh_failures`, `test_refresh_stale`, `test_retrodeck_scraper_errors`, `test_romset_recipes`, `test_schema_semantic_gate`, `test_scraper_contract`, `test_site_arcade_boards`, `test_site_availability`, `test_site_bootstrap`, `test_site_built_gate`, `test_site_components`, `test_site_console_folders`, `test_site_content_data`, `test_site_copy`, `test_site_cores`, `test_site_css`, `test_site_density_cards`, `test_site_emulator_page`, `test_site_emulators`, `test_site_entry`, `test_site_entry_tables`, `test_site_exports`, `test_site_funnel`, `test_site_images`, `test_site_integration`, `test_site_nav`, `test_site_picker`, `test_site_platform_density`, `test_site_platform_hashes`, `test_site_reference`, `test_site_render`, `test_site_search`, `test_site_system_links`, `test_site_system_names`, `test_site_system_sections`, `test_site_systems`, `test_site_validation`, `test_site_weight`, `test_site_wiki`, `test_site_write`, `test_source_ref_targets`, `test_upstream`, `test_upstream_index`, `test_validate_pr`, `test_validate_pr_flow`, `test_validate_pr_hashes`, `test_version_basis`, `test_workflow_paths` |
| Scrapers, upstream and provenance | inline sources, synthetic | `test_batocera_md5_list`, `test_check_freshness`, `test_contributing_text`, `test_coverage_cache`, `test_data_dir_refs`, `test_dataclass_defaults`, `test_dedup`, `test_doc_pages`, `test_doc_surfaces`, `test_elec_scrapers`, `test_fbneo_parser`, `test_find_pinned_revision`, `test_hash_merge`, `test_launchers`, `test_launchers_emudeck`, `test_launchers_recalbox`, `test_launchers_retrobat`, `test_launchers_retrodeck`, `test_launchers_retropie`, `test_launchers_rocknix`, `test_mame_devices`, `test_mame_parser`, `test_mame_ref_audit`, `test_optional_dependencies`, `test_pin_build`, `test_profile_sync`, `test_prose_style`, `test_provenance`, `test_refresh_data_dirs`, `test_refresh_failures`, `test_refresh_stale`, `test_retrodeck_scraper_errors`, `test_romset_recipes`, `test_schema_semantic_gate`, `test_scraper_contract`, `test_site_arcade_boards`, `test_site_availability`, `test_site_bootstrap`, `test_site_built_gate`, `test_site_components`, `test_site_console_folders`, `test_site_content_data`, `test_site_copy`, `test_site_cores`, `test_site_css`, `test_site_density_cards`, `test_site_emulator_page`, `test_site_emulators`, `test_site_entry`, `test_site_entry_tables`, `test_site_exports`, `test_site_funnel`, `test_site_images`, `test_site_integration`, `test_site_nav`, `test_site_picker`, `test_site_platform_density`, `test_site_platform_hashes`, `test_site_reference`, `test_site_render`, `test_site_search`, `test_site_system_links`, `test_site_system_names`, `test_site_system_sections`, `test_site_systems`, `test_site_validation`, `test_site_weight`, `test_site_wiki`, `test_site_write`, `test_source_ref_targets`, `test_upstream`, `test_upstream_index`, `test_validate_pr`, `test_validate_pr_flow`, `test_validate_pr_hashes`, `test_version_basis`, `test_workflow_paths` |
| Games on the card | small DATs, listxml and setup sources, a fake fetcher, fixture install lists, and the committed data against its schemas | `test_arcade_parents`, `test_game_catalogs`, `test_game_headers`, `test_game_regions`, `test_games_index`, `test_romfolders_card`, `test_romfolders_es` |
## Test architecture
+9 -1
View File
@@ -695,7 +695,15 @@ NAME` reads the folders again.
The `profiles` area always checks `website/src/data/source-paths.json`
against the profiles, offline: a recorded tree that no profile pins any more
is `STALE` until `sitesources.py --fetch` runs again.
is `STALE` until `sitesources.py --fetch` runs again. It also reads each
`pin_build` reference of a held pin: where the platform YAML was scraped at
the reference's own revision the row is `OK` without network, otherwise the
build file is fetched at the platform's new revision (or at the branch head
of a platform this repository does not scrape) and its variable compared
with the recorded value. A different value is `STALE`: the platform now
builds another revision, and the pin, the refs and `pin_build` move with it.
Profiles with `pin_frozen` and no `pin_build` are counted on one `SKIPPED`
row, since no build file names their revision.
```bash
python scripts/check_freshness.py