mirror of
https://github.com/arcan1s/ahriman.git
synced 2025-11-15 13:03:42 +00:00
* Allow to use single web instance for any repository * some improvements * drop includes from user home directory, introduce new variables to docker The old solution didn't actually work as expected, because devtools configuration belongs to filesystem (as well as sudo one), so it was still required to run setup command. In order to handle additional repositories, the POSTSETUP and PRESETUP commands variables have been introduced. FAQ has been updated as well * raise 404 in case if repository is unknown
92 lines
3.3 KiB
Python
92 lines
3.3 KiB
Python
#
|
|
# Copyright (c) 2021-2023 ahriman team.
|
|
#
|
|
# This file is part of ahriman
|
|
# (see https://github.com/arcan1s/ahriman).
|
|
#
|
|
# This program is free software: you can redistribute it and/or modify
|
|
# it under the terms of the GNU General Public License as published by
|
|
# the Free Software Foundation, either version 3 of the License, or
|
|
# (at your option) any later version.
|
|
#
|
|
# This program is distributed in the hope that it will be useful,
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
# GNU General Public License for more details.
|
|
#
|
|
# You should have received a copy of the GNU General Public License
|
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
#
|
|
import argparse
|
|
|
|
from dataclasses import fields
|
|
from collections.abc import Callable, Iterable
|
|
|
|
from ahriman.application.handlers import Handler
|
|
from ahriman.core.alpm.remote import AUR, Official
|
|
from ahriman.core.configuration import Configuration
|
|
from ahriman.core.exceptions import OptionError
|
|
from ahriman.core.formatters import AurPrinter
|
|
from ahriman.models.aur_package import AURPackage
|
|
from ahriman.models.repository_id import RepositoryId
|
|
|
|
|
|
class Search(Handler):
|
|
"""
|
|
packages search handler
|
|
|
|
Attributes:
|
|
SORT_FIELDS(set[str]): (class attribute) allowed fields to sort the package list
|
|
"""
|
|
|
|
ALLOW_MULTI_ARCHITECTURE_RUN = False # system-wide action
|
|
SORT_FIELDS = {
|
|
field.name
|
|
for field in fields(AURPackage)
|
|
if field.default_factory is not list # type: ignore[comparison-overlap]
|
|
}
|
|
|
|
@classmethod
|
|
def run(cls, args: argparse.Namespace, repository_id: RepositoryId, configuration: Configuration, *,
|
|
report: bool) -> None:
|
|
"""
|
|
callback for command line
|
|
|
|
Args:
|
|
args(argparse.Namespace): command line args
|
|
repository_id(RepositoryId): repository unique identifier
|
|
configuration(Configuration): configuration instance
|
|
report(bool): force enable or disable reporting
|
|
"""
|
|
official_packages_list = Official.multisearch(*args.search)
|
|
aur_packages_list = AUR.multisearch(*args.search)
|
|
Search.check_if_empty(args.exit_code, not official_packages_list and not aur_packages_list)
|
|
|
|
for packages_list in (official_packages_list, aur_packages_list):
|
|
# keep sorting by packages source
|
|
for package in Search.sort(packages_list, args.sort_by):
|
|
AurPrinter(package)(verbose=args.info)
|
|
|
|
@staticmethod
|
|
def sort(packages: Iterable[AURPackage], sort_by: str) -> list[AURPackage]:
|
|
"""
|
|
sort package list by specified field
|
|
|
|
Args:
|
|
packages(Iterable[AURPackage]): packages list to sort
|
|
sort_by(str): AUR package field name to sort by
|
|
|
|
Returns:
|
|
list[AURPackage]: sorted list for packages
|
|
|
|
Raises:
|
|
OptionError: if search fields is not in list of allowed ones
|
|
"""
|
|
if sort_by not in Search.SORT_FIELDS:
|
|
raise OptionError(sort_by)
|
|
# always sort by package name at the last
|
|
# well technically it is not a string, but we can deal with it
|
|
comparator: Callable[[AURPackage], tuple[str, str]] =\
|
|
lambda package: (getattr(package, sort_by), package.name)
|
|
return sorted(packages, key=comparator)
|