mirror of
ssh://git.janware.com/janware/proj/jw-pkg
synced 2026-04-24 17:23:36 +02:00
jw.pkg.cmds.distro.CmdSelect: Add command
Add the sub-command select to jw-pkg.py distro, along with an Implementation for OpenSUSE. Signed-off-by: Jan Lindemann <jan@janware.com>
This commit is contained in:
parent
81833e049a
commit
3ceb2b71b7
3 changed files with 74 additions and 0 deletions
31
src/python/jw/pkg/cmds/distro/CmdSelect.py
Normal file
31
src/python/jw/pkg/cmds/distro/CmdSelect.py
Normal file
|
|
@ -0,0 +1,31 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
|
from argparse import Namespace, ArgumentParser
|
||||||
|
import re
|
||||||
|
|
||||||
|
from ..CmdDistro import CmdDistro
|
||||||
|
from .lib.Package import Package
|
||||||
|
from .Cmd import Cmd
|
||||||
|
from .backend.BeSelect import BeSelect
|
||||||
|
|
||||||
|
class CmdSelect(Cmd): # export
|
||||||
|
|
||||||
|
def __init__(self, parent: CmdDistro) -> None:
|
||||||
|
super().__init__(parent, 'select', help="Select packages by filter")
|
||||||
|
|
||||||
|
def add_arguments(self, parser: ArgumentParser) -> None:
|
||||||
|
super().add_arguments(parser)
|
||||||
|
parser.add_argument("filter", help="Package filter string")
|
||||||
|
|
||||||
|
def filter_packages(self, filter: str, packages: list[Package]) -> list[Package]:
|
||||||
|
# -- Poor man's parsing for now
|
||||||
|
url_rx_str = re.sub(r'^\s*url\s*=~\s*', '', filter)
|
||||||
|
if url_rx_str == filter:
|
||||||
|
raise Exception(f'Unsupported filter string "{filter}"')
|
||||||
|
url_rx = re.compile(url_rx_str)
|
||||||
|
return [p for p in packages if re.search(url_rx, p.url) is not None]
|
||||||
|
|
||||||
|
async def _run(self, args: Namespace) -> None:
|
||||||
|
# TODO: Semantics probably change heavily in the future
|
||||||
|
for p in self.filter_packages(args.filter, await self._backend.all_installed_packages):
|
||||||
|
print(p.name)
|
||||||
26
src/python/jw/pkg/cmds/distro/backend/BeSelect.py
Normal file
26
src/python/jw/pkg/cmds/distro/backend/BeSelect.py
Normal file
|
|
@ -0,0 +1,26 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
|
from __future__ import annotations
|
||||||
|
from typing import TYPE_CHECKING
|
||||||
|
|
||||||
|
import abc
|
||||||
|
from typing import Iterable
|
||||||
|
|
||||||
|
from .Backend import Backend as Base
|
||||||
|
|
||||||
|
if TYPE_CHECKING:
|
||||||
|
from ..CmdSelect import CmdSelect as Parent
|
||||||
|
from .Package import Package
|
||||||
|
|
||||||
|
class BeSelect(Base):
|
||||||
|
|
||||||
|
def __init__(self, parent: Parent):
|
||||||
|
super().__init__(parent)
|
||||||
|
|
||||||
|
@property
|
||||||
|
async def all_installed_packages(self) -> Iterable[Package]:
|
||||||
|
return await self._all_installed_packages()
|
||||||
|
|
||||||
|
@abc.abstractmethod
|
||||||
|
async def _all_installed_packages(self) -> Iterable[Package]:
|
||||||
|
pass
|
||||||
17
src/python/jw/pkg/cmds/distro/backend/suse/Select.py
Normal file
17
src/python/jw/pkg/cmds/distro/backend/suse/Select.py
Normal file
|
|
@ -0,0 +1,17 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
|
from typing import Iterable
|
||||||
|
from argparse import Namespace
|
||||||
|
|
||||||
|
from ...lib.Package import Package
|
||||||
|
from ...lib.rpm import all_installed_packages
|
||||||
|
from ...Cmd import Cmd
|
||||||
|
from ..BeSelect import BeSelect as Base
|
||||||
|
|
||||||
|
class Select(Base):
|
||||||
|
|
||||||
|
def __init__(self, parent: Cmd):
|
||||||
|
super().__init__(parent)
|
||||||
|
|
||||||
|
async def _all_installed_packages(self) -> Iterable[Package]:
|
||||||
|
return await all_installed_packages()
|
||||||
Loading…
Add table
Add a link
Reference in a new issue