fix: name moved repositories by their new name

profile_sync --all reported 18 repositories the forge answers under another owner or name. Each pin resolves in the renamed repository, so the URLs change and the pins stay. flycast2021 builds from metallic77/flycast 603814c9 (ROCKNIX package.mk), whose upstream libretro/flycast now answers as libretro/parallel-dc with 4c293f30 still in its master history.
This commit is contained in:
Abdessamad Derraz committed 2026-10-21 11:10:46 +02:00
1 parent 185734d397
commit 8b8d94e331
18 files changed
+78 -21

No files matched your search

+2 -2
View File
@@ -1,8 +1,8 @@
emulator: 2 Ship 2 Harkinian
type: standalone
core_classification: game_engine
source: "https://github.com/HarbourMasters/2ship2harkinian"
upstream: "https://github.com/HarbourMasters/2ship2harkinian"
source: "https://github.com/2ship2harkinian/2ship2harkinian"
upstream: "https://github.com/2ship2harkinian/2ship2harkinian"
source_commit: "8a24047fbce8915993804e7819f4df4fa591551f"
profiled_date: "2026-10-20"
core_version: "5.0.1"
+1 -1
View File
@@ -2,7 +2,7 @@ emulator: bnes
type: libretro
core_classification: frozen_snapshot
source: "https://github.com/libretro/bnes-libretro"
upstream: "https://github.com/Alcaro/bsnes-gc"
upstream: "https://github.com/Sir-Walrus/bsnes-gc"
profiled_date: "2026-03-23"
source_commit: "8e26e89a93bef8eb8992d1921b539dce1792660a"
core_version: "v083"
+1 -1
View File
@@ -2,7 +2,7 @@ emulator: ClownMDEmu
type: standalone + libretro
core_classification: official_port
source: "https://github.com/Clownacy/clownmdemu-libretro"
upstream: "https://github.com/Clownacy/clownmdemu"
upstream: "https://github.com/Clownacy/clownmdemu-core"
profiled_date: "2026-03-23"
source_commit: "d43c2708b0a31c285ce16724b6c4a2e92af07346"
# The core the port vendors at source_commit (common -> core submodule).
+1 -1
View File
@@ -1,7 +1,7 @@
emulator: dsda-doom
type: standalone
core_classification: game_engine
source: "https://github.com/kraflab/dsda-doom"
source: "https://github.com/dsda-org/dsda-doom"
profiled_date: "2026-10-20"
source_commit: "e443ff7a3e6090a1ff92ad7a426916c4fd35ecc5"
core_version: "0.29.4"
+1 -1
View File
@@ -1,7 +1,7 @@
emulator: "FB Alpha 2019"
type: libretro
core_classification: frozen_snapshot
source: "https://github.com/libretro/fbalpha"
source: "https://github.com/libretro/beetle-finalarcade2019"
upstream: "https://github.com/barry65536/FBAlpha"
profiled_date: "2026-10-17"
source_commit: "0581797db6fdffd826086b053ced4b6b29bb6678"
+3 -1
View File
@@ -2,7 +2,7 @@ emulator: "Flycast 2021"
type: libretro
core_classification: frozen_snapshot
source: "https://github.com/metallic77/flycast"
upstream: "https://github.com/libretro/flycast"
upstream: "https://github.com/libretro/parallel-dc"
profiled_date: "2026-10-17"
source_commit: "603814c9f73b773c455d9a497f389d2f93a257fd"
upstream_commit: "4c293f306bc16a265c2d768af5d0cea138426054"
@@ -20,6 +20,8 @@ notes: |
The libretro/flycast tree as of April 2022 (merge base 4c293f30), from before
the libretro fork was rebased on flyinghead's Flycast, with 22 commits by
metallic77 on top that tune defaults and build flags for low-end handhelds.
That repository now answers as libretro/parallel-dc, and its master still
descends from 4c293f30.
ROCKNIX renames the core option prefix from reicast to flycast2021 and
installs the library as flycast2021_libretro.so.
ref: core/libretro/libretro.cpp:2296-2300
+1 -1
View File
@@ -1,7 +1,7 @@
emulator: LZDoom
type: standalone
core_classification: game_engine
source: "https://github.com/drfrag666/gzdoom"
source: "https://github.com/drfrag666/lzdoom"
profiled_date: "2026-10-20"
source_commit: "4ce19a12164ebd6802b7fb2f94d700a6e736d0fb"
core_version: "3.88b"
+1 -1
View File
@@ -1,7 +1,7 @@
emulator: MAME4droid 2024
type: standalone
core_classification: community_fork
source: "https://github.com/seleuco/MAME4droid-2024"
source: "https://github.com/seleuco/MAME4droid-Current"
upstream: "https://github.com/mamedev/mame/tree/mame0289"
logo: "https://raw.githubusercontent.com/mamedev/mame/master/docs/source/images/MAMElogo.svg"
profiled_date: "2026-08-11"
+1 -1
View File
@@ -1,7 +1,7 @@
emulator: Mu
type: libretro
core_classification: pure_libretro
source: "https://github.com/libretro/Mu"
source: "https://github.com/SquirrelJME/Mu"
upstream: "https://github.com/meepingsnesroms/Mu"
profiled_date: "2026-03-24"
source_commit: "afaeb157b8ba38a4a9bdf426ba663f7efb2cc6f8"
+1 -1
View File
@@ -2,7 +2,7 @@ emulator: PocketCDG
type: libretro
core_classification: pure_libretro
source: "https://github.com/libretro/libretro-pocketcdg"
upstream: "https://github.com/redbug26/libretro-pocketcdg"
upstream: "https://github.com/libretro/libretro-pocketcdg"
profiled_date: "2026-03-24"
source_commit: "b48b807e770aeea9a9e8f7af36f5e04ed4727aaa"
core_version: "Git"
+1 -1
View File
@@ -1,7 +1,7 @@
emulator: PuzzleScript
type: libretro
core_classification: game_engine
source: "https://github.com/nwhitehead/pzretro"
source: "https://github.com/amberwhitehead/pzretro"
upstream: "https://github.com/increpare/PuzzleScript"
profiled_date: "2026-03-25"
source_commit: "6d859b47092f585a7ec05804c1d51a1676a06531"
+2 -2
View File
@@ -1,8 +1,8 @@
emulator: Reicast
type: standalone
core_classification: community_fork
source: "https://github.com/reicast/reicast-emulator"
upstream: "https://github.com/reicast/reicast-emulator"
source: "https://github.com/skmp/reicast-emulator"
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."
+2 -2
View File
@@ -1,8 +1,8 @@
emulator: The Force Engine
type: standalone
core_classification: game_engine
source: "https://github.com/luciusDXL/TheForceEngine"
upstream: "https://github.com/luciusDXL/TheForceEngine"
source: "https://github.com/TheForceEngine/TheForceEngine"
upstream: "https://github.com/TheForceEngine/TheForceEngine"
profiled_date: "2026-10-04"
source_commit: "cc25205cc94c36a396f6f50295772f6ec83069a2"
core_version: "v1.22.420"
+1 -1
View File
@@ -2,7 +2,7 @@ emulator: The Powder Toy
type: libretro
core_classification: pure_libretro
source: "https://github.com/libretro/ThePowderToy"
upstream: "https://github.com/ThePowderToy/The-Powder-Toy"
upstream: "https://github.com/The-Powder-Toy/The-Powder-Toy"
profiled_date: "2026-03-25"
source_commit: "cb3cd4c2e5beddb98b34e6b800fa24e8f96322d9"
core_version: "v92.5.336"
+1 -1
View File
@@ -2,7 +2,7 @@ emulator: vitavoyager
type: libretro
core_classification: community_fork
source: "https://github.com/libretro/vitavoyager"
upstream: "https://github.com/zturtleman/lilium-voyager"
upstream: "https://github.com/clover-moe/lilium-voyager"
profiled_date: "2026-03-25"
source_commit: "58b70dd7ea891c2e8ddc37d03a5d58116b0ea118"
core_version: "git"
+2 -2
View File
@@ -1,8 +1,8 @@
emulator: Wolf4SDL
type: standalone
core_classification: game_engine
source: "https://github.com/AryanWolf3D/Wolf4SDL"
upstream: "https://github.com/AryanWolf3D/Wolf4SDL"
source: "https://github.com/KS-Presto/Wolf4SDL"
upstream: "https://github.com/KS-Presto/Wolf4SDL"
profiled_date: "2026-10-20"
source_commit: "dc8b250af35fb0ace68db5eb879490b50068c20e"
core_version: "2.0"
+55
View File
@@ -0,0 +1,55 @@
"""A profile names each repository under the name its forge answers today.
GitHub follows a renamed or transferred repository's old name in silence:
flycast2021 declared libretro/flycast, which answers as libretro/parallel-dc,
and reicast declared reicast/reicast-emulator, which answers as
skmp/reicast-emulator. profile_sync counts such a move as review work. This
test reads the forge answers profile_sync has cached and fails on any
profile still declaring an old name. Without a cache it has nothing to read
and skips.
"""
from __future__ import annotations
import sys
import unittest
from pathlib import Path
import yaml
REPO_ROOT = Path(__file__).resolve().parent.parent
sys.path.insert(0, str(REPO_ROOT / "scripts"))
import upstream # noqa: E402
from profile_sync import declared_repositories # noqa: E402
CACHE = Path(upstream.CACHE_DIR)
if not CACHE.is_absolute():
CACHE = REPO_ROOT / CACHE
class DeclaredRepositoriesAreCurrent(unittest.TestCase):
def test_no_profile_declares_a_moved_repository(self) -> None:
if not (CACHE / "_api").is_dir():
self.skipTest("no forge answers cached")
checked = 0
moved = []
for path in sorted((REPO_ROOT / "emulators").glob("*.yml")):
profile = yaml.safe_load(path.read_text(encoding="utf-8")) or {}
for field, _key, url in declared_repositories(profile):
repo = upstream.parse_repo(url)
if repo is None:
continue
current = upstream.current_slug(repo, str(CACHE), offline=True)
if current is None:
continue
checked += 1
if current.lower() != repo.slug.lower():
moved.append(f"{path.stem} {field}: {repo.slug} answers as {current}")
if not checked:
self.skipTest("no declared repository has a cached forge answer")
self.assertEqual(moved, [])
if __name__ == "__main__":
unittest.main()
+1 -1
View File
@@ -39,7 +39,7 @@ Every module in `tests/`, by the area it guards.
|------|----------|---------|
| Core regression suites | synthetic | `test_e2e`, `test_audit_regressions`, `test_tool_messages` |
| File resolution and identity | synthetic + collection | `test_adler32_resolution`, `test_agnostic_scan`, `test_agnostic_scan_mode`, `test_agnostic_scope`, `test_agnostic_substitute`, `test_archive_choice`, `test_bios_companions`, `test_bundled_identity`, `test_casefold_cache`, `test_db_aliases`, `test_declared_names`, `test_derivations`, `test_directory_entries`, `test_extra_identity`, `test_foreign_tree`, `test_foreign_tree_names`, `test_frontend_digest`, `test_game_data_homonyms`, `test_hashing`, `test_identity`, `test_md5_pack_context`, `test_name_tiebreak`, `test_nec_filing`, `test_owner_resolution`, `test_path_suffix`, `test_resolution_evidence`, `test_shipped_content`, `test_twin_declarations`, `test_validated_choice`, `test_variant_choice`, `test_variant_identity`, `test_zipped_member` |
| Verification, cross-reference and profile checks | synthetic + profiles | `test_crypto_aes`, `test_crypto_unique_data`, `test_crypto_verify`, `test_case_insensitive_platforms`, `test_checks_have_values`, `test_core_file_fills_declaration`, `test_cross_reference_sources`, `test_file_consumers`, `test_fileless_audit`, `test_gap_settlement`, `test_hidden_extras`, `test_flycast_layout`, `test_launcher_aliases`, `test_launcher_layer`, `test_native_mode`, `test_no_case_collisions`, `test_path_conflict_status`, `test_path_null_copies`, `test_profile_checks`, `test_romm_hash_rule`, `test_shared_groups`, `test_standalone_mode`, `test_undeclared_dedup`, `test_unplaced_extras`, `test_validation_scope`, `test_verify_all_dir`, `test_verify_emulator_evidence`, `test_verify_listing`, `test_verify_pack_choice` |
| Verification, cross-reference and profile checks | synthetic + profiles | `test_crypto_aes`, `test_crypto_unique_data`, `test_crypto_verify`, `test_case_insensitive_platforms`, `test_checks_have_values`, `test_core_file_fills_declaration`, `test_cross_reference_sources`, `test_file_consumers`, `test_fileless_audit`, `test_gap_settlement`, `test_hidden_extras`, `test_flycast_layout`, `test_launcher_aliases`, `test_launcher_layer`, `test_native_mode`, `test_no_case_collisions`, `test_path_conflict_status`, `test_path_null_copies`, `test_profile_checks`, `test_profile_repositories`, `test_romm_hash_rule`, `test_shared_groups`, `test_standalone_mode`, `test_undeclared_dedup`, `test_unplaced_extras`, `test_validation_scope`, `test_verify_all_dir`, `test_verify_emulator_evidence`, `test_verify_listing`, `test_verify_pack_choice` |
| Packs and manifests | synthetic + real packs | `test_artifact_lock`, `test_atomic_artifacts`, `test_batocera_cores`, `test_deterministic_zip`, `test_emulator_pack_counts`, `test_finalize_pack_names`, `test_large_file_cache`, `test_libretro_layout`, `test_manifest_entry`, `test_pack_conformance_dirs`, `test_pack_core_extras`, `test_pack_counts`, `test_pack_destinations`, `test_pack_failures`, `test_pack_file_names`, `test_pack_grouping`, `test_pack_integrity`, `test_pack_member_identity`, `test_pack_readme`, `test_platform_inheritance`, `test_platform_keys`, `test_required_only_archives`, `test_required_only_twins`, `test_split_extras`, `test_split_names`, `test_split_pack`, `test_system_pack_extras`, `test_system_pack_parity`, `test_torrentzip`, `test_which_pack` |
| Slots and regions | synthetic + profiles | `test_region`, `test_region_agnostic_scan`, `test_region_groups`, `test_region_held`, `test_region_platform_index`, `test_region_required_only`, `test_slot`, `test_slots`, `test_slots_shipped_file` |
| Hardware targets and systems | synthetic + target files | `test_extract_targets`, `test_lakka_targets`, `test_libretro_slugs`, `test_system_ids`, `test_system_selection`, `test_target_names`, `test_target_scrapers`, `test_target_systems`, `test_target_verify` |