From: Zbigniew Jędrzejewski-Szmek Date: Sat, 15 Jun 2024 19:56:15 +0000 (+0200) Subject: installer/apt: make Repository a normal dataclass X-Git-Tag: v24~82^2~6 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=e8518b2920cbeb8facc2cb94221892ae6cb39d18;p=thirdparty%2Fmkosi.git installer/apt: make Repository a normal dataclass 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. --- diff --git a/mkosi/distributions/debian.py b/mkosi/distributions/debian.py index 4fa7c2b30..e55906ca2 100644 --- a/mkosi/distributions/debian.py +++ b/mkosi/distributions/debian.py @@ -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 diff --git a/mkosi/distributions/ubuntu.py b/mkosi/distributions/ubuntu.py index 07be74c9c..786d7c0a2 100644 --- a/mkosi/distributions/ubuntu.py +++ b/mkosi/distributions/ubuntu.py @@ -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", diff --git a/mkosi/installer/apt.py b/mkosi/installer/apt.py index da256d44c..41415d806 100644 --- a/mkosi/installer/apt.py +++ b/mkosi/installer/apt.py @@ -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)