download-drivers: compare BIOS versions numerically, not as strings

parse_bios_catalog kept the 'latest' BIOS per model with a string compare, so e.g. '1.20.1' > '1.9.0' was False and it wrongly retained the older 1.9.0. Added _ver_tuple() and compare tuples of ints so the genuinely newest firmware wins.
This commit is contained in:
cproudlock
2026-07-23 10:54:35 -04:00
parent 0cb6b26c27
commit 3b63697176

View File

@@ -155,6 +155,14 @@ def parse_driver_catalog(xml_path, os_filter=None):
return packs
def _ver_tuple(v):
"""Version string -> tuple of ints for numeric compare ('1.20.1' -> (1,20,1))."""
try:
return tuple(int(x) for x in str(v).split("."))
except (ValueError, AttributeError):
return (0,)
def parse_bios_catalog(xml_path, model_names):
"""Parse DellSDPCatalogPC.xml → list of latest BIOS update dicts for given models."""
tree = ET.parse(xml_path)
@@ -199,9 +207,11 @@ def parse_bios_catalog(xml_path, model_names):
"model": matched_model,
}
# Keep latest version per model
# Keep latest version per model. Compare numerically (tuple of ints),
# not as strings - "1.20.1" > "1.9.0" is False as a string compare,
# which would wrongly keep the older 1.9.0 BIOS.
key = matched_model
if key not in bios or version > bios[key]["version"]:
if key not in bios or _ver_tuple(version) > _ver_tuple(bios[key]["version"]):
bios[key] = entry
return list(bios.values())