fix(generator): enforce stage-bounded distfile sets before curl/import and stage repo minimally

This commit is contained in:
vxtls 2026-03-03 09:01:13 -05:00
parent b1642d63bc
commit d1b466c047

View file

@ -37,14 +37,19 @@ class Generator():
self.repo_path = repo_path self.repo_path = repo_path
self.mirrors = mirrors self.mirrors = mirrors
self.build_guix_also = build_guix_also self.build_guix_also = build_guix_also
self.source_manifest = self.get_source_manifest( self.pre_network_source_manifest = self.get_source_manifest(
stop_before_improve=("get_network" if not self.external_sources else None),
build_guix_also=self.build_guix_also
)
self.early_source_manifest = self.get_source_manifest(
stop_before_improve="get_network", stop_before_improve="get_network",
build_guix_also=self.build_guix_also build_guix_also=False,
) )
self.pre_import_source_manifest = self.get_source_manifest(
stop_before_improve="import_payload",
build_guix_also=False,
)
# Only raw-external mode needs full upfront availability for container generation.
if self.external_sources and not self.repo_path:
self.source_manifest = self.get_source_manifest(build_guix_also=self.build_guix_also)
else:
self.source_manifest = self.pre_network_source_manifest
self.bootstrap_source_manifest = self.source_manifest self.bootstrap_source_manifest = self.source_manifest
self.external_source_manifest = [] self.external_source_manifest = []
self.external_image = None self.external_image = None
@ -81,7 +86,7 @@ class Generator():
# Network-only mode keeps pre-network distfiles inside init image. # Network-only mode keeps pre-network distfiles inside init image.
self.external_dir = os.path.join(self.target_dir, 'external') self.external_dir = os.path.join(self.target_dir, 'external')
self.kernel_bootstrap_mode = "network_only" self.kernel_bootstrap_mode = "network_only"
self.bootstrap_source_manifest = self.early_source_manifest self.bootstrap_source_manifest = self.pre_network_source_manifest
self.external_source_manifest = [] self.external_source_manifest = []
def _prepare_kernel_bootstrap_external_manifests(self): def _prepare_kernel_bootstrap_external_manifests(self):
@ -91,10 +96,7 @@ class Generator():
# Keep the early builder image small: include only sources needed # Keep the early builder image small: include only sources needed
# before improve: import_payload runs, so external.img is the primary # before improve: import_payload runs, so external.img is the primary
# carrier for the remaining distfiles. # carrier for the remaining distfiles.
self.bootstrap_source_manifest = self.get_source_manifest( self.bootstrap_source_manifest = self.pre_import_source_manifest
stop_before_improve="import_payload",
build_guix_also=False
)
full_manifest = self.get_source_manifest(build_guix_also=self.build_guix_also) full_manifest = self.get_source_manifest(build_guix_also=self.build_guix_also)
if self.bootstrap_source_manifest == full_manifest: if self.bootstrap_source_manifest == full_manifest:
@ -107,9 +109,9 @@ class Generator():
Return the exact manifest that is allowed inside init image. Return the exact manifest that is allowed inside init image.
""" """
mode_to_manifest = { mode_to_manifest = {
"network_only": self.early_source_manifest, # up to get_network "network_only": self.pre_network_source_manifest, # up to get_network
"raw_external": self.bootstrap_source_manifest, # up to import_payload "raw_external": self.bootstrap_source_manifest, # up to import_payload
"repo": self.bootstrap_source_manifest, # keep existing behavior "repo": self.pre_network_source_manifest, # up to get_network
} }
manifest = mode_to_manifest.get(self.kernel_bootstrap_mode) manifest = mode_to_manifest.get(self.kernel_bootstrap_mode)
if manifest is None: if manifest is None:
@ -293,13 +295,13 @@ class Generator():
if self.kernel_bootstrap_mode is not None: if self.kernel_bootstrap_mode is not None:
# Kernel bootstrap always copies a bounded manifest, never full distfiles tree. # Kernel bootstrap always copies a bounded manifest, never full distfiles tree.
init_manifest = self._kernel_bootstrap_init_manifest() init_manifest = self._kernel_bootstrap_init_manifest()
self._copy_manifest_distfiles(distfile_dir, init_manifest) init_distfile_dir = os.path.join(self.target_dir, 'external', 'distfiles')
self._copy_manifest_distfiles(init_distfile_dir, init_manifest)
if self.kernel_bootstrap_mode == "repo": if self.kernel_bootstrap_mode == "repo":
# Repo mode also stages the same bounded set for the second ext3 disk. # Repo mode also stages the same bounded set for the second ext3 disk.
staged_distfile_dir = os.path.join(os.path.dirname(self.target_dir), staged_distfile_dir = distfile_dir
'external', 'distfiles') if staged_distfile_dir != init_distfile_dir:
if staged_distfile_dir != distfile_dir:
self._copy_manifest_distfiles(staged_distfile_dir, init_manifest) self._copy_manifest_distfiles(staged_distfile_dir, init_manifest)
return return