mirror of
				https://github.com/esphome/esphome.git
				synced 2025-10-31 23:21:54 +00:00 
			
		
		
		
	[core] Properly clean the build dir in the HA addon (#11208)
This commit is contained in:
		
				
					committed by
					
						 Jesse Hills
						Jesse Hills
					
				
			
			
				
	
			
			
			
						parent
						
							8627b56e36
						
					
				
				
					commit
					b666b8e261
				
			| @@ -15,6 +15,8 @@ from esphome.const import ( | ||||
| from esphome.core import CORE, EsphomeError | ||||
| from esphome.helpers import ( | ||||
|     copy_file_if_changed, | ||||
|     get_str_env, | ||||
|     is_ha_addon, | ||||
|     read_file, | ||||
|     walk_files, | ||||
|     write_file_if_changed, | ||||
| @@ -338,16 +340,21 @@ def clean_build(): | ||||
| def clean_all(configuration: list[str]): | ||||
|     import shutil | ||||
|  | ||||
|     # Clean entire build dir | ||||
|     for dir in configuration: | ||||
|         build_dir = Path(dir) / ".esphome" | ||||
|         if build_dir.is_dir(): | ||||
|             _LOGGER.info("Cleaning %s", build_dir) | ||||
|             # Don't remove storage as it will cause the dashboard to regenerate all configs | ||||
|             for item in build_dir.iterdir(): | ||||
|                 if item.is_file(): | ||||
|     data_dirs = [Path(dir) / ".esphome" for dir in configuration] | ||||
|     if is_ha_addon(): | ||||
|         data_dirs.append(Path("/data")) | ||||
|     if "ESPHOME_DATA_DIR" in os.environ: | ||||
|         data_dirs.append(Path(get_str_env("ESPHOME_DATA_DIR", None))) | ||||
|  | ||||
|     # Clean build dir | ||||
|     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() | ||||
|                 elif item.name != "storage" and item.is_dir(): | ||||
|                 elif item.is_dir() and item.name != "storage": | ||||
|                     shutil.rmtree(item) | ||||
|  | ||||
|     # Clean PlatformIO project files | ||||
|   | ||||
| @@ -985,3 +985,49 @@ def test_clean_all_removes_non_storage_directories( | ||||
|     # Verify logging mentions cleaning | ||||
|     assert "Cleaning" 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