fix: accept PEP 440 multi-part versions in install_util version parser

is_valid_version() previously only matched strict 3-part semver (X.Y.Z),
causing a false ERROR log on startup whenever requirements.txt contained a
2-part constraint such as SQLAlchemy>=2.0.

Steps to reproduce (before fix):
  ComfyUI currently logs at ERROR level on every startup:
  [2026-04-21 16:06:11.527] Invalid version format in requirements.txt: 2.0
  The offending entry is SQLAlchemy>=2.0 (merged in #13316).

Root cause:
  The regex r'^(\d+)\.(\d+)\.(\d+)$' requires exactly three numeric parts.
  PEP 440 treats 2.0 and 2.0.0 as equivalent release identifiers, so the
  constraint is valid but the validator rejected it.

Fix:
  Replace the regex with r'^\d+(\.\d+)*$' which accepts 1-, 2-, and 3-part
  (and longer) all-numeric release identifiers: 2, 2.0, 2.0.0, 1.25.3.
  Also downgrade the log level from ERROR to WARNING, since an unparseable
  entry is skipped gracefully and does not break the install.

Previously issue #12813 was worked around by changing simpleeval>=1.0 to
simpleeval>=1.0.0 in requirements.txt.  This commit fixes the underlying
parser so the same workaround is not needed for future entries.
This commit is contained in:
NeonScreams 2026-04-21 16:45:15 -07:00
parent 102773cd2c
commit f3f989c79f

View File

@ -21,8 +21,12 @@ If you are on the portable package you can run: update\\update_comfyui.bat to so
def is_valid_version(version: str) -> bool: def is_valid_version(version: str) -> bool:
"""Validate if a string is a valid semantic version (X.Y.Z format).""" """Validate if a string is a valid version number.
pattern = r"^(\d+)\.(\d+)\.(\d+)$"
Accepts PEP 440-style numeric versions with one or more dot-separated
components (e.g. ``2``, ``2.0``, ``2.0.0``, ``1.25.3``).
"""
pattern = r"^\d+(\.\d+)*$"
return bool(re.match(pattern, version)) return bool(re.match(pattern, version))
@ -39,7 +43,7 @@ def get_required_packages_versions():
if len(s) == 2: if len(s) == 2:
version_str = s[-1] version_str = s[-1]
if not is_valid_version(version_str): if not is_valid_version(version_str):
logging.error(f"Invalid version format in requirements.txt: {version_str}") logging.warning(f"Skipping unrecognised version format in requirements.txt: {version_str}")
continue continue
out[s[0]] = version_str out[s[0]] = version_str
return out.copy() return out.copy()