mirror of
https://github.com/xcat2/xcat-dep.git
synced 2026-09-12 12:36:23 +00:00
fix(xcat-dep): verify gate must detect a NATIVE-arch build, not a non-empty index
The prior commit scoped the apt verify gate to '--arch floor UNION present arches', but detected presence with a non-empty binary-<arch>/Packages. That is wrong: every binary-<arch> index carries the Architecture:all debs (grub2-xcat, genesis), so a BUILD_PPC=false run has a non-empty binary-ppc64el index built purely from arch:all debs -- and the gate would still demand the native ppc compiled deps (ipmitool-xcat, conserver-xcat, goconserver) it never built, the exact false-fail the change was meant to remove. Detect a genuine per-arch build via a new pure helper index_has_native_arch(), which is true only when the index has a stanza with Architecture == that arch (not merely Architecture:all). Unit-tested happy + the arch:all-only sad case. Signed-off-by: Daniel Hilst <392820+dhilst@users.noreply.github.com>
This commit is contained in:
@@ -25,6 +25,7 @@ our @EXPORT_OK = qw(
|
||||
sh_quote print_step
|
||||
version_matches required_pkgs read_manifest standard_options
|
||||
verify_repo_packages verify_repo_signature parse_packages_index resolve_present_names
|
||||
index_has_native_arch
|
||||
codename_to_version version_to_codename known_codenames
|
||||
chroot_name chroot_sources_list
|
||||
control_field genesis_deb_control
|
||||
@@ -223,6 +224,21 @@ sub parse_packages_index {
|
||||
return \%map;
|
||||
}
|
||||
|
||||
# index_has_native_arch($packages_text, $arch): true iff the Packages index has at least one stanza
|
||||
# built FOR that arch (Architecture: <arch>), as opposed to only Architecture:all debs (grub2-xcat,
|
||||
# genesis) which EVERY binary-<arch> index carries. This lets the verify gate distinguish "this arch
|
||||
# was actually built" from "this arch's index merely inherited the arch:all debs" -- so a genuine
|
||||
# single-arch run (BUILD_PPC=false: amd64 natives + arch:all only) is not mistaken for a two-arch
|
||||
# repo and made to demand native ppc deps it never built. Pure: text in, boolean out.
|
||||
sub index_has_native_arch {
|
||||
my ($text, $arch) = @_;
|
||||
return 0 unless defined $text && defined $arch && $arch ne '';
|
||||
for my $stanza (split /\n\n+/, $text) {
|
||||
return 1 if $stanza =~ /^Architecture:[ \t]*\Q$arch\E[ \t]*$/m;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
# resolve_present_names(\%parsed, $arch, \@names) -> \%present (name => upstream version | undef)
|
||||
# PURE. Resolves each manifest package NAME to the version actually in the parsed index (\%parsed from
|
||||
# parse_packages_index), reducing to the upstream version so it compares against the manifest's
|
||||
|
||||
+10
-1
@@ -38,6 +38,7 @@ use FindBin qw($RealBin);
|
||||
use lib $RealBin;
|
||||
use BuildUtils qw(sh_quote print_step version_matches required_pkgs read_manifest standard_options
|
||||
verify_repo_packages verify_repo_signature parse_packages_index resolve_present_names
|
||||
index_has_native_arch
|
||||
codename_to_version known_codenames chroot_name chroot_sources_list
|
||||
control_field genesis_deb_control
|
||||
deb_field deb_version deb_upstream_version deb_hash cross_copy_genesis_deb);
|
||||
@@ -651,8 +652,16 @@ sub verify_assembled_repo {
|
||||
# carries, while a genuinely single-arch run (e.g. BUILD_PPC=false, amd64 only) never
|
||||
# false-fails demanding an arch it did not build.
|
||||
my %want = map { $_ => 1 } @{ $arches || [] };
|
||||
# Add an arch iff it published NATIVE debs (a Packages stanza with Architecture == that arch),
|
||||
# NOT merely a non-empty index: every binary-<arch>/Packages carries the Architecture:all debs
|
||||
# (grub2-xcat, genesis), so a non-empty ppc index does NOT imply ppc was built. Native-arch
|
||||
# detection keeps a genuine single-arch run (BUILD_PPC=false) from demanding the ppc section.
|
||||
for my $a (qw(amd64 ppc64el)) {
|
||||
$want{$a} = 1 if -s "$adir/dists/$cn/main/binary-$a/Packages";
|
||||
my $idx = "$adir/dists/$cn/main/binary-$a/Packages";
|
||||
next unless -f $idx;
|
||||
open my $ifh, '<', $idx or next;
|
||||
local $/; my $body = <$ifh>; close $ifh;
|
||||
$want{$a} = 1 if index_has_native_arch($body, $a);
|
||||
}
|
||||
# completeness: manifest (source of truth) vs the PUBLISHED index, per codename x arch.
|
||||
for my $a (sort keys %want) {
|
||||
|
||||
@@ -14,6 +14,7 @@ use File::Path qw(make_path);
|
||||
use File::Basename qw(basename);
|
||||
use BuildUtils qw(required_pkgs version_matches read_manifest standard_options
|
||||
verify_repo_packages verify_repo_signature parse_packages_index resolve_present_names
|
||||
index_has_native_arch
|
||||
codename_to_version version_to_codename known_codenames
|
||||
chroot_name chroot_sources_list
|
||||
control_field genesis_deb_control
|
||||
@@ -332,4 +333,24 @@ SKIP: {
|
||||
like($prob[0], qr/^MISSING xcat-genesis-base\b/, '... and the gate then reports it MISSING');
|
||||
}
|
||||
|
||||
# ---- index_has_native_arch: PURE "was this arch actually built?" (native deb vs arch:all-only) ----
|
||||
# Guards the verify gate against treating an arch:all-only index (grub2-xcat/genesis, which ride into
|
||||
# EVERY binary-<arch>/Packages) as evidence the arch was built -- the BUILD_PPC=false false-fail.
|
||||
{
|
||||
my $native_ppc = "Package: ipmitool-xcat\nVersion: 1.8.18-1\nArchitecture: ppc64el\n\n"
|
||||
. "Package: grub2-xcat\nVersion: 2.12-1\nArchitecture: all\n";
|
||||
ok( index_has_native_arch($native_ppc, 'ppc64el'), 'native ppc64el deb -> ppc64el counts as built');
|
||||
ok(!index_has_native_arch($native_ppc, 'amd64'), 'no native amd64 stanza here -> amd64 not built');
|
||||
|
||||
my $allonly_ppc = "Package: grub2-xcat\nVersion: 2.12-1\nArchitecture: all\n\n"
|
||||
. "Package: xcat-genesis-base-ppc64el\nVersion: 2.19.0\nArchitecture: all\n";
|
||||
ok(!index_has_native_arch($allonly_ppc, 'ppc64el'),
|
||||
'arch:all-only index (grub2/genesis) does NOT count ppc64el as built (BUILD_PPC=false shape)');
|
||||
|
||||
ok( index_has_native_arch("Package: x\nVersion: 1\nArchitecture: amd64\n", 'amd64'),
|
||||
'native amd64 deb -> amd64 counts as built');
|
||||
ok(!index_has_native_arch('', 'amd64'), 'empty index text -> not built');
|
||||
ok(!index_has_native_arch(undef, 'amd64'), 'undef index text -> not built (no crash)');
|
||||
}
|
||||
|
||||
done_testing;
|
||||
|
||||
Reference in New Issue
Block a user