mirror of
https://github.com/arcan1s/ahriman.git
synced 2025-04-24 23:37:18 +00:00
try to remove unknown packages from api
This commit is contained in:
parent
39fde7cd5f
commit
9503a9f2ae
@ -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:
|
||||||
|
@ -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
|
||||||
|
Loading…
Reference in New Issue
Block a user