[core] Replace a damaged existing file in write_file_if_changed

This commit is contained in:
J. Nick Koston
2026-08-22 22:36:43 -05:00
parent f0651e5c9b
commit eb7b522461
2 changed files with 21 additions and 1 deletions
+9 -1
View File
@@ -550,9 +550,17 @@ def write_file_if_changed(path: Path, text: str) -> bool:
Returns true if the file was changed.
"""
from esphome.core import EsphomeError
src_content = None
if path.is_file():
src_content = read_file(path)
try:
src_content = read_file(path)
except (EsphomeError, UnicodeDecodeError) as err:
# A damaged existing file (unreadable, non-UTF-8) must be
# replaced, not abort the regeneration that would fix it
_LOGGER.warning("Replacing damaged file %s: %s", path, err)
path.unlink(missing_ok=True)
if src_content == text:
return False
write_file(path, text)
+12
View File
@@ -1108,3 +1108,15 @@ def test_progressbar_enabled_on_pipe_with_dashboard(monkeypatch) -> None:
def test_format_duration(seconds: float, expected: str) -> None:
"""Test that durations are rendered as short human-readable strings."""
assert helpers.format_duration(seconds) == expected
def test_write_file_if_changed_replaces_damaged_file(tmp_path, caplog) -> None:
"""A non-UTF-8 or unreadable existing file is logged and overwritten;
aborting would block the very regeneration that fixes it."""
from esphome.helpers import write_file_if_changed
target = tmp_path / "generated.txt"
target.write_bytes(b"\xff\xfe")
assert write_file_if_changed(target, "fresh content") is True
assert target.read_text(encoding="utf-8") == "fresh content"
assert "Replacing damaged file" in caplog.text