From: Daan De Meyer Date: Fri, 26 Jan 2024 14:18:45 +0000 (+0100) Subject: Use generators for all repository methods X-Git-Tag: v21~80^2~2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=cfa32fb0cc2a5f8da4c2128be4defcb031f296cb;p=thirdparty%2Fmkosi.git Use generators for all repository methods Let's use generators and a repositories() method everywhere to make things consistent. --- diff --git a/mkosi/distributions/arch.py b/mkosi/distributions/arch.py index 2d4a4b388..3b9a02a43 100644 --- a/mkosi/distributions/arch.py +++ b/mkosi/distributions/arch.py @@ -1,6 +1,6 @@ # SPDX-License-Identifier: LGPL-2.1+ -from collections.abc import Sequence +from collections.abc import Iterable, Sequence from mkosi.config import Architecture from mkosi.context import Context @@ -41,11 +41,31 @@ class Installer(DistributionInstaller): @classmethod def setup(cls, context: Context) -> None: + setup_pacman(context, cls.repositories(context)) + + @classmethod + def install(cls, context: Context) -> None: + cls.install_packages(context, ["filesystem"], apivfs=False) + + @classmethod + def install_packages(cls, context: Context, packages: Sequence[str], apivfs: bool = True) -> None: + invoke_pacman( + context, + "--sync", + ["--refresh", "--needed", "--assume-installed", "initramfs"], + packages, + apivfs=apivfs, + ) + + @classmethod + def remove_packages(cls, context: Context, packages: Sequence[str]) -> None: + invoke_pacman(context, "--remove", ["--nosave", "--recursive"], packages) + + @classmethod + def repositories(cls, context: Context) -> Iterable[PacmanRepository]: if context.config.local_mirror: - repos = [PacmanRepository("core", context.config.local_mirror)] + yield PacmanRepository("core", context.config.local_mirror) else: - repos = [] - if context.config.architecture == Architecture.arm64: url = f"{context.config.mirror or 'http://mirror.archlinuxarm.org'}/$arch/$repo" else: @@ -61,30 +81,10 @@ class Installer(DistributionInstaller): "extra-debug", ): if id in context.config.repositories: - repos += [PacmanRepository(id, url)] + yield PacmanRepository(id, url) for id in ("core", "extra"): - repos += [PacmanRepository(id, url)] - - setup_pacman(context, repos) - - @classmethod - def install(cls, context: Context) -> None: - cls.install_packages(context, ["filesystem"], apivfs=False) - - @classmethod - def install_packages(cls, context: Context, packages: Sequence[str], apivfs: bool = True) -> None: - invoke_pacman( - context, - "--sync", - ["--refresh", "--needed", "--assume-installed", "initramfs"], - packages, - apivfs=apivfs, - ) - - @classmethod - def remove_packages(cls, context: Context, packages: Sequence[str]) -> None: - invoke_pacman(context, "--remove", ["--nosave", "--recursive"], packages) + yield PacmanRepository(id, url) @classmethod def architecture(cls, arch: Architecture) -> str: diff --git a/mkosi/distributions/fedora.py b/mkosi/distributions/fedora.py index 78cdc2b41..cb60cc0e9 100644 --- a/mkosi/distributions/fedora.py +++ b/mkosi/distributions/fedora.py @@ -1,6 +1,6 @@ # SPDX-License-Identifier: LGPL-2.1+ -from collections.abc import Sequence +from collections.abc import Iterable, Sequence from mkosi.config import Architecture from mkosi.context import Context @@ -46,6 +46,22 @@ class Installer(DistributionInstaller): @classmethod def setup(cls, context: Context) -> None: + setup_dnf(context, cls.repositories(context)) + + @classmethod + def install(cls, context: Context) -> None: + cls.install_packages(context, ["filesystem"], apivfs=False) + + @classmethod + def install_packages(cls, context: Context, packages: Sequence[str], apivfs: bool = True) -> None: + invoke_dnf(context, "install", packages, apivfs=apivfs) + + @classmethod + def remove_packages(cls, context: Context, packages: Sequence[str]) -> None: + invoke_dnf(context, "remove", packages) + + @classmethod + def repositories(cls, context: Context) -> Iterable[RpmRepository]: gpgurls = ( find_rpm_gpgkey( context, @@ -54,98 +70,70 @@ class Installer(DistributionInstaller): ), ) - repos = [] - if context.config.local_mirror: - repos += [RpmRepository("fedora", f"baseurl={context.config.local_mirror}", gpgurls)] + yield RpmRepository("fedora", f"baseurl={context.config.local_mirror}", gpgurls) elif context.config.release == "eln": mirror = context.config.mirror or "https://odcs.fedoraproject.org/composes/production/latest-Fedora-ELN/compose" for repo in ("Appstream", "BaseOS", "Extras", "CRB"): url = f"baseurl={join_mirror(mirror, repo)}" - repos += [ - RpmRepository(repo.lower(), f"{url}/$basearch/os", gpgurls), - RpmRepository(repo.lower(), f"{url}/$basearch/debug/tree", gpgurls, enabled=False), - RpmRepository(repo.lower(), f"{url}/source/tree", gpgurls, enabled=False), - ] + yield RpmRepository(repo.lower(), f"{url}/$basearch/os", gpgurls) + yield RpmRepository(repo.lower(), f"{url}/$basearch/debug/tree", gpgurls, enabled=False) + yield RpmRepository(repo.lower(), f"{url}/source/tree", gpgurls, enabled=False) elif (m := context.config.mirror): directory = "development" if context.config.release == "rawhide" else "releases" url = f"baseurl={join_mirror(m, f'fedora/linux/{directory}/$releasever/Everything')}" - repos += [ - RpmRepository("fedora", f"{url}/$basearch/os", gpgurls), - RpmRepository("fedora-debuginfo", f"{url}/$basearch/debug/tree", gpgurls, enabled=False), - RpmRepository("fedora-source", f"{url}/source/tree", gpgurls, enabled=False), - ] + yield RpmRepository("fedora", f"{url}/$basearch/os", gpgurls) + yield RpmRepository("fedora-debuginfo", f"{url}/$basearch/debug/tree", gpgurls, enabled=False) + yield RpmRepository("fedora-source", f"{url}/source/tree", gpgurls, enabled=False) if context.config.release != "rawhide": url = f"baseurl={join_mirror(m, 'fedora/linux/updates/$releasever/Everything')}" - repos += [ - RpmRepository("updates", f"{url}/$basearch", gpgurls), - RpmRepository("updates-debuginfo", f"{url}/$basearch/debug", gpgurls, enabled=False), - RpmRepository("updates-source", f"{url}/source/tree", gpgurls, enabled=False), - ] + yield RpmRepository("updates", f"{url}/$basearch", gpgurls) + yield RpmRepository("updates-debuginfo", f"{url}/$basearch/debug", gpgurls, enabled=False) + yield RpmRepository("updates-source", f"{url}/source/tree", gpgurls, enabled=False) url = f"baseurl={join_mirror(m, 'fedora/linux/updates/testing/$releasever/Everything')}" - repos += [ - RpmRepository("updates-testing", f"{url}/$basearch", gpgurls, enabled=False), - RpmRepository("updates-testing-debuginfo", f"{url}/$basearch/debug", gpgurls, enabled=False), - RpmRepository("updates-testing-source", f"{url}/source/tree", gpgurls, enabled=False) - ] + yield RpmRepository("updates-testing", f"{url}/$basearch", gpgurls, enabled=False) + yield RpmRepository("updates-testing-debuginfo", f"{url}/$basearch/debug", gpgurls, enabled=False) + yield RpmRepository("updates-testing-source", f"{url}/source/tree", gpgurls, enabled=False) else: url = "metalink=https://mirrors.fedoraproject.org/metalink?arch=$basearch" - repos += [ - RpmRepository("fedora", f"{url}&repo=fedora-$releasever", gpgurls), - RpmRepository("fedora-debuginfo", f"{url}&repo=fedora-debug-$releasever", gpgurls, enabled=False), - RpmRepository("fedora-source", f"{url}&repo=fedora-source-$releasever", gpgurls, enabled=False), - ] + yield RpmRepository("fedora", f"{url}&repo=fedora-$releasever", gpgurls) + yield RpmRepository("fedora-debuginfo", f"{url}&repo=fedora-debug-$releasever", gpgurls, enabled=False) + yield RpmRepository("fedora-source", f"{url}&repo=fedora-source-$releasever", gpgurls, enabled=False) if context.config.release != "rawhide": - repos += [ - RpmRepository("updates", f"{url}&repo=updates-released-f$releasever", gpgurls), - RpmRepository( - "updates-debuginfo", - f"{url}&repo=updates-released-debug-f$releasever", - gpgurls, - enabled=False, - ), - RpmRepository( - "updates-source", - f"{url}&repo=updates-released-source-f$releasever", - gpgurls, - enabled=False - ), - RpmRepository( - "updates-testing", - f"{url}&repo=updates-testing-f$releasever", - gpgurls, - enabled=False - ), - RpmRepository( - "updates-testing-debuginfo", - f"{url}&repo=updates-testing-debug-f$releasever", - gpgurls, - enabled=False, - ), - RpmRepository( - "updates-testing-source", - f"{url}&repo=updates-testing-source-f$releasever", - gpgurls, - enabled=False, - ), - ] - - setup_dnf(context, repos) - - @classmethod - def install(cls, context: Context) -> None: - cls.install_packages(context, ["filesystem"], apivfs=False) - - @classmethod - def install_packages(cls, context: Context, packages: Sequence[str], apivfs: bool = True) -> None: - invoke_dnf(context, "install", packages, apivfs=apivfs) - - @classmethod - def remove_packages(cls, context: Context, packages: Sequence[str]) -> None: - invoke_dnf(context, "remove", packages) + yield RpmRepository("updates", f"{url}&repo=updates-released-f$releasever", gpgurls) + yield RpmRepository( + "updates-debuginfo", + f"{url}&repo=updates-released-debug-f$releasever", + gpgurls, + enabled=False, + ) + yield RpmRepository( + "updates-source", + f"{url}&repo=updates-released-source-f$releasever", + gpgurls, + enabled=False + ) + yield RpmRepository( + "updates-testing", + f"{url}&repo=updates-testing-f$releasever", + gpgurls, + enabled=False + ) + yield RpmRepository( + "updates-testing-debuginfo", + f"{url}&repo=updates-testing-debug-f$releasever", + gpgurls, + enabled=False, + ) + yield RpmRepository( + "updates-testing-source", + f"{url}&repo=updates-testing-source-f$releasever", + gpgurls, + enabled=False, + ) @classmethod def architecture(cls, arch: Architecture) -> str: diff --git a/mkosi/distributions/mageia.py b/mkosi/distributions/mageia.py index a79bf5b2a..aedf62188 100644 --- a/mkosi/distributions/mageia.py +++ b/mkosi/distributions/mageia.py @@ -1,7 +1,7 @@ # SPDX-License-Identifier: LGPL-2.1+ import shutil -from collections.abc import Sequence +from collections.abc import Iterable, Sequence from mkosi.config import Architecture from mkosi.context import Context @@ -43,32 +43,7 @@ class Installer(DistributionInstaller): @classmethod def setup(cls, context: Context) -> None: - gpgurls = ( - find_rpm_gpgkey( - context, - "RPM-GPG-KEY-Mageia", - "https://mirrors.kernel.org/mageia/distrib/$releasever/$basearch/media/core/release/media_info/pubkey", - ), - ) - - repos = [] - - if context.config.local_mirror: - repos += [RpmRepository("core-release", f"baseurl={context.config.local_mirror}", gpgurls)] - elif context.config.mirror: - url = f"baseurl={join_mirror(context.config.mirror, 'distrib/$releasever/$basearch/media/core/')}" - repos += [ - RpmRepository("core-release", f"{url}/release", gpgurls), - RpmRepository("core-updates", f"{url}/updates/", gpgurls) - ] - else: - url = "mirrorlist=https://www.mageia.org/mirrorlist/?release=$releasever&arch=$basearch§ion=core" - repos += [ - RpmRepository("core-release", f"{url}&repo=release", gpgurls), - RpmRepository("core-updates", f"{url}&repo=updates", gpgurls) - ] - - setup_dnf(context, repos) + setup_dnf(context, cls.repositories(context)) @classmethod def install(cls, context: Context) -> None: @@ -88,6 +63,27 @@ class Installer(DistributionInstaller): def remove_packages(cls, context: Context, packages: Sequence[str]) -> None: invoke_dnf(context, "remove", packages) + @classmethod + def repositories(cls, context: Context) -> Iterable[RpmRepository]: + gpgurls = ( + find_rpm_gpgkey( + context, + "RPM-GPG-KEY-Mageia", + "https://mirrors.kernel.org/mageia/distrib/$releasever/$basearch/media/core/release/media_info/pubkey", + ), + ) + + if context.config.local_mirror: + yield RpmRepository("core-release", f"baseurl={context.config.local_mirror}", gpgurls) + elif context.config.mirror: + url = f"baseurl={join_mirror(context.config.mirror, 'distrib/$releasever/$basearch/media/core/')}" + yield RpmRepository("core-release", f"{url}/release", gpgurls) + yield RpmRepository("core-updates", f"{url}/updates/", gpgurls) + else: + url = "mirrorlist=https://www.mageia.org/mirrorlist/?release=$releasever&arch=$basearch§ion=core" + yield RpmRepository("core-release", f"{url}&repo=release", gpgurls) + yield RpmRepository("core-updates", f"{url}&repo=updates", gpgurls) + @classmethod def architecture(cls, arch: Architecture) -> str: a = { diff --git a/mkosi/distributions/openmandriva.py b/mkosi/distributions/openmandriva.py index df177e73a..8933a62c2 100644 --- a/mkosi/distributions/openmandriva.py +++ b/mkosi/distributions/openmandriva.py @@ -1,7 +1,7 @@ # SPDX-License-Identifier: LGPL-2.1+ import shutil -from collections.abc import Sequence +from collections.abc import Iterable, Sequence from mkosi.config import Architecture from mkosi.context import Context @@ -43,28 +43,7 @@ class Installer(DistributionInstaller): @classmethod def setup(cls, context: Context) -> None: - mirror = context.config.mirror or "http://mirror.openmandriva.org" - - gpgurls = ( - find_rpm_gpgkey( - context, - "RPM-GPG-KEY-OpenMandriva", - "https://raw.githubusercontent.com/OpenMandrivaAssociation/openmandriva-repos/master/RPM-GPG-KEY-OpenMandriva", - ), - ) - - repos = [] - - if context.config.local_mirror: - repos += [RpmRepository("main-release", f"baseurl={context.config.local_mirror}", gpgurls)] - else: - url = f"baseurl={join_mirror(mirror, '$releasever/repository/$basearch/main')}" - repos += [ - RpmRepository("main-release", f"{url}/release", gpgurls), - RpmRepository("main-updates", f"{url}/updates", gpgurls), - ] - - setup_dnf(context, repos) + setup_dnf(context, cls.repositories(context)) @classmethod def install(cls, context: Context) -> None: @@ -88,6 +67,25 @@ class Installer(DistributionInstaller): def remove_packages(cls, context: Context, packages: Sequence[str]) -> None: invoke_dnf(context, "remove", packages) + @classmethod + def repositories(cls, context: Context) -> Iterable[RpmRepository]: + mirror = context.config.mirror or "http://mirror.openmandriva.org" + + gpgurls = ( + find_rpm_gpgkey( + context, + "RPM-GPG-KEY-OpenMandriva", + "https://raw.githubusercontent.com/OpenMandrivaAssociation/openmandriva-repos/master/RPM-GPG-KEY-OpenMandriva", + ), + ) + + if context.config.local_mirror: + yield RpmRepository("main-release", f"baseurl={context.config.local_mirror}", gpgurls) + else: + url = f"baseurl={join_mirror(mirror, '$releasever/repository/$basearch/main')}" + yield RpmRepository("main-release", f"{url}/release", gpgurls) + yield RpmRepository("main-updates", f"{url}/updates", gpgurls) + @classmethod def architecture(cls, arch: Architecture) -> str: a = { diff --git a/mkosi/distributions/opensuse.py b/mkosi/distributions/opensuse.py index e893fc719..ee5556606 100644 --- a/mkosi/distributions/opensuse.py +++ b/mkosi/distributions/opensuse.py @@ -2,7 +2,7 @@ import tempfile import xml.etree.ElementTree as ElementTree -from collections.abc import Sequence +from collections.abc import Iterable, Sequence from pathlib import Path from mkosi.config import Architecture @@ -50,54 +50,11 @@ class Installer(DistributionInstaller): @classmethod def setup(cls, context: Context) -> None: - release = context.config.release - if release == "leap": - release = "stable" - - mirror = context.config.mirror or "https://download.opensuse.org" - - # If the release looks like a timestamp, it's Tumbleweed. 13.x is legacy - # (14.x won't ever appear). For anything else, let's default to Leap. - if context.config.local_mirror: - release_url = f"{context.config.local_mirror}" - updates_url = None - if release.isdigit() or release == "tumbleweed": - release_url = f"{mirror}/tumbleweed/repo/oss/" - updates_url = f"{mirror}/update/tumbleweed/" - elif release in ("current", "stable"): - release_url = f"{mirror}/distribution/openSUSE-{release}/repo/oss/" - updates_url = f"{mirror}/update/openSUSE-{release}/" - else: - release_url = f"{mirror}/distribution/leap/{release}/repo/oss/" - updates_url = f"{mirror}/update/leap/{release}/oss/" - zypper = find_binary("zypper", root=context.config.tools()) - - # If we need to use a local mirror, create a temporary repository definition - # that doesn't get in the image, as it is valid only at image build time. - if context.config.local_mirror: - repos = [RpmRepository(id="local-mirror", url=f"baseurl={context.config.local_mirror}", gpgurls=())] - else: - repos = [ - RpmRepository( - id="repo-oss", - url=f"baseurl={release_url}", - gpgurls=fetch_gpgurls(context, release_url) if not zypper else (), - ), - ] - if updates_url is not None: - repos += [ - RpmRepository( - id="repo-update", - url=f"baseurl={updates_url}", - gpgurls=fetch_gpgurls(context, updates_url) if not zypper else (), - ) - ] - if zypper: - setup_zypper(context, repos) + setup_zypper(context, cls.repositories(context)) else: - setup_dnf(context, repos) + setup_dnf(context, cls.repositories(context)) @classmethod def install(cls, context: Context) -> None: @@ -121,6 +78,46 @@ class Installer(DistributionInstaller): else: invoke_dnf(context, "remove", packages) + @classmethod + def repositories(cls, context: Context) -> Iterable[RpmRepository]: + zypper = find_binary("zypper", root=context.config.tools()) + + release = context.config.release + if release == "leap": + release = "stable" + + mirror = context.config.mirror or "https://download.opensuse.org" + + # If the release looks like a timestamp, it's Tumbleweed. 13.x is legacy + # (14.x won't ever appear). For anything else, let's default to Leap. + if context.config.local_mirror: + release_url = f"{context.config.local_mirror}" + updates_url = None + if release.isdigit() or release == "tumbleweed": + release_url = f"{mirror}/tumbleweed/repo/oss/" + updates_url = f"{mirror}/update/tumbleweed/" + elif release in ("current", "stable"): + release_url = f"{mirror}/distribution/openSUSE-{release}/repo/oss/" + updates_url = f"{mirror}/update/openSUSE-{release}/" + else: + release_url = f"{mirror}/distribution/leap/{release}/repo/oss/" + updates_url = f"{mirror}/update/leap/{release}/oss/" + + if context.config.local_mirror: + yield RpmRepository(id="local-mirror", url=f"baseurl={context.config.local_mirror}", gpgurls=()) + else: + yield RpmRepository( + id="repo-oss", + url=f"baseurl={release_url}", + gpgurls=fetch_gpgurls(context, release_url) if not zypper else (), + ) + if updates_url is not None: + yield RpmRepository( + id="repo-update", + url=f"baseurl={updates_url}", + gpgurls=fetch_gpgurls(context, updates_url) if not zypper else (), + ) + @classmethod def architecture(cls, arch: Architecture) -> str: a = { diff --git a/mkosi/installer/zypper.py b/mkosi/installer/zypper.py index 339815032..d7ea1fb5c 100644 --- a/mkosi/installer/zypper.py +++ b/mkosi/installer/zypper.py @@ -1,6 +1,6 @@ # SPDX-License-Identifier: LGPL-2.1+ import textwrap -from collections.abc import Sequence +from collections.abc import Iterable, Sequence from mkosi.config import yes_no from mkosi.context import Context @@ -13,7 +13,7 @@ from mkosi.types import PathString from mkosi.util import sort_packages -def setup_zypper(context: Context, repos: Sequence[RpmRepository]) -> None: +def setup_zypper(context: Context, repos: Iterable[RpmRepository]) -> None: config = context.pkgmngr / "etc/zypp/zypp.conf" config.parent.mkdir(exist_ok=True, parents=True)