From 7b9c8ae663873fb0b28314603eb7224c92a031c9 Mon Sep 17 00:00:00 2001 From: Abdessamad Derraz <3028866+Abdess@users.noreply.github.com> Date: Wed, 21 Oct 2026 10:00:47 +0200 Subject: [PATCH] fix: refuse a mistyped --target in cross_reference load_target_config raised out of cross_reference.py as a traceback. The hint now names the full verify.py command, since cross_reference and slots have no --list-targets. --- scripts/common.py | 5 ++++- scripts/cross_reference.py | 15 ++++++++++----- tests/test_audit_regressions.py | 19 +++++++++++++++++++ 3 files changed, 33 insertions(+), 6 deletions(-) diff --git a/scripts/common.py b/scripts/common.py index 35b53465..a70fdbdf 100644 --- a/scripts/common.py +++ b/scripts/common.py @@ -658,8 +658,11 @@ def load_target_config( # through, where a platform or emulator name gets the closest ones. raise ValueError( f"Unknown target '{target}' for platform '{platform_name}'.\n" + # Named as a full command: cross_reference.py and slots.py take + # --target but have no --list-targets of their own. + suggest_names( - [target], sorted(alias_index), "--list-targets", len(targets) + [target], sorted(alias_index), + f"verify.py --platform {platform_name} --list-targets", len(targets), ) ) diff --git a/scripts/cross_reference.py b/scripts/cross_reference.py index f82966b5..5899a973 100644 --- a/scripts/cross_reference.py +++ b/scripts/cross_reference.py @@ -979,11 +979,16 @@ def main() -> None: if args.platform: from common import load_target_config, resolve_platform_cores - target_cores = ( - load_target_config(args.platform, args.target, args.platforms_dir) - if args.target - else None - ) + try: + target_cores = ( + load_target_config(args.platform, args.target, args.platforms_dir) + if args.target + else None + ) + except (FileNotFoundError, ValueError) as exc: + # A typo ended in a traceback where verify and slots name the + # closest target. + parser.error(str(exc)) config = load_platform_config(args.platform, args.platforms_dir) relevant = resolve_platform_cores(config, profiles, target_cores=target_cores) run_anywhere = ( diff --git a/tests/test_audit_regressions.py b/tests/test_audit_regressions.py index a50cd08c..fa129b18 100644 --- a/tests/test_audit_regressions.py +++ b/tests/test_audit_regressions.py @@ -6277,5 +6277,24 @@ class ExternalDownloadsFollowTheRunPolicy(unittest.TestCase): self.assertIn("dir=", call) +class ATargetTypoIsAnErrorInEveryTool(unittest.TestCase): + """cross_reference.py ended a mistyped --target in a traceback, and the + hint sent cross_reference and slots users to a flag they do not have.""" + + def test_each_tool_names_the_closest_target(self): + for script in ("cross_reference.py", "slots.py", "verify.py"): + with self.subTest(script=script): + proc = subprocess.run( + [sys.executable, f"scripts/{script}", "--platform", "retroarch", + "--target", "swich"], + cwd=ROOT, capture_output=True, text=True, timeout=300, + ) + output = proc.stdout + proc.stderr + self.assertNotEqual(proc.returncode, 0) + self.assertNotIn("Traceback", output) + self.assertIn("Did you mean: switch?", output) + self.assertIn("verify.py --platform retroarch --list-targets", output) + + if __name__ == "__main__": unittest.main()