]> git.ipfire.org Git - thirdparty/mkosi.git/commitdiff
Use generators for all repository methods
authorDaan De Meyer <daan.j.demeyer@gmail.com>
Fri, 26 Jan 2024 14:18:45 +0000 (15:18 +0100)
committerDaan De Meyer <daan.j.demeyer@gmail.com>
Fri, 26 Jan 2024 15:01:47 +0000 (16:01 +0100)
Let's use generators and a repositories() method everywhere to make
things consistent.

mkosi/distributions/arch.py
mkosi/distributions/fedora.py
mkosi/distributions/mageia.py
mkosi/distributions/openmandriva.py
mkosi/distributions/opensuse.py
mkosi/installer/zypper.py

index 2d4a4b388882e2a0edf724e5005739d555b2cb6d..3b9a02a4315cb48edf0be29c9de9f2de07713987 100644 (file)
@@ -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:
index 78cdc2b41fbef285d23045d6c528507da2415302..cb60cc0e974c34bada20a5d8218adbc910efc972 100644 (file)
@@ -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:
index a79bf5b2ac369800d510e7ec624831a4ac17714c..aedf62188a718227b6ffb17354c0b7c8b104598d 100644 (file)
@@ -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&section=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&section=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 = {
index df177e73ad34a2857170d576310a685ec138975e..8933a62c2ae477a18a284eb8e208f715fbc82890 100644 (file)
@@ -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 = {
index e893fc7195aaee29b0b4e47d9f5810627d44db78..ee5556606376e44c00557cb61ffc59ac567cff0a 100644 (file)
@@ -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 = {
index 339815032798b95ea652e6ac461bd8dbb8a7d629..d7ea1fb5c03f519ac01093f4004cee2f3786ba6d 100644 (file)
@@ -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)