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.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