]> git.ipfire.org Git - thirdparty/mkosi.git/commitdiff
Introduce pacman.py for pacman related logic
authorDaan De Meyer <daan.j.demeyer@gmail.com>
Wed, 26 Jul 2023 13:13:28 +0000 (15:13 +0200)
committerDaan De Meyer <daan.j.demeyer@gmail.com>
Mon, 31 Jul 2023 08:46:55 +0000 (10:46 +0200)
mkosi/distributions/arch.py
mkosi/installer/pacman.py [new file with mode: 0644]

index 7625659b1dfbca84325de3380acd3f7b4ae3b758..e2e107235c23cf35b12f21dfdcf7d4d9b2baef59 100644 (file)
@@ -1,17 +1,12 @@
 # SPDX-License-Identifier: LGPL-2.1+
 
 from collections.abc import Sequence
-from pathlib import Path
-from textwrap import dedent
 
 from mkosi.architecture import Architecture
-from mkosi.config import ConfigFeature
 from mkosi.distributions import DistributionInstaller
+from mkosi.installer.pacman import invoke_pacman, setup_pacman
 from mkosi.log import die
-from mkosi.run import bwrap
 from mkosi.state import MkosiState
-from mkosi.types import PathString
-from mkosi.util import sort_packages
 
 
 class ArchInstaller(DistributionInstaller):
@@ -40,103 +35,3 @@ class ArchInstaller(DistributionInstaller):
 
         return a
 
