mirror of
https://github.com/arcan1s/ahriman.git
synced 2025-07-16 07:19:57 +00:00
support check dependencies
This commit is contained in:
@ -136,7 +136,7 @@ class Setup(Handler):
|
||||
"""
|
||||
create configuration for devtools based on ``source`` configuration
|
||||
|
||||
Note:
|
||||
Notes:
|
||||
devtools does not allow to specify the pacman configuration, thus we still have to use configuration in /usr
|
||||
|
||||
Args:
|
||||
|
80
src/ahriman/core/database/migrations/m007_check_depends.py
Normal file
80
src/ahriman/core/database/migrations/m007_check_depends.py
Normal file
@ -0,0 +1,80 @@
|
||||
#
|
||||
# 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/>.
|
||||
#
|
||||
from sqlite3 import Connection
|
||||
|
||||
from ahriman.core.alpm.pacman import Pacman
|
||||
from ahriman.core.configuration import Configuration
|
||||
from ahriman.core.util import package_like
|
||||
from ahriman.models.package import Package
|
||||
from ahriman.models.pacman_synchronization import PacmanSynchronization
|
||||
|
||||
|
||||
__all__ = ["migrate_data", "steps"]
|
||||
|
||||
|
||||
steps = [
|
||||
"""
|
||||
alter table packages add column check_depends json
|
||||
""",
|
||||
]
|
||||
|
||||
|
||||
def migrate_data(connection: Connection, configuration: Configuration) -> None:
|
||||
"""
|
||||
perform data migration
|
||||
|
||||
Args:
|
||||
connection(Connection): database connection
|
||||
configuration(Configuration): configuration instance
|
||||
"""
|
||||
migrate_package_check_depends(connection, configuration)
|
||||
|
||||
|
||||
def migrate_package_check_depends(connection: Connection, configuration: Configuration) -> None:
|
||||
"""
|
||||
migrate package check depends fields
|
||||
|
||||
Args:
|
||||
connection(Connection): database connection
|
||||
configuration(Configuration): configuration instance
|
||||
"""
|
||||
if not configuration.repository_paths.repository.is_dir():
|
||||
return
|
||||
|
||||
_, architecture = configuration.check_loaded()
|
||||
pacman = Pacman(architecture, configuration, refresh_database=PacmanSynchronization.Disabled)
|
||||
|
||||
package_list = []
|
||||
for full_path in filter(package_like, configuration.repository_paths.repository.iterdir()):
|
||||
base = Package.from_archive(full_path, pacman, remote=None)
|
||||
for package, description in base.packages.items():
|
||||
package_list.append({
|
||||
"check_depends": description.check_depends,
|
||||
"package": package,
|
||||
})
|
||||
|
||||
connection.executemany(
|
||||
"""
|
||||
update packages set
|
||||
check_depends = :check_depends
|
||||
where package = :package
|
||||
""",
|
||||
package_list
|
||||
)
|
@ -113,17 +113,17 @@ class PackageOperations(Operations):
|
||||
(package, package_base, architecture, archive_size,
|
||||
build_date, depends, description, filename,
|
||||
"groups", installed_size, licenses, provides,
|
||||
url, make_depends, opt_depends)
|
||||
url, make_depends, opt_depends, check_depends)
|
||||
values
|
||||
(:package, :package_base, :architecture, :archive_size,
|
||||
:build_date, :depends, :description, :filename,
|
||||
:groups, :installed_size, :licenses, :provides,
|
||||
:url, :make_depends, :opt_depends)
|
||||
:url, :make_depends, :opt_depends, :check_depends)
|
||||
on conflict (package, architecture) do update set
|
||||
package_base = :package_base, archive_size = :archive_size,
|
||||
build_date = :build_date, depends = :depends, description = :description, filename = :filename,
|
||||
"groups" = :groups, installed_size = :installed_size, licenses = :licenses, provides = :provides,
|
||||
url = :url, make_depends = :make_depends, opt_depends = :opt_depends
|
||||
url = :url, make_depends = :make_depends, opt_depends = :opt_depends, check_depends = :check_depends
|
||||
""",
|
||||
package_list)
|
||||
|
||||
|
@ -220,7 +220,7 @@ class GPG(LazyLogging):
|
||||
"""
|
||||
sign repository if required by configuration
|
||||
|
||||
Note:
|
||||
Notes:
|
||||
More likely you just want to pass ``repository_sign_args`` to repo wrapper
|
||||
|
||||
Args:
|
||||
|
@ -52,6 +52,7 @@ class AURPackage:
|
||||
depends(list[str]): list of package dependencies
|
||||
make_depends(l[str]): list of package make dependencies
|
||||
opt_depends(list[str]): list of package optional dependencies
|
||||
check_depends(list[str]): list of package test dependencies
|
||||
conflicts(list[str]): conflicts list for the package
|
||||
provides(list[str]): list of packages which this package provides
|
||||
license(list[str]): list of package licenses
|
||||
@ -94,6 +95,7 @@ class AURPackage:
|
||||
depends: list[str] = field(default_factory=list)
|
||||
make_depends: list[str] = field(default_factory=list)
|
||||
opt_depends: list[str] = field(default_factory=list)
|
||||
check_depends: list[str] = field(default_factory=list)
|
||||
conflicts: list[str] = field(default_factory=list)
|
||||
provides: list[str] = field(default_factory=list)
|
||||
license: list[str] = field(default_factory=list)
|
||||
@ -146,6 +148,7 @@ class AURPackage:
|
||||
depends=package.depends,
|
||||
make_depends=package.makedepends,
|
||||
opt_depends=package.optdepends,
|
||||
check_depends=package.checkdepends,
|
||||
conflicts=package.conflicts,
|
||||
provides=package.provides,
|
||||
license=package.licenses,
|
||||
@ -185,6 +188,7 @@ class AURPackage:
|
||||
depends=dump["depends"],
|
||||
make_depends=dump["makedepends"],
|
||||
opt_depends=dump["optdepends"],
|
||||
check_depends=dump["checkdepends"],
|
||||
conflicts=dump["conflicts"],
|
||||
provides=dump["provides"],
|
||||
license=dump["licenses"],
|
||||
|
@ -22,7 +22,7 @@ from __future__ import annotations
|
||||
|
||||
import copy
|
||||
|
||||
from collections.abc import Generator, Iterable
|
||||
from collections.abc import Callable, Generator, Iterable
|
||||
from dataclasses import asdict, dataclass
|
||||
from pathlib import Path
|
||||
from pyalpm import vercmp # type: ignore[import]
|
||||
@ -88,7 +88,7 @@ class Package(LazyLogging):
|
||||
Returns:
|
||||
list[str]: sum of dependencies per each package
|
||||
"""
|
||||
return sorted(set(sum((package.depends for package in self.packages.values()), start=[])))
|
||||
return self._package_list_property(lambda package: package.depends)
|
||||
|
||||
@property
|
||||
def depends_build(self) -> set[str]:
|
||||
@ -98,7 +98,17 @@ class Package(LazyLogging):
|
||||
Returns:
|
||||
set[str]: full dependencies list used by devtools
|
||||
"""
|
||||
return (set(self.depends) | set(self.depends_make)).difference(self.packages_full)
|
||||
return (set(self.depends) | set(self.depends_make) | set(self.depends_check)).difference(self.packages_full)
|
||||
|
||||
@property
|
||||
def depends_check(self) -> list[str]:
|
||||
"""
|
||||
get package test dependencies
|
||||
|
||||
Returns:
|
||||
list[str]: sum of test dependencies per each package
|
||||
"""
|
||||
return self._package_list_property(lambda package: package.check_depends)
|
||||
|
||||
@property
|
||||
def depends_make(self) -> list[str]:
|
||||
@ -108,7 +118,7 @@ class Package(LazyLogging):
|
||||
Returns:
|
||||
list[str]: sum of make dependencies per each package
|
||||
"""
|
||||
return sorted(set(sum((package.make_depends for package in self.packages.values()), start=[])))
|
||||
return self._package_list_property(lambda package: package.make_depends)
|
||||
|
||||
@property
|
||||
def depends_opt(self) -> list[str]:
|
||||
@ -118,7 +128,7 @@ class Package(LazyLogging):
|
||||
Returns:
|
||||
list[str]: sum of optional dependencies per each package
|
||||
"""
|
||||
return sorted(set(sum((package.opt_depends for package in self.packages.values()), start=[])))
|
||||
return self._package_list_property(lambda package: package.opt_depends)
|
||||
|
||||
@property
|
||||
def groups(self) -> list[str]:
|
||||
@ -128,7 +138,7 @@ class Package(LazyLogging):
|
||||
Returns:
|
||||
list[str]: sum of groups per each package
|
||||
"""
|
||||
return sorted(set(sum((package.groups for package in self.packages.values()), start=[])))
|
||||
return self._package_list_property(lambda package: package.groups)
|
||||
|
||||
@property
|
||||
def is_single_package(self) -> bool:
|
||||
@ -163,7 +173,7 @@ class Package(LazyLogging):
|
||||
Returns:
|
||||
list[str]: sum of licenses per each package
|
||||
"""
|
||||
return sorted(set(sum((package.licenses for package in self.packages.values()), start=[])))
|
||||
return self._package_list_property(lambda package: package.licenses)
|
||||
|
||||
@property
|
||||
def packages_full(self) -> list[str]:
|
||||
@ -241,6 +251,7 @@ class Package(LazyLogging):
|
||||
depends=srcinfo_property_list("depends", srcinfo, properties, architecture=architecture),
|
||||
make_depends=srcinfo_property_list("makedepends", srcinfo, properties, architecture=architecture),
|
||||
opt_depends=srcinfo_property_list("optdepends", srcinfo, properties, architecture=architecture),
|
||||
check_depends=srcinfo_property_list("checkdepends", srcinfo, properties, architecture=architecture),
|
||||
)
|
||||
for package, properties in srcinfo["packages"].items()
|
||||
}
|
||||
@ -351,6 +362,26 @@ class Package(LazyLogging):
|
||||
raise PackageInfoError(errors)
|
||||
return set(srcinfo.get("arch", []))
|
||||
|
||||
def _package_list_property(self, extractor: Callable[[PackageDescription], list[str]]) -> list[str]:
|
||||
"""
|
||||
extract list property from single packages and combine them into one list
|
||||
|
||||
Notes:
|
||||
Basically this method is generic for type of ``list[T]``, but there is no trait ``Comparable`` in default
|
||||
packages, thus we limit this method only to new types
|
||||
|
||||
Args:
|
||||
extractor(Callable[[PackageDescription], list[str]): package property extractor
|
||||
|
||||
Returns:
|
||||
list[str]: combined list of unique entries in properties list
|
||||
"""
|
||||
def generator() -> Generator[str, None, None]:
|
||||
for package in self.packages.values():
|
||||
yield from extractor(package)
|
||||
|
||||
return sorted(set(generator()))
|
||||
|
||||
def actual_version(self, paths: RepositoryPaths) -> str:
|
||||
"""
|
||||
additional method to handle VCS package versions
|
||||
|
@ -35,6 +35,7 @@ class PackageDescription:
|
||||
architecture(str | None): package architecture
|
||||
archive_size(int | None): package archive size
|
||||
build_date(int | None): package build date
|
||||
check_depends(list[str]): package dependencies list used for check functions
|
||||
depends(list[str]): package dependencies list
|
||||
opt_depends(list[str]): optional package dependencies list
|
||||
make_depends(list[str]): package dependencies list used for building
|
||||
@ -70,6 +71,7 @@ class PackageDescription:
|
||||
depends: list[str] = field(default_factory=list)
|
||||
make_depends: list[str] = field(default_factory=list)
|
||||
opt_depends: list[str] = field(default_factory=list)
|
||||
check_depends: list[str] = field(default_factory=list)
|
||||
description: str | None = None
|
||||
filename: str | None = None
|
||||
groups: list[str] = field(default_factory=list)
|
||||
@ -85,6 +87,7 @@ class PackageDescription:
|
||||
self.depends = [trim_package(package) for package in self.depends]
|
||||
self.opt_depends = [trim_package(package) for package in self.opt_depends]
|
||||
self.make_depends = [trim_package(package) for package in self.make_depends]
|
||||
self.check_depends = [trim_package(package) for package in self.check_depends]
|
||||
|
||||
@property
|
||||
def filepath(self) -> Path | None:
|
||||
@ -111,6 +114,7 @@ class PackageDescription:
|
||||
depends=package.depends,
|
||||
make_depends=package.make_depends,
|
||||
opt_depends=package.opt_depends,
|
||||
check_depends=package.check_depends,
|
||||
description=package.description,
|
||||
licenses=package.license,
|
||||
provides=package.provides,
|
||||
@ -151,6 +155,7 @@ class PackageDescription:
|
||||
depends=package.depends,
|
||||
make_depends=package.makedepends,
|
||||
opt_depends=package.optdepends,
|
||||
check_depends=package.checkdepends,
|
||||
description=package.desc,
|
||||
filename=path.name,
|
||||
groups=package.groups,
|
||||
|
@ -49,6 +49,10 @@ class PackagePropertiesSchema(Schema):
|
||||
"description": "Package optional dependencies list",
|
||||
"example": ["python-aiohttp"],
|
||||
})
|
||||
check_depends = fields.List(fields.String(), metadata={
|
||||
"description": "Package test dependencies list",
|
||||
"example": ["python-pytest"],
|
||||
})
|
||||
description = fields.String(metadata={
|
||||
"description": "Package description",
|
||||
"example": "ArcH linux ReposItory MANager",
|
||||
|
Reference in New Issue
Block a user