try to remove unknown packages from api

This commit is contained in:
Evgenii Alekseev 2023-04-06 18:14:36 +03:00
parent 39fde7cd5f
commit 9503a9f2ae
2 changed files with 37 additions and 10 deletions

View File

@ -21,7 +21,7 @@ import shutil
from pathlib import Path from pathlib import Path
from tempfile import TemporaryDirectory from tempfile import TemporaryDirectory
from typing import Iterable, List, Optional from typing import Dict, Iterable, List, Optional
from ahriman.core.build_tools.task import Task from ahriman.core.build_tools.task import Task
from ahriman.core.repository.cleaner import Cleaner from ahriman.core.repository.cleaner import Cleaner
@ -122,27 +122,41 @@ class Executor(Cleaner):
except Exception: except Exception:
self.logger.exception("could not remove %s", package) self.logger.exception("could not remove %s", package)
packages_to_remove: Dict[str, Path] = {}
bases_to_remove: List[str] = []
# build package list based on user input
requested = set(packages) requested = set(packages)
for local in self.packages(): for local in self.packages():
if local.base in packages or all(package in requested for package in local.packages): if local.base in packages or all(package in requested for package in local.packages):
to_remove = { packages_to_remove.update({
package: properties.filepath package: properties.filepath
for package, properties in local.packages.items() for package, properties in local.packages.items()
if properties.filepath is not None if properties.filepath is not None
} })
remove_base(local.base) bases_to_remove.append(local.base)
elif requested.intersection(local.packages.keys()): elif requested.intersection(local.packages.keys()):
to_remove = { packages_to_remove.update({
package: properties.filepath package: properties.filepath
for package, properties in local.packages.items() for package, properties in local.packages.items()
if package in requested and properties.filepath is not None if package in requested and properties.filepath is not None
} })
else:
to_remove = {}
for package, filename in to_remove.items(): # check for packages which were requested to remove, but weren't found locally
# it might happen for example, if there were no success build before
for unknown in requested:
if unknown in packages_to_remove or unknown in bases_to_remove:
continue
bases_to_remove.append(unknown)
# remove packages from repository files
for package, filename in packages_to_remove.items():
remove_package(package, filename) remove_package(package, filename)
# remove bases from registered
for package in bases_to_remove:
remove_base(package)
return self.repo.repo_path return self.repo.repo_path
def process_update(self, packages: Iterable[Path]) -> Result: def process_update(self, packages: Iterable[Path]) -> Result:

View File

@ -144,6 +144,19 @@ def test_process_remove_nothing(executor: Executor, package_ahriman: Package, pa
repo_remove_mock.assert_not_called() repo_remove_mock.assert_not_called()
def test_process_remove_unknown(executor: Executor, package_ahriman: Package, mocker: MockerFixture) -> None:
"""
must remove unknown package base
"""
mocker.patch("ahriman.core.repository.executor.Executor.packages", return_value=[])
repo_remove_mock = mocker.patch("ahriman.core.alpm.repo.Repo.remove")
status_client_mock = mocker.patch("ahriman.core.status.client.Client.remove")
executor.process_remove([package_ahriman.base])
repo_remove_mock.assert_not_called()
status_client_mock.assert_called_once_with(package_ahriman.base)
def test_process_update(executor: Executor, package_ahriman: Package, mocker: MockerFixture) -> None: def test_process_update(executor: Executor, package_ahriman: Package, mocker: MockerFixture) -> None:
""" """
must run update process must run update process