Source code for meta_package_manager.managers.opkg
# Copyright Kevin Deldycke <kevin@deldycke.com> and contributors.
#
# 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 2
# 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, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
from __future__ import annotations
import re
from extra_platforms import UNIX_WITHOUT_MACOS
from ..base import PackageManager
from ..capabilities import search_capabilities, version_not_implemented
TYPE_CHECKING = False
if TYPE_CHECKING:
from collections.abc import Iterator
from ..base import Package
[docs]
class OPKG(PackageManager):
homepage_url = "https://git.yoctoproject.org/cgit/cgit.cgi/opkg/"
platforms = UNIX_WITHOUT_MACOS
requirement = "0.2.0"
version_regexes = (r"opkg\s+version\s+(?P<version>\S+)",)
"""
.. code-block:: shell-session
$ opkg --version
opkg version 0.3.6 (libsolv 0.7.5)
"""
@property
def installed(self) -> Iterator[Package]:
"""Fetch installed packages.
.. code-block:: shell-session
$ opkg list-installed
3rd-party-feed-configs - 1.1-r0
aio-grab - 1.0+git71+c79e264-r0
alsa-conf - 1.1.9-r0
alsa-state - 0.2.0-r5
alsa-states - 0.2.0-r5
alsa-utils-alsactl - 1.1.9-r0
avahi-daemon - 0.7-r0
base-files - 3.0.14-r89
base-files-dev - 3.0.14-r89
base-passwd - 3.5.29-r0
bash - 5.0-r0
bash-completion - 2.9-r0
bash-completion-dev - 2.9-r0
bash-dev - 5.0-r0
binutils - 2.32.0-r0
busybox - 1.31.0-r0
busybox-inetd - 1.31.0-r0
busybox-mdev - 1.31.0-r0
busybox-syslog - 1.31.0-r0
busybox-udhcpc - 1.31.0-r0
"""
output = self.run_cli("list-installed")
regexp = re.compile(r"(\S+) - (\S+)")
for package in output.splitlines():
match = regexp.match(package)
if match:
package_id, installed_version = match.groups()
yield self.package(id=package_id, installed_version=installed_version)
@property
def outdated(self) -> Iterator[Package]:
"""Fetch outdated packages.
.. code-block:: shell-session
$ opkg list-upgradable
openpli-bootlogo - 20190717-r0 - 20190718-r0
enigma2-hotplug - 2.7+git1720+55c6b34-r0 - 2.7+git1722+daf2f52-r0
"""
output = self.run_cli("list-upgradable")
regexp = re.compile(r"(\S+) - (\S+) - (\S+)")
for package in output.splitlines():
match = regexp.match(package)
if match:
package_id, installed_version, latest_version = match.groups()
yield self.package(
id=package_id,
latest_version=latest_version,
installed_version=installed_version,
)
[docs]
@search_capabilities(extended_support=False, exact_support=False)
def search(self, query: str, extended: bool, exact: bool) -> Iterator[Package]:
"""Fetch matching packages.
.. warning::
There is no search command so we simulate it by listing all packages.
.. caution::
Search does not support extended or exact matching. So we returns the best
subset of results and let
:py:meth:`meta_package_manager.base.PackageManager.refiltered_search` refine
them.
.. code-block:: shell-session
$ opkg list
"""
output = self.run_cli("list")
regexp = re.compile(
r"""
(?P<package_id>\S+)
\ -\
(?P<version>\S+)
\ -\
(?P<description>.+)
""",
re.VERBOSE | re.MULTILINE,
)
for package_id, version, description in regexp.findall(output):
yield self.package(
id=package_id,
description=description,
latest_version=version,
)
@version_not_implemented
def install(self, package_id: str, version: str | None = None) -> str:
"""Install one package.
.. code-block:: shell-session
$ opkg install enigma2-hotplug
"""
return self.run_cli("install", package_id)
[docs]
def upgrade_all_cli(self) -> tuple[str, ...]:
"""Generates the CLI to upgrade all packages (default) or only the one provided
as parameter.
.. code-block:: shell-session
$ opkg upgrade
"""
return self.build_cli("upgrade")
@version_not_implemented
def upgrade_one_cli(
self,
package_id: str,
version: str | None = None,
) -> tuple[str, ...]:
"""Generates the CLI to upgrade all packages (default) or only the one provided
as parameter.
.. code-block:: shell-session
$ opkg upgrade enigma2-hotplug
"""
return self.build_cli("upgrade", package_id)
[docs]
def sync(self) -> None:
"""Sync package metadata.
.. code-block:: shell-session
$ opkg update
"""
self.run_cli("update")