from collections.abc import Sequence
from mkosi.architecture import Architecture
+from mkosi.config import ConfigFeature
from mkosi.distributions import Distribution, DistributionInstaller, PackageType
from mkosi.installer.pacman import invoke_pacman, setup_pacman
from mkosi.log import die
@classmethod
def install_packages(cls, state: MkosiState, packages: Sequence[str], apivfs: bool = True) -> None:
- invoke_pacman(state, packages, apivfs=apivfs)
+ options = ["--refresh", "--needed"]
+
+ # 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:
+ options += ["--assume-installed", "initramfs"]
+
+ invoke_pacman(state, "--sync", options, packages, apivfs=apivfs)
+
+ @classmethod
+ def remove_packages(cls, state: MkosiState, packages: Sequence[str]) -> None:
+ invoke_pacman(state, "--remove", ["--nosave", "--recursive"], packages)
@staticmethod
def architecture(arch: Architecture) -> str:
from pathlib import Path
from mkosi.architecture import Architecture
-from mkosi.config import ConfigFeature
from mkosi.run import apivfs_cmd, bwrap
from mkosi.state import MkosiState
from mkosi.types import PathString
with umask(~0o755):
(state.cache_dir / "pacman/pkg").mkdir(parents=True, exist_ok=True)
- cmdline: list[PathString] = [
+ return [
"pacman",
"--config", state.pkgmngr / "etc/pacman.conf",
"--root", state.root,
"--arch", state.config.distribution.architecture(state.config.architecture),
"--color", "auto",
"--noconfirm",
- "--needed",
]
- # 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"]
- return cmdline
-
-
-def invoke_pacman(state: MkosiState, packages: Sequence[str], apivfs: bool = True) -> None:
+def invoke_pacman(
+ state: MkosiState,
+ operation: str,
+ options: Sequence[str] = (),
+ packages: Sequence[str] = (),
+ apivfs: bool = True,
+) -> None:
cmd = apivfs_cmd(state.root) if apivfs else []
- bwrap(cmd + pacman_cmd(state) + ["-Sy", *sort_packages(packages)],
+ bwrap(cmd + pacman_cmd(state) + [operation, *options, *sort_packages(packages)],
network=True, env=state.config.environment)