mirror of
https://github.com/esphome/esphome.git
synced 2025-10-28 21:53:48 +00:00
[core] Properly clean the build dir in the HA addon (#11208)
This commit is contained in:
@@ -15,6 +15,8 @@ from esphome.const import (
|
|||||||
from esphome.core import CORE, EsphomeError
|
from esphome.core import CORE, EsphomeError
|
||||||
from esphome.helpers import (
|
from esphome.helpers import (
|
||||||
copy_file_if_changed,
|
copy_file_if_changed,
|
||||||
|
get_str_env,
|
||||||
|
is_ha_addon,
|
||||||
read_file,
|
read_file,
|
||||||
walk_files,
|
walk_files,
|
||||||
write_file_if_changed,
|
write_file_if_changed,
|
||||||
@@ -338,16 +340,21 @@ def clean_build():
|
|||||||
def clean_all(configuration: list[str]):
|
def clean_all(configuration: list[str]):
|
||||||
import shutil
|
import shutil
|
||||||
|
|
||||||
# Clean entire build dir
|
data_dirs = [Path(dir) / ".esphome" for dir in configuration]
|
||||||
for dir in configuration:
|
if is_ha_addon():
|
||||||
build_dir = Path(dir) / ".esphome"
|
data_dirs.append(Path("/data"))
|
||||||
if build_dir.is_dir():
|
if "ESPHOME_DATA_DIR" in os.environ:
|
||||||
_LOGGER.info("Cleaning %s", build_dir)
|
data_dirs.append(Path(get_str_env("ESPHOME_DATA_DIR", None)))
|
||||||
# Don't remove storage as it will cause the dashboard to regenerate all configs
|
|
||||||
for item in build_dir.iterdir():
|
# Clean build dir
|
||||||
if item.is_file():
|
for dir in data_dirs:
|
||||||
|
if dir.is_dir():
|
||||||
|
_LOGGER.info("Cleaning %s", dir)
|
||||||
|
# Don't remove storage or .json files which are needed by the dashboard
|
||||||
|
for item in dir.iterdir():
|
||||||
|
if item.is_file() and not item.name.endswith(".json"):
|
||||||
item.unlink()
|
item.unlink()
|
||||||
elif item.name != "storage" and item.is_dir():
|
elif item.is_dir() and item.name != "storage":
|
||||||
shutil.rmtree(item)
|
shutil.rmtree(item)
|
||||||
|
|
||||||
# Clean PlatformIO project files
|
# Clean PlatformIO project files
|
||||||
|
|||||||
@@ -985,3 +985,49 @@ def test_clean_all_removes_non_storage_directories(
|
|||||||
# Verify logging mentions cleaning
|
# Verify logging mentions cleaning
|
||||||
assert "Cleaning" in caplog.text
|
assert "Cleaning" in caplog.text
|
||||||
assert str(build_dir) in caplog.text
|
assert str(build_dir) in caplog.text
|
||||||
|
|
||||||
|
|
||||||
|
@patch("esphome.writer.CORE")
|
||||||
|
def test_clean_all_preserves_json_files(
|
||||||
|
mock_core: MagicMock,
|
||||||
|
tmp_path: Path,
|
||||||
|
caplog: pytest.LogCaptureFixture,
|
||||||
|
) -> None:
|
||||||
|
"""Test clean_all preserves .json files."""
|
||||||
|
# Create build directory with various files
|
||||||
|
config_dir = tmp_path / "config"
|
||||||
|
config_dir.mkdir()
|
||||||
|
|
||||||
|
build_dir = config_dir / ".esphome"
|
||||||
|
build_dir.mkdir()
|
||||||
|
|
||||||
|
# Create .json files (should be preserved)
|
||||||
|
(build_dir / "config.json").write_text('{"config": "data"}')
|
||||||
|
(build_dir / "metadata.json").write_text('{"metadata": "info"}')
|
||||||
|
|
||||||
|
# Create non-.json files (should be removed)
|
||||||
|
(build_dir / "dummy.txt").write_text("x")
|
||||||
|
(build_dir / "other.log").write_text("log content")
|
||||||
|
|
||||||
|
# Call clean_all
|
||||||
|
from esphome.writer import clean_all
|
||||||
|
|
||||||
|
with caplog.at_level("INFO"):
|
||||||
|
clean_all([str(config_dir)])
|
||||||
|
|
||||||
|
# Verify .esphome directory still exists
|
||||||
|
assert build_dir.exists()
|
||||||
|
|
||||||
|
# Verify .json files are preserved
|
||||||
|
assert (build_dir / "config.json").exists()
|
||||||
|
assert (build_dir / "config.json").read_text() == '{"config": "data"}'
|
||||||
|
assert (build_dir / "metadata.json").exists()
|
||||||
|
assert (build_dir / "metadata.json").read_text() == '{"metadata": "info"}'
|
||||||
|
|
||||||
|
# Verify non-.json files were removed
|
||||||
|
assert not (build_dir / "dummy.txt").exists()
|
||||||
|
assert not (build_dir / "other.log").exists()
|
||||||
|
|
||||||
|
# Verify logging mentions cleaning
|
||||||
|
assert "Cleaning" in caplog.text
|
||||||
|
assert str(build_dir) in caplog.text
|
||||||
|
|||||||
Reference in New Issue
Block a user