-
-def setup_pacman(state: MkosiState) -> None:
-    assert state.config.mirror
-
-    if state.config.local_mirror:
-        server = f"Server = {state.config.local_mirror}"
-    else:
-        if state.config.architecture == Architecture.arm64:
-            server = f"Server = {state.config.mirror}/$arch/$repo"
-        else:
-            server = f"Server = {state.config.mirror}/$repo/os/$arch"
-
-    if state.config.repository_key_check:
-        sig_level = "Required DatabaseOptional"
-    else:
-        # If we are using a single local mirror built on the fly there
-        # will be no signatures
-        sig_level = "Never"
-
-    # Create base layout for pacman and pacman-key
-    state.root.joinpath("var/lib/pacman").mkdir(mode=0o755, exist_ok=True, parents=True)
-
-    config = state.pkgmngr / "etc/pacman.conf"
-    if config.exists():
-        return
-
-    config.parent.mkdir(mode=0o755, exist_ok=True, parents=True)
-
-    repos = []
-
-    # Testing repositories have to go before regular ones to to take precedence.
-    if not state.config.local_mirror:
-        for repo in ("core-testing", "extra-testing"):
-            if repo in state.config.repositories:
-                repos += [repo]
-
-    repos += ["core"]
-    if not state.config.local_mirror:
-        repos += ["extra"]
-
-    with config.open("w") as f:
-        f.write(
-            dedent(
-                f"""\
-                [options]
-                SigLevel = {sig_level}
-                ParallelDownloads = 5
-                """
-            )
-        )
-
-        for repo in repos:
-            f.write(
-                dedent(
-                    f"""\
-
-                    [{repo}]
-                    {server}
-                    """
-                )
-            )
-
-        if any(state.pkgmngr.joinpath("etc/pacman.d/").glob("*.conf")):
-            f.write(
-                dedent(
-                    f"""\
-
-                    Include = {state.pkgmngr}/etc/pacman.d/*.conf
-                    """
-                )
-            )
-
-
-def invoke_pacman(state: MkosiState, packages: Sequence[str], apivfs: bool = True) -> None:
-    gpgdir = state.pkgmngr / "etc/pacman.d/gnupg/"
-    gpgdir = gpgdir if gpgdir.exists() else Path("/etc/pacman.d/gnupg/")
-
-    cmdline: list[PathString] = [
-        "pacman",
-        "--config", state.pkgmngr / "etc/pacman.conf",
-        "--root", state.root,
-        "--logfile", "/dev/null",
-        "--cachedir", state.cache_dir,
-        "--gpgdir", gpgdir,
-        "--hookdir", state.root / "etc/pacman.d/hooks",
-        "--arch",  state.installer.architecture(state.config.architecture),
-        "--color", "auto",
-        "--noconfirm",
-        "--needed",
-        "-Sy", *sort_packages(packages),
-    ]
-
-    # If we're generating a bootable image, we'll do so with a prebuilt initramfs, so no need for an
-    # initramfs generator.
-    if state.config.bootable != ConfigFeature.disabled:
-        cmdline += ["--assume-installed", "initramfs"]
-
-    bwrap(cmdline,
-          apivfs=state.root if apivfs else None,
-          env=dict(KERNEL_INSTALL_BYPASS="1") | state.config.environment)
diff --git a/mkosi/installer/pacman.py b/mkosi/installer/pacman.py
new file mode 100644 (file)
index 0000000..5dda1d4
--- /dev/null
@@ -0,0 +1,111 @@
+# SPDX-License-Identifier: LGPL-2.1+
+import textwrap
+from collections.abc import Sequence
+from pathlib import Path
+
+from mkosi.architecture import Architecture
+from mkosi.config import ConfigFeature
+from mkosi.run import bwrap
+from mkosi.state import MkosiState
+from mkosi.util import sort_packages
+
+
+def setup_pacman(state: MkosiState) -> None:
+    assert state.config.mirror
+
+    if state.config.local_mirror:
+        server = f"Server = {state.config.local_mirror}"
+    else:
+        if state.config.architecture == Architecture.arm64:
+            server = f"Server = {state.config.mirror}/$arch/$repo"
+        else:
+            server = f"Server = {state.config.mirror}/$repo/os/$arch"
+
+    if state.config.repository_key_check:
+        sig_level = "Required DatabaseOptional"
+    else:
+        # If we are using a single local mirror built on the fly there
+        # will be no signatures
+        sig_level = "Never"
+
+    # Create base layout for pacman and pacman-key
+    state.root.joinpath("var/lib/pacman").mkdir(mode=0o755, exist_ok=True, parents=True)
+
+    config = state.pkgmngr / "etc/pacman.conf"
+    if config.exists():
+        return
+
+    config.parent.mkdir(mode=0o755, exist_ok=True, parents=True)
+
+    repos = []
+
+    # Testing repositories have to go before regular ones to to take precedence.
+    if not state.config.local_mirror:
+        for repo in ("core-testing", "extra-testing"):
+            if repo in state.config.repositories:
+                repos += [repo]
+
+    repos += ["core"]
+    if not state.config.local_mirror:
+        repos += ["extra"]
+
+    with config.open("w") as f:
+        f.write(
+            textwrap.dedent(
+                f"""\
+                [options]
+                SigLevel = {sig_level}
+                ParallelDownloads = 5
+                """
+            )
+        )
+
+        for repo in repos:
+            f.write(
+                textwrap.dedent(
+                    f"""\
+
+                    [{repo}]
+                    {server}
+                    """
+                )
+            )
+
+        if any(state.pkgmngr.joinpath("etc/pacman.d/").glob("*.conf")):
+            f.write(
+                textwrap.dedent(
+                    f"""\
+
+                    Include = {state.pkgmngr}/etc/pacman.d/*.conf
+                    """
+                )
+            )
+
+
+def invoke_pacman(state: MkosiState, packages: Sequence[str], apivfs: bool = True) -> None:
+    gpgdir = state.pkgmngr / "etc/pacman.d/gnupg/"
+    gpgdir = gpgdir if gpgdir.exists() else Path("/etc/pacman.d/gnupg/")
+
+    cmdline = [
+        "pacman",
+        f"--config={state.pkgmngr / 'etc/pacman.conf'}",
+        f"--root={state.root}",
+        "--logfile=/dev/null",
+        f"--cachedir={state.cache_dir}",
+        f"--gpgdir={gpgdir}",
+        f"--hookdir={state.root / 'etc/pacman.d/hooks'}",
+        f"--arch={state.installer.architecture(state.config.architecture)}",
+        "--color", "auto",
+        "--noconfirm",
+        "--needed",
+        "-Sy", *sort_packages(packages),
+    ]
+
+    # If we're generating a bootable image, we'll do so with a prebuilt initramfs, so no need for an
+    # initramfs generator.
+    if state.config.bootable != ConfigFeature.disabled:
+        cmdline += ["--assume-installed", "initramfs"]
+
+    bwrap(cmdline,
+          apivfs=state.root if apivfs else None,
+          env=dict(KERNEL_INSTALL_BYPASS="1") | state.config.environment)