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 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.repository.cleaner import Cleaner
@ -122,26 +122,40 @@ class Executor(Cleaner):
except Exception:
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)
for local in self.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
for package, properties in local.packages.items()
if properties.filepath is not None
}
remove_base(local.base)
})
bases_to_remove.append(local.base)
elif requested.intersection(local.packages.keys()):
to_remove = {
packages_to_remove.update({
package: properties.filepath
for package, properties in local.packages.items()
if package in requested and properties.filepath is not None
}
else:
to_remove = {}
})
for package, filename in to_remove.items():
remove_package(package, filename)
# 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 bases from registered
for package in bases_to_remove:
remove_base(package)
return self.repo.repo_path

View File

@ -144,6 +144,19 @@ def test_process_remove_nothing(executor: Executor, package_ahriman: Package, pa
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:
"""
must run update process