fix: diff every declaration of a repeated destination

This commit is contained in:
Abdessamad Derraz committed 2026-10-06 09:43:58 +02:00
1 parent 7822de38fb
commit 892cff38bc
2 files changed
+32 -6

No files matched your search

+18 -6
View File
@@ -157,6 +157,22 @@ def _core_names(config: dict) -> set[str]:
return names
def _keyed_files(files: list[dict]) -> dict[str, dict]:
"""Each declaration under its own key.
A platform declares one destination several times (an archive once per
inner ROM, MD5 alternatives): keyed by destination alone, the dict kept
the last and a change to the others read as identical.
"""
keyed: dict[str, dict] = {}
seen: dict[str, int] = {}
for f in files:
key = _file_key(f)
seen[key] = seen.get(key, 0) + 1
keyed[key if seen[key] == 1 else f"{key}#{seen[key]}"] = f
return keyed
def diff_platform(old: dict, new: dict) -> PlatformDiff:
"""Compare two platform files the way a reviewer reads the diff.
@@ -172,12 +188,8 @@ def diff_platform(old: dict, new: dict) -> PlatformDiff:
diff.systems_added = sorted(set(new_systems) - set(old_systems))
diff.systems_removed = sorted(set(old_systems) - set(new_systems))
for system in sorted(set(old_systems) & set(new_systems)):
old_files = {
_file_key(f): f for f in (old_systems[system] or {}).get("files") or []
}
new_files = {
_file_key(f): f for f in (new_systems[system] or {}).get("files") or []
}
old_files = _keyed_files((old_systems[system] or {}).get("files") or [])
new_files = _keyed_files((new_systems[system] or {}).get("files") or [])
diff.files_added.extend(
f"{system}/{k}" for k in sorted(set(new_files) - set(old_files))
)
+14
View File
@@ -304,5 +304,19 @@ class RepositoryWiringTests(unittest.TestCase):
self.assertIn("[data]", text)
class RepeatedDestinations(unittest.TestCase):
def test_a_change_to_an_earlier_declaration_is_seen(self):
from check_freshness import diff_platform # noqa: PLC0415
def platform(first_md5: str) -> dict:
return {"systems": {"pce": {"files": [
{"name": "syscard3.pce", "destination": "syscard3.pce", "md5": first_md5},
{"name": "syscard3.pce", "destination": "syscard3.pce", "md5": "b" * 32},
]}}}
diff = diff_platform(platform("a" * 32), platform("c" * 32))
self.assertEqual(diff.files_changed, ["pce/syscard3.pce"])
if __name__ == "__main__":
unittest.main()