diff --git a/supervisor/utils/__init__.py b/supervisor/utils/__init__.py index 5e60c91c7..b395a4856 100644 --- a/supervisor/utils/__init__.py +++ b/supervisor/utils/__init__.py @@ -175,4 +175,8 @@ def directory_missing_or_empty(path: Path) -> bool: Must be run in executor. """ - return not path.is_dir() or len(os.listdir(path)) == 0 + if not path.is_dir(): + return True + + # Efficiently check if directory is empty + return next(os.scandir(path), None) is None diff --git a/tests/utils/test_utils_init.py b/tests/utils/test_utils_init.py index 5bcee7533..198b5b3d6 100644 --- a/tests/utils/test_utils_init.py +++ b/tests/utils/test_utils_init.py @@ -4,7 +4,7 @@ import os from pathlib import Path import tempfile -from supervisor.utils import get_latest_mtime # Adjust the import as needed +from supervisor.utils import directory_missing_or_empty, get_latest_mtime def test_get_latest_mtime_with_files(): @@ -83,3 +83,32 @@ def test_get_latest_mtime_empty_directory(): latest_mtime, latest_path = get_latest_mtime(tmpdir) assert latest_path == tmpdir assert latest_mtime > 0 + + +def test_directory_missing_or_empty(): + """Test directory_missing_or_empty function.""" + with tempfile.TemporaryDirectory() as tmpdirname: + tmpdir = Path(tmpdirname) + + # Test empty directory + assert directory_missing_or_empty(tmpdir) is True + + # Test directory with file + test_file = tmpdir / "test.txt" + test_file.write_text("test content") + assert directory_missing_or_empty(tmpdir) is False + + # Test directory with subdirectory + test_file.unlink() + subdir = tmpdir / "subdir" + subdir.mkdir() + assert directory_missing_or_empty(tmpdir) is False + + # Test non-existent path + non_existent = tmpdir / "does_not_exist" + assert directory_missing_or_empty(non_existent) is True + + # Test file (not directory) + subdir.rmdir() + test_file.write_text("test content") + assert directory_missing_or_empty(test_file) is True