From 43ca8a521177eb5855b8430a65998179bc68def4 Mon Sep 17 00:00:00 2001 From: Johannes 'josch' Schauer Date: Wed, 2 Dec 2020 00:47:16 +0100 Subject: [PATCH] it is wrong to match the suite for the package set selection if more than one apt index is given (because the suite name might be equal) instead check whether there is more than zero matching and more than zero not-matching suites --- mmdebstrap | 25 ++++++++++++++++++++----- 1 file changed, 20 insertions(+), 5 deletions(-) diff --git a/mmdebstrap b/mmdebstrap index fbbeeff..86f6313 100755 --- a/mmdebstrap +++ b/mmdebstrap @@ -1960,7 +1960,8 @@ sub run_download() { my %ess_pkgs; my %ess_pkgs_target; my %pkgs_to_install_target = %pkgs_to_install; - my $num_indices = 0; + my $num_suite_matches = 0; + my $num_suite_mismatch = 0; open( my $pipe_apt, '-|', @@ -1972,8 +1973,8 @@ sub run_download() { ) or error "cannot start apt-get indextargets: $!"; while (my $line = <$pipe_apt>) { chomp $line; - $num_indices++; my ($codename, $suite, $fname) = split /\t/, $line, 3; + debug "processing indextarget output for $codename $suite $fname"; my $suite_matches = 0; if ( defined $options->{suite} @@ -1981,6 +1982,9 @@ sub run_download() { ($options->{suite} eq $codename or $options->{suite} eq $suite) ) { $suite_matches = 1; + $num_suite_matches++; + } else { + $num_suite_mismatch++; } open(my $pipe_cat, '-|', '/usr/lib/apt/apt-helper', 'cat-file', $fname) @@ -2076,9 +2080,20 @@ sub run_download() { close $pipe_apt; $? == 0 or error "apt-get indextargets failed: $?"; - # comparing the size of both arrays is sufficient because items are - # either only added to one or to both - if (defined $options->{suite} and $num_indices > 1) { + # We now have two package sets, %pkgs_to_install and + # %pkgs_to_install_target, where the latter was only filled if the + # suite matched the codename or the suite name of one of the given + # apt indices. + # We only need to bother with this distinction if one or more of the + # indices matched and one or more of the indices mismatched. If either + # nothing matched or all matched, then we can just use %pkgs_to_install + if ( defined $options->{suite} + and $num_suite_matches > 0 + and $num_suite_mismatch > 0) { + # Now we know that some matched and some didn't. But we only + # replace the results from all indices with the results from those + # indices that matched if the results are actually different and + # if there is more than zero packages from the indices that matched if (scalar keys %ess_pkgs_target > 0 and keys %ess_pkgs != %ess_pkgs_target) { info( "multiple sources defined, using those matching "