]> git.ipfire.org Git - thirdparty/mkosi.git/commitdiff
installer/apt: make Repository a normal dataclass
authorZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>
Sat, 15 Jun 2024 19:56:15 +0000 (21:56 +0200)
committerZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>
Thu, 27 Jun 2024 12:58:40 +0000 (14:58 +0200)
NamedTuple is an outdated solution… Make a normal dataclass to
match other places. Dataclasses also have nicer string representation.

Also let's not make the class nested. This doesn't matter terribly here,
but it makes the code unusual. Rename the type to "AptRepository"
to match RpmRepository.

mkosi/distributions/debian.py
mkosi/distributions/ubuntu.py
mkosi/installer/apt.py

index 4fa7c2b30cd61215f42d89c997c2dd17935be61b..e55906ca2b1c6a08cbe6e04ac5db3d20cf986ab7 100644 (file)
@@ -9,7 +9,7 @@ from mkosi.config import Architecture, Config
 from mkosi.context import Context
 from mkosi.distributions import Distribution, DistributionInstaller, PackageType
 from mkosi.installer import PackageManager
-from mkosi.installer.apt import Apt
+from mkosi.installer.apt import Apt, AptRepository
 from mkosi.log import die
 from mkosi.run import run
 from mkosi.sandbox import Mount
@@ -43,12 +43,12 @@ class Installer(DistributionInstaller):
 
     @staticmethod
     @listify
-    def repositories(context: Context, local: bool = True) -> Iterable[Apt.Repository]:
+    def repositories(context: Context, local: bool = True) -> Iterable[AptRepository]:
         types = ("deb", "deb-src")
         components = ("main", *context.config.repositories)
 
         if context.config.local_mirror and local:
