Fix add-on store reset (#5669)

Make sure that add-on store resets do not delete the root folder. This
is important so that successive reset attempts do not fail (the
directory passed to `remove_folder` must exist, otherwise find fails
with an non-zero exit code).

While at it, handle find errors properly and report errors as critical.
This commit is contained in:
Stefan Agner 2025-02-25 17:11:34 +01:00 committed by GitHub
parent 15e8940c7f
commit 42e78408a7
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 9 additions and 4 deletions

View File

@ -1,5 +1,6 @@
"""Helpers to check and fix issues with free space.""" """Helpers to check and fix issues with free space."""
from functools import partial
import logging import logging
from ...coresys import CoreSys from ...coresys import CoreSys
@ -40,7 +41,9 @@ class FixupStoreExecuteReset(FixupBase):
_LOGGER.warning("Can't find store %s for fixup", reference) _LOGGER.warning("Can't find store %s for fixup", reference)
return return
await self.sys_run_in_executor(remove_folder, repository.git.path) await self.sys_run_in_executor(
partial(remove_folder, folder=repository.git.path, content_only=True)
)
# Load data again # Load data again
try: try:

View File

@ -106,8 +106,7 @@ def remove_folder(
except OSError as err: except OSError as err:
_LOGGER.exception("Can't remove folder %s: %s", folder, err) _LOGGER.exception("Can't remove folder %s: %s", folder, err)
except subprocess.CalledProcessError as procerr: except subprocess.CalledProcessError as procerr:
_LOGGER.error("Can't remove folder %s: %s", folder, procerr.stderr.strip()) _LOGGER.critical("Can't remove folder %s: %s", folder, procerr.stderr.strip())
raise procerr
def remove_folder_with_excludes( def remove_folder_with_excludes(

View File

@ -1,6 +1,7 @@
"""Test evaluation base.""" """Test evaluation base."""
# pylint: disable=import-error,protected-access # pylint: disable=import-error,protected-access
from os import listdir
from pathlib import Path from pathlib import Path
from unittest.mock import AsyncMock, patch from unittest.mock import AsyncMock, patch
@ -25,16 +26,18 @@ async def test_fixup(coresys: CoreSys, tmp_path):
) )
test_repo.mkdir() test_repo.mkdir()
(test_repo / ".git").mkdir()
assert test_repo.exists() assert test_repo.exists()
mock_repositorie = AsyncMock() mock_repositorie = AsyncMock()
mock_repositorie.git.path = test_repo mock_repositorie.git.path = test_repo
coresys.store.repositories["test"] = mock_repositorie coresys.store.repositories["test"] = mock_repositorie
assert len(listdir(test_repo)) > 0
with patch("shutil.disk_usage", return_value=(42, 42, 2 * (1024.0**3))): with patch("shutil.disk_usage", return_value=(42, 42, 2 * (1024.0**3))):
await store_execute_reset() await store_execute_reset()
assert not test_repo.exists() assert len(listdir(test_repo)) == 0
assert mock_repositorie.load.called assert mock_repositorie.load.called
assert len(coresys.resolution.suggestions) == 0 assert len(coresys.resolution.suggestions) == 0
assert len(coresys.resolution.issues) == 0 assert len(coresys.resolution.issues) == 0