mirror of
https://github.com/Abdess/retroarch_system.git
synced 2026-04-15 13:22:31 -05:00
feat: add source param to generate_pack
This commit is contained in:
@@ -983,6 +983,7 @@ def generate_pack(
|
|||||||
required_only: bool = False,
|
required_only: bool = False,
|
||||||
system_filter: list[str] | None = None,
|
system_filter: list[str] | None = None,
|
||||||
precomputed_extras: list[dict] | None = None,
|
precomputed_extras: list[dict] | None = None,
|
||||||
|
source: str = "full",
|
||||||
) -> str | None:
|
) -> str | None:
|
||||||
"""Generate a ZIP pack for a platform.
|
"""Generate a ZIP pack for a platform.
|
||||||
|
|
||||||
@@ -999,6 +1000,7 @@ def generate_pack(
|
|||||||
version = config.get("version", config.get("dat_version", ""))
|
version = config.get("version", config.get("dat_version", ""))
|
||||||
version_tag = f"_{version.replace(' ', '')}" if version else ""
|
version_tag = f"_{version.replace(' ', '')}" if version else ""
|
||||||
req_tag = "_Required" if required_only else ""
|
req_tag = "_Required" if required_only else ""
|
||||||
|
source_tag = {"platform": "_Platform", "truth": "_Truth"}.get(source, "")
|
||||||
|
|
||||||
sys_tag = ""
|
sys_tag = ""
|
||||||
if system_filter:
|
if system_filter:
|
||||||
@@ -1013,7 +1015,7 @@ def generate_pack(
|
|||||||
display_parts.append("_".join(p.title() for p in parts if p))
|
display_parts.append("_".join(p.title() for p in parts if p))
|
||||||
sys_tag = "_" + "_".join(display_parts)
|
sys_tag = "_" + "_".join(display_parts)
|
||||||
|
|
||||||
zip_name = f"{platform_display.replace(' ', '_')}{version_tag}{req_tag}_BIOS_Pack{sys_tag}.zip"
|
zip_name = f"{platform_display.replace(' ', '_')}{version_tag}{source_tag}{req_tag}_BIOS_Pack{sys_tag}.zip"
|
||||||
zip_path = os.path.join(output_dir, zip_name)
|
zip_path = os.path.join(output_dir, zip_name)
|
||||||
os.makedirs(output_dir, exist_ok=True)
|
os.makedirs(output_dir, exist_ok=True)
|
||||||
|
|
||||||
@@ -1071,6 +1073,7 @@ def generate_pack(
|
|||||||
pack_systems = filtered
|
pack_systems = filtered
|
||||||
|
|
||||||
with zipfile.ZipFile(zip_path, "w", zipfile.ZIP_DEFLATED) as zf:
|
with zipfile.ZipFile(zip_path, "w", zipfile.ZIP_DEFLATED) as zf:
|
||||||
|
if source != "truth":
|
||||||
for sys_id, system in sorted(pack_systems.items()):
|
for sys_id, system in sorted(pack_systems.items()):
|
||||||
for file_entry in system.get("files", []):
|
for file_entry in system.get("files", []):
|
||||||
if required_only and file_entry.get("required") is False:
|
if required_only and file_entry.get("required") is False:
|
||||||
@@ -1319,9 +1322,11 @@ def generate_pack(
|
|||||||
# Core requirements: files platform's cores need but YAML doesn't declare
|
# Core requirements: files platform's cores need but YAML doesn't declare
|
||||||
if emu_profiles is None:
|
if emu_profiles is None:
|
||||||
emu_profiles = load_emulator_profiles(emulators_dir)
|
emu_profiles = load_emulator_profiles(emulators_dir)
|
||||||
if precomputed_extras is not None:
|
if source == "platform":
|
||||||
|
core_files = []
|
||||||
|
elif precomputed_extras is not None:
|
||||||
core_files = precomputed_extras
|
core_files = precomputed_extras
|
||||||
elif system_filter:
|
elif system_filter and source != "truth":
|
||||||
core_files = []
|
core_files = []
|
||||||
else:
|
else:
|
||||||
core_files = _collect_emulator_extras(
|
core_files = _collect_emulator_extras(
|
||||||
@@ -1332,7 +1337,31 @@ def generate_pack(
|
|||||||
base_dest,
|
base_dest,
|
||||||
emu_profiles,
|
emu_profiles,
|
||||||
target_cores=target_cores,
|
target_cores=target_cores,
|
||||||
|
include_all=(source == "truth"),
|
||||||
)
|
)
|
||||||
|
|
||||||
|
# Truth mode + system_filter: filter core files by system ID
|
||||||
|
if system_filter and source == "truth" and core_files:
|
||||||
|
from common import _norm_system_id
|
||||||
|
|
||||||
|
norm_filter = {_norm_system_id(s) for s in system_filter} | set(
|
||||||
|
system_filter
|
||||||
|
)
|
||||||
|
emu_system_map: dict[str, set[str]] = {}
|
||||||
|
for _emu_name, _p in (emu_profiles or {}).items():
|
||||||
|
raw = set(_p.get("systems", []))
|
||||||
|
norm = {_norm_system_id(s) for s in raw}
|
||||||
|
combined = raw | norm
|
||||||
|
emu_system_map[_emu_name] = combined
|
||||||
|
_display = _p.get("emulator", "")
|
||||||
|
if _display and _display != _emu_name:
|
||||||
|
emu_system_map[_display] = combined
|
||||||
|
core_files = [
|
||||||
|
fe
|
||||||
|
for fe in core_files
|
||||||
|
if emu_system_map.get(fe.get("source_emulator", ""), set())
|
||||||
|
& norm_filter
|
||||||
|
]
|
||||||
core_count = 0
|
core_count = 0
|
||||||
for fe in core_files:
|
for fe in core_files:
|
||||||
if required_only and fe.get("required") is False:
|
if required_only and fe.get("required") is False:
|
||||||
@@ -1442,10 +1471,22 @@ def generate_pack(
|
|||||||
parts.append(f"{files_untested} untested")
|
parts.append(f"{files_untested} untested")
|
||||||
if files_miss:
|
if files_miss:
|
||||||
parts.append(f"{files_miss} missing")
|
parts.append(f"{files_miss} missing")
|
||||||
baseline = total_files - core_count
|
if source == "platform":
|
||||||
print(
|
print(
|
||||||
f" {zip_path}: {total_files} files packed ({baseline} baseline + {core_count} from cores), {', '.join(parts)} [{verification_mode}]"
|
f" {zip_path}: {total_files} files packed (platform baseline only), "
|
||||||
)
|
f"{', '.join(parts)} [{verification_mode}]"
|
||||||
|
)
|
||||||
|
elif source == "truth":
|
||||||
|
print(
|
||||||
|
f" {zip_path}: {total_files} files packed (ground truth only), "
|
||||||
|
f"{', '.join(parts)} [{verification_mode}]"
|
||||||
|
)
|
||||||
|
else:
|
||||||
|
baseline = total_files - core_count
|
||||||
|
print(
|
||||||
|
f" {zip_path}: {total_files} files packed ({baseline} baseline + "
|
||||||
|
f"{core_count} from cores), {', '.join(parts)} [{verification_mode}]"
|
||||||
|
)
|
||||||
|
|
||||||
for key, reason in sorted(file_reasons.items()):
|
for key, reason in sorted(file_reasons.items()):
|
||||||
status = file_status.get(key, "")
|
status = file_status.get(key, "")
|
||||||
|
|||||||
@@ -4510,5 +4510,68 @@ struct BurnDriver BurnDrvneogeo = {
|
|||||||
self.assertIn(name, all_names)
|
self.assertIn(name, all_names)
|
||||||
|
|
||||||
|
|
||||||
|
def test_202_pack_source_platform(self):
|
||||||
|
"""source='platform' skips core extras."""
|
||||||
|
from generate_pack import generate_pack
|
||||||
|
|
||||||
|
output_dir = os.path.join(self.root, "pack_platform")
|
||||||
|
os.makedirs(output_dir, exist_ok=True)
|
||||||
|
profiles = load_emulator_profiles(self.emulators_dir)
|
||||||
|
zip_path = generate_pack(
|
||||||
|
"test_existence",
|
||||||
|
self.platforms_dir,
|
||||||
|
self.db,
|
||||||
|
self.bios_dir,
|
||||||
|
output_dir,
|
||||||
|
emu_profiles=profiles,
|
||||||
|
emulators_dir=self.emulators_dir,
|
||||||
|
source="platform",
|
||||||
|
)
|
||||||
|
self.assertIsNotNone(zip_path)
|
||||||
|
self.assertIn("_Platform_", os.path.basename(zip_path))
|
||||||
|
|
||||||
|
def test_203_pack_source_truth(self):
|
||||||
|
"""source='truth' uses emulator profile files."""
|
||||||
|
from generate_pack import generate_pack
|
||||||
|
|
||||||
|
output_dir = os.path.join(self.root, "pack_truth")
|
||||||
|
os.makedirs(output_dir, exist_ok=True)
|
||||||
|
profiles = load_emulator_profiles(self.emulators_dir)
|
||||||
|
zip_path = generate_pack(
|
||||||
|
"test_existence",
|
||||||
|
self.platforms_dir,
|
||||||
|
self.db,
|
||||||
|
self.bios_dir,
|
||||||
|
output_dir,
|
||||||
|
emu_profiles=profiles,
|
||||||
|
emulators_dir=self.emulators_dir,
|
||||||
|
source="truth",
|
||||||
|
)
|
||||||
|
self.assertIsNotNone(zip_path)
|
||||||
|
self.assertIn("_Truth_", os.path.basename(zip_path))
|
||||||
|
|
||||||
|
def test_204_pack_source_full_unchanged(self):
|
||||||
|
"""source='full' (default) has no source tag in filename."""
|
||||||
|
from generate_pack import generate_pack
|
||||||
|
|
||||||
|
output_dir = os.path.join(self.root, "pack_full")
|
||||||
|
os.makedirs(output_dir, exist_ok=True)
|
||||||
|
profiles = load_emulator_profiles(self.emulators_dir)
|
||||||
|
zip_path = generate_pack(
|
||||||
|
"test_existence",
|
||||||
|
self.platforms_dir,
|
||||||
|
self.db,
|
||||||
|
self.bios_dir,
|
||||||
|
output_dir,
|
||||||
|
emu_profiles=profiles,
|
||||||
|
emulators_dir=self.emulators_dir,
|
||||||
|
source="full",
|
||||||
|
)
|
||||||
|
self.assertIsNotNone(zip_path)
|
||||||
|
bn = os.path.basename(zip_path)
|
||||||
|
self.assertNotIn("_Platform_", bn)
|
||||||
|
self.assertNotIn("_Truth_", bn)
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
unittest.main()
|
unittest.main()
|
||||||
|
|||||||
Reference in New Issue
Block a user