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

This commit is contained in:
Johannes 'josch' Schauer 2020-12-02 00:47:16 +01:00
parent 2ccd025a25
commit 43ca8a5211
Signed by: josch
GPG key ID: F2CBA5C78FBD83E1

View file

@ -1960,7 +1960,8 @@ sub run_download() {
my %ess_pkgs; my %ess_pkgs;
my %ess_pkgs_target; my %ess_pkgs_target;
my %pkgs_to_install_target = %pkgs_to_install; my %pkgs_to_install_target = %pkgs_to_install;
my $num_indices = 0; my $num_suite_matches = 0;
my $num_suite_mismatch = 0;
open( open(
my $pipe_apt, my $pipe_apt,
'-|', '-|',
@ -1972,8 +1973,8 @@ sub run_download() {
) or error "cannot start apt-get indextargets: $!"; ) or error "cannot start apt-get indextargets: $!";
while (my $line = <$pipe_apt>) { while (my $line = <$pipe_apt>) {
chomp $line; chomp $line;
$num_indices++;
my ($codename, $suite, $fname) = split /\t/, $line, 3; my ($codename, $suite, $fname) = split /\t/, $line, 3;
debug "processing indextarget output for $codename $suite $fname";
my $suite_matches = 0; my $suite_matches = 0;
if ( if (
defined $options->{suite} defined $options->{suite}
@ -1981,6 +1982,9 @@ sub run_download() {
($options->{suite} eq $codename or $options->{suite} eq $suite) ($options->{suite} eq $codename or $options->{suite} eq $suite)
) { ) {
$suite_matches = 1; $suite_matches = 1;
$num_suite_matches++;
} else {
$num_suite_mismatch++;
} }
open(my $pipe_cat, '-|', '/usr/lib/apt/apt-helper', 'cat-file', open(my $pipe_cat, '-|', '/usr/lib/apt/apt-helper', 'cat-file',
$fname) $fname)
@ -2076,9 +2080,20 @@ sub run_download() {
close $pipe_apt; close $pipe_apt;
$? == 0 or error "apt-get indextargets failed: $?"; $? == 0 or error "apt-get indextargets failed: $?";
# comparing the size of both arrays is sufficient because items are # We now have two package sets, %pkgs_to_install and
# either only added to one or to both # %pkgs_to_install_target, where the latter was only filled if the
if (defined $options->{suite} and $num_indices > 1) { # 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 if (scalar keys %ess_pkgs_target > 0
and keys %ess_pkgs != %ess_pkgs_target) { and keys %ess_pkgs != %ess_pkgs_target) {
info( "multiple sources defined, using those matching " info( "multiple sources defined, using those matching "