-            yield Apt.Repository(
+            yield AptRepository(
                 types=("deb",),
                 url=context.config.local_mirror,
                 suite=context.config.release,
@@ -60,7 +60,7 @@ class Installer(DistributionInstaller):
         mirror = context.config.mirror or "http://deb.debian.org/debian"
         signedby = Path("/usr/share/keyrings/debian-archive-keyring.gpg")
 
-        yield Apt.Repository(
+        yield AptRepository(
             types=types,
             url=mirror,
             suite=context.config.release,
@@ -71,7 +71,7 @@ class Installer(DistributionInstaller):
         # Debug repos are typically not mirrored.
         url = "http://deb.debian.org/debian-debug"
 
-        yield Apt.Repository(
+        yield AptRepository(
             types=types,
             url=url,
             suite=f"{context.config.release}-debug",
@@ -82,7 +82,7 @@ class Installer(DistributionInstaller):
         if context.config.release in ("unstable", "sid"):
             return
 
-        yield Apt.Repository(
+        yield AptRepository(
             types=types,
             url=mirror,
             suite=f"{context.config.release}-updates",
@@ -90,7 +90,7 @@ class Installer(DistributionInstaller):
             signedby=signedby,
         )
 
-        yield Apt.Repository(
+        yield AptRepository(
             types=types,
             # Security updates repos are never mirrored.
             url="http://security.debian.org/debian-security",
@@ -240,7 +240,7 @@ class Installer(DistributionInstaller):
         return a
 
 
-def install_apt_sources(context: Context, repos: Iterable[Apt.Repository]) -> None:
+def install_apt_sources(context: Context, repos: Iterable[AptRepository]) -> None:
     if not (context.root / "usr/bin/apt").exists():
         return
 
index 07be74c9c1803189de2b24b4f8353dfab4a80fd0..786d7c0a21631c5b806995a59264586bfe3ec69c 100644 (file)
@@ -5,7 +5,7 @@ from pathlib import Path
 
 from mkosi.context import Context
 from mkosi.distributions import Distribution, debian
-from mkosi.installer.apt import Apt
+from mkosi.installer.apt import AptRepository
 from mkosi.util import listify
 
 
@@ -24,7 +24,7 @@ class Installer(debian.Installer):
 
     @staticmethod
     @listify
-    def repositories(context: Context, local: bool = True) -> Iterable[Apt.Repository]:
+    def repositories(context: Context, local: bool = True) -> Iterable[AptRepository]:
         types = ("deb", "deb-src")
 
         # From kinetic onwards, the usr-is-merged package is available in universe and is required by
@@ -33,7 +33,7 @@ class Installer(debian.Installer):
         components = (*components, *context.config.repositories)
 
         if context.config.local_mirror and local:
-            yield Apt.Repository(
+            yield AptRepository(
                 types=("deb",),
                 url=context.config.local_mirror,
                 suite=context.config.release,
@@ -49,7 +49,7 @@ class Installer(debian.Installer):
 
         signedby = Path("/usr/share/keyrings/ubuntu-archive-keyring.gpg")
 
-        yield Apt.Repository(
+        yield AptRepository(
             types=types,
             url=mirror,
             suite=context.config.release,
@@ -57,7 +57,7 @@ class Installer(debian.Installer):
             signedby=signedby,
         )
 
-        yield Apt.Repository(
+        yield AptRepository(
             types=types,
             url=mirror,
             suite=f"{context.config.release}-updates",
@@ -71,7 +71,7 @@ class Installer(debian.Installer):
         else:
             mirror = "http://ports.ubuntu.com/"
 
-        yield Apt.Repository(
+        yield AptRepository(
             types=types,
             url=mirror,
             suite=f"{context.config.release}-security",
index da256d44c7a55e9bd3d0db766a366d525a89e710..41415d806eb6d93a76a887536014d750162599bc 100644 (file)
@@ -1,9 +1,11 @@
 # SPDX-License-Identifier: LGPL-2.1+
+
+import dataclasses
 import os
 import textwrap
 from collections.abc import Iterable, Sequence
 from pathlib import Path
-from typing import NamedTuple, Optional
+from typing import Optional
 
 from mkosi.config import Config, ConfigFeature
 from mkosi.context import Context
@@ -16,26 +18,28 @@ from mkosi.types import _FILE, CompletedProcess, PathString
 from mkosi.util import umask
 
 
-class Apt(PackageManager):
-    class Repository(NamedTuple):
-        types: tuple[str, ...]
-        url: str
-        suite: str
-        components: tuple[str, ...]
-        signedby: Optional[Path]
-
-        def __str__(self) -> str:
-            return textwrap.dedent(
-                f"""\
-                Types: {" ".join(self.types)}
-                URIs: {self.url}
-                Suites: {self.suite}
-                Components: {" ".join(self.components)}
-                {"Signed-By" if self.signedby else "Trusted"}: {self.signedby or "yes"}
+@dataclasses.dataclass(frozen=True)
+class AptRepository:
+    types: tuple[str, ...]
+    url: str
+    suite: str
+    components: tuple[str, ...]
+    signedby: Optional[Path]
 
-                """
-            )
+    def __str__(self) -> str:
+        return textwrap.dedent(
+            f"""\
+            Types: {" ".join(self.types)}
+            URIs: {self.url}
+            Suites: {self.suite}
+            Components: {" ".join(self.components)}
+            {"Signed-By" if self.signedby else "Trusted"}: {self.signedby or "yes"}
 
+            """
+        )
+
+
+class Apt(PackageManager):
     @classmethod
     def executable(cls, config: Config) -> str:
         return "apt"
@@ -85,7 +89,7 @@ class Apt(PackageManager):
         }
 
     @classmethod
-    def setup(cls, context: Context, repos: Iterable[Repository]) -> None:
+    def setup(cls, context: Context, repos: Iterable[AptRepository]) -> None:
         (context.pkgmngr / "etc/apt").mkdir(exist_ok=True, parents=True)
         (context.pkgmngr / "etc/apt/apt.conf.d").mkdir(exist_ok=True, parents=True)
         (context.pkgmngr / "etc/apt/preferences.d").mkdir(exist_ok=True, parents=True)