mirror of
https://github.com/Abdess/retroarch_system.git
synced 2026-10-10 21:43:23 -05:00
fix: keep the database free of stale entries
Two entries claimed bios/Sony/PlayStation 3/PS3UPDAT.PUP with different SHA1s. Preserving large-file entries matched on path and keyed on SHA1, so replacing a firmware revision on disk left the old entry pointing at a path that now serves other bytes. A preserved entry whose path the scan has already claimed is dropped, and validate_schemas refuses a database where one path carries two entries. Separately, a run without --force rebuilt each cached entry from a hand-written list of four digests and wrote it back without adler32, so one such run stripped the digest from every file permanently. A cache entry missing any digest is now a miss.
This commit is contained in:
1 parent
3b8f2d75d5
commit
dc14089932
3 files changed
+153
-11
No files matched your search
@@ -10,6 +10,8 @@ import zipfile
|
||||
from pathlib import Path, PurePosixPath
|
||||
|
||||
import yaml
|
||||
|
||||
from common import yaml_load
|
||||
from jsonschema import Draft202012Validator, FormatChecker
|
||||
|
||||
ROOT = Path(__file__).resolve().parent.parent
|
||||
@@ -48,7 +50,7 @@ def _validate_yaml_directory(
|
||||
continue
|
||||
try:
|
||||
with path.open(encoding="utf-8") as handle:
|
||||
data = yaml.safe_load(handle)
|
||||
data = yaml_load(handle)
|
||||
except (OSError, yaml.YAMLError) as exc:
|
||||
out.append(f"{path.relative_to(ROOT)}: {exc}")
|
||||
continue
|
||||
@@ -122,9 +124,20 @@ def _semantic_database_checks(database: dict) -> list[str]:
|
||||
out.append("database.json: total_files does not equal len(files)")
|
||||
if database.get("total_size") != sum(entry.get("size", 0) for entry in files.values()):
|
||||
out.append("database.json: total_size does not equal the file-size sum")
|
||||
# One path holds one content. Two entries naming the same path means one
|
||||
# of them declares a hash the file at that path does not have.
|
||||
owners: dict[str, str] = {}
|
||||
for sha1, entry in files.items():
|
||||
if entry.get("sha1") != sha1:
|
||||
out.append(f"database.json: files/{sha1}: key and sha1 differ")
|
||||
path = entry.get("path", "")
|
||||
if not path:
|
||||
continue
|
||||
first = owners.setdefault(path, sha1)
|
||||
if first != sha1:
|
||||
out.append(
|
||||
f"database.json: {path} is claimed by {first} and {sha1}"
|
||||
)
|
||||
return out
|
||||
|
||||
|
||||
|
||||
Reference in new issue
Block a user