Skip to content

Commit 99bb137

Browse files
committed
Handle non-parseable versions gracefully
Also align handling between OS and Core version evaluations.
1 parent f249024 commit 99bb137

File tree

2 files changed

+28
-18
lines changed

2 files changed

+28
-18
lines changed

supervisor/resolution/evaluations/core_version.py

Lines changed: 15 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
"""Evaluation class for Core version."""
22

33
from datetime import datetime, timedelta
4+
import logging
45

56
from awesomeversion import (
67
AwesomeVersion,
@@ -14,6 +15,8 @@
1415
from ..const import UnsupportedReason
1516
from .base import EvaluateBase
1617

18+
_LOGGER: logging.Logger = logging.getLogger(__name__)
19+
1720

1821
def setup(coresys: CoreSys) -> EvaluateBase:
1922
"""Initialize evaluation-setup function."""
@@ -40,9 +43,7 @@ def states(self) -> list[CoreState]:
4043

4144
async def evaluate(self) -> bool:
4245
"""Run evaluation."""
43-
if not (current := self.sys_homeassistant.version) or not (
44-
latest := self.sys_homeassistant.latest_version
45-
):
46+
if not (current := self.sys_homeassistant.version):
4647
return False
4748

4849
# Skip evaluation for landingpage version
@@ -53,10 +54,7 @@ async def evaluate(self) -> bool:
5354
# Calculate if the current version was released more than 2 years ago
5455
# Home Assistant releases happen monthly, so approximately 24 versions per 2 years
5556
# However, we'll be more precise and check based on actual version numbers
56-
# Home Assistant follows a versioning scheme like 2024.1, 2024.2, etc.
57-
58-
# Extract year from current version
59-
current_year = int(str(current).split(".")[0])
57+
# Home Assistant uses CalVer versioning scheme like 2024.1, 2024.2, etc.
6058

6159
# Calculate 2 years ago from now
6260
two_years_ago = datetime.now() - timedelta(days=730) # 2 years = 730 days
@@ -72,13 +70,13 @@ async def evaluate(self) -> bool:
7270
# Compare current version with the cutoff
7371
return current < cutoff_version
7472

75-
except (AwesomeVersionException, ValueError, IndexError):
76-
# If we can't parse the version format, fall back to conservative approach
77-
# Consider unsupported if current is significantly behind latest
78-
try:
79-
# If latest version is from current year and current is from 2+ years ago
80-
latest_year = int(str(latest).split(".")[0])
81-
current_year = int(str(current).split(".")[0])
82-
return (latest_year - current_year) >= 2
83-
except (ValueError, IndexError):
84-
return False
73+
except AwesomeVersionException as err:
74+
# This is run regularly, avoid log spam by logging at debug level
75+
_LOGGER.debug(
76+
"Failed to parse Home Assistant version '%s' or cutoff version '%s': %s",
77+
current,
78+
cutoff_version,
79+
err,
80+
)
81+
# Consider non-parseable versions as unsupported
82+
return True

supervisor/resolution/evaluations/os_version.py

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,16 @@
11
"""Evaluation class for OS version."""
22

3+
import logging
4+
35
from awesomeversion import AwesomeVersion, AwesomeVersionException
46

57
from ...const import CoreState
68
from ...coresys import CoreSys
79
from ..const import UnsupportedReason
810
from .base import EvaluateBase
911

12+
_LOGGER: logging.Logger = logging.getLogger(__name__)
13+
1014

1115
def setup(coresys: CoreSys) -> EvaluateBase:
1216
"""Initialize evaluation-setup function."""
@@ -47,5 +51,13 @@ async def evaluate(self) -> bool:
4751
last_supported_version = AwesomeVersion(f"{int(latest.major) - 4}.0")
4852
try:
4953
return current < last_supported_version
50-
except AwesomeVersionException:
54+
except AwesomeVersionException as err:
55+
# This is run regularly, avoid log spam by logging at debug level
56+
_LOGGER.debug(
57+
"Can't parse OS version '%s' or latest version '%s': %s",
58+
current,
59+
latest,
60+
err,
61+
)
62+
# Consider non-parseable versions as unsupported
5163
return True

0 commit comments

Comments
 (0)