# By configuring Debug::pkgDpkgPm=1, apt-get install will not actually execute any dpkg commands, so
# all it does is download the essential debs and tell us their full in the apt cache without actually
# installing them.
- Apt.invoke(
- context,
- "install",
- [
- "-oDebug::pkgDPkgPm=1",
- # context.sandbox_tree is always mounted writable to /etc so let's use that as a channel to get the
- # list of essential packages out of the sandbox.
- "-oDPkg::Pre-Install-Pkgs::=cat >/etc/apt/essential",
- "?essential",
- "?exact-name(usr-is-merged)",
- "base-files",
- ],
- )
+ with tempfile.NamedTemporaryFile(mode="r") as f:
+ Apt.invoke(
+ context,
+ "install",
+ [
+ "-oDebug::pkgDPkgPm=1",
+ f"-oDPkg::Pre-Install-Pkgs::=cat >{f.name}",
+ "?essential",
+ "?exact-name(usr-is-merged)",
+ "base-files",
+ ],
+ options=["--bind", f.name, f.name],
+ )
- essential = (context.sandbox_tree / "etc/apt/essential").read_text().strip().splitlines()
+ essential = f.read().strip().splitlines()
# Now, extract the debs to the chroot by first extracting the sources tar file out of the deb and
# then extracting the tar file into the chroot.
# SPDX-License-Identifier: LGPL-2.1-or-later
+from collections.abc import Sequence
from contextlib import AbstractContextManager
from pathlib import Path
]
@classmethod
- def sandbox(cls, context: Context, *, apivfs: bool) -> AbstractContextManager[list[PathString]]:
+ def sandbox(
+ cls,
+ context: Context,
+ *,
+ apivfs: bool,
+ options: Sequence[PathString] = (),
+ ) -> AbstractContextManager[list[PathString]]:
return context.sandbox(
binary=cls.executable(context.config),
network=True,
"--bind", context.root, "/buildroot",
*cls.mounts(context),
*cls.options(root=context.root, apivfs=apivfs),
+ *options,
],
)
arguments: Sequence[str] = (),
*,
apivfs: bool = False,
+ options: Sequence[PathString] = (),
stdout: _FILE = None,
) -> CompletedProcess:
return run(
cls.cmd(context) + [operation, *arguments],
- sandbox=cls.sandbox(context, apivfs=apivfs),
+ sandbox=cls.sandbox(context, apivfs=apivfs, options=options),
env=cls.finalize_environment(context),
stdout=stdout,
)