install_sandbox_trees(context.config, context.sandbox_tree)
context.config.distribution.installer.setup(context)
- context.config.distribution.installer.keyring(context)
-
with complete_step("Syncing package manager metadata"):
context.config.distribution.installer.package_manager(context.config).sync(
context,
force=context.args.force > 1 or context.config.cacheonly == Cacheonly.never,
)
+
+ context.config.distribution.installer.keyring(context)
+
src = metadata_dir / "cache" / subdir
dst = last.package_cache_dir_or_default() / "cache" / subdir
# SPDX-License-Identifier: LGPL-2.1-or-later
import datetime
-import tempfile
from collections.abc import Iterable
-from pathlib import Path
from mkosi.archive import extract_tar
from mkosi.config import Architecture, Config
@classmethod
def keyring(cls, context: Context) -> None:
if context.config.repository_key_fetch:
- with (
- complete_step(f"Downloading {cls.pretty_name()} keyring"),
- tempfile.TemporaryDirectory() as d,
- ):
- curl(
- context.config,
- "https://archlinux.org/packages/core/any/archlinux-keyring/download",
- output_dir=Path(d),
+ with complete_step(f"Downloading {cls.pretty_name()} keyring"):
+ # We can't override pacman configuration options from the command line so we fall back to
+ # appending to the configuration file instead.
+ config = context.sandbox_tree / "etc/pacman.conf"
+ content = config.read_text()
+ with config.open("a") as f:
+ f.write("\n[options]\n")
+ f.write("SigLevel = Never\n")
+
+ # We can't download a package without a dependencies without listing them in
+ # --assume-installed. Luckily archlinux-keyring only depends on pacman.
+ Pacman.install(
+ context,
+ ["archlinux-keyring"],
+ apivfs=False,
+ options=["--downloadonly", "--assume-installed", "pacman"],
)
+
+ packages = sorted(
+ p
+ for p in (
+ context.config.package_cache_dir_or_default()
+ / "cache"
+ / Pacman.subdir(context.config)
+ / "pkg"
+ ).glob("archlinux-keyring-*.pkg.tar*")
+ if not p.name.endswith(".sig")
+ )
+ if not packages:
+ die("Could not find archlinux-keyring package in cache directory after downloading it")
+
extract_tar(
- next(Path(d).iterdir()),
+ packages[-1],
context.sandbox_tree,
dirs=["usr/share/pacman/keyrings"],
sandbox=context.sandbox,
)
+ # Restore the original configuration file.
+ config.write_text(content)
+
Pacman.keyring(context)
@classmethod
"--ro-bind", context.repository, "/var/cache/pacman/mkosi",
] # fmt: skip
- if any(context.keyring_dir.iterdir()):
+ if context.keyring_dir.exists() and any(context.keyring_dir.iterdir()):
mounts += ["--ro-bind", context.keyring_dir, "/etc/pacman.d/gnupg"]
if (context.root / "var/lib/pacman/local").exists():
*,
apivfs: bool = True,
allow_downgrade: bool = False,
+ options: Sequence[str] = (),
) -> None:
arguments = ["--needed", "--assume-installed", "initramfs"]
if allow_downgrade:
arguments += ["--sysupgrade", "--sysupgrade"]
- arguments += [*packages]
+ arguments += [*options, *packages]
cls.invoke(context, "--sync", arguments, apivfs=apivfs)