X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=Debbugs%2FPackages.pm;h=5c4d22367d78a7eb66f0156109b9d54969fe0478;hb=aac47876848694f0a4d08cfac76fa50182002081;hp=0a16c04084dc0ca9125b994e7beda5545539023b;hpb=092bf4832d181fe806f5b329a405e2b8b4a58369;p=debbugs.git diff --git a/Debbugs/Packages.pm b/Debbugs/Packages.pm index 0a16c04..5c4d223 100644 --- a/Debbugs/Packages.pm +++ b/Debbugs/Packages.pm @@ -37,7 +37,7 @@ use Fcntl qw(O_RDONLY); use MLDBM qw(DB_File Storable); use Storable qw(dclone); use Params::Validate qw(validate_with :types); -use Debbugs::Common qw(make_list globify_scalar); +use Debbugs::Common qw(make_list globify_scalar sort_versions); use List::Util qw(min max); @@ -223,8 +223,8 @@ sub binary_to_source{ } # avoid autovivification my $bin = $_binarytosource{$binary}; + next unless defined $bin; if (not @versions) { - next unless defined $bin; for my $ver (keys %{$bin}) { for my $ar (keys %{$bin->{$ver}}) { my $src = $bin->{$ver}{$ar}; @@ -269,7 +269,7 @@ sub binary_to_source{ tie %_sourcetobinary, MLDBM => $config{source_binary_map}, O_RDONLY or die "Unable top open $gSourceBinaryMap for reading"; } - for my $maybe_sourcepkg (@binary) { + for my $maybe_sourcepkg (@binaries) { if (exists $_sourcetobinary{$maybe_sourcepkg}) { push @source,[$maybe_sourcepkg,$_] for keys %{$_sourcetobinary{$maybe_sourcepkg}}; } @@ -283,6 +283,9 @@ sub binary_to_source{ if ($param{source_only}) { my %uniq; for my $s (@source) { + # we shouldn't need to do this, but do this temporarily to + # stop the warning. + next unless defined $s->[0]; $uniq{$s->[0]} = 1; } @result = sort keys %uniq; @@ -390,6 +393,11 @@ may change in the future, so if you care, please code accordingly.) =item return_archs -- returns a version=>[archs] hash indicating which architectures are at which versions. +=item largest_source_version_only -- if there is more than one source +version in a particular distribution, discards all versions but the +largest in that distribution. Defaults to 1, as this used to be the +way that the Debian archive worked. + =back When called in scalar context, this function will return hashrefs or @@ -423,6 +431,9 @@ sub get_versions{ return_archs => {type => BOOLEAN, default => 0, }, + largest_source_version_only => {type => BOOLEAN, + default => 1, + }, }, ); my $versions; @@ -444,6 +455,10 @@ sub get_versions{ } my %versions; for my $package (make_list($param{package})) { + my $source_only = 0; + if ($package =~ s/^src://) { + $source_only = 1; + } my $version = $versions->{$package}; next unless defined $version; for my $dist (make_list($param{dist})) { @@ -451,12 +466,18 @@ sub get_versions{ make_list($param{arch}): (grep {not $param{no_source_arch} or $_ ne 'source' - } keys %{$version->{$dist}})) { + } $source_only?'source':keys %{$version->{$dist}})) { next unless defined $version->{$dist}{$arch}; - for my $ver (ref $version->{$dist}{$arch} ? - keys %{$version->{$dist}{$arch}} : - $version->{$dist}{$arch} - ) { + my @vers = ref $version->{$dist}{$arch} eq 'HASH' ? + keys %{$version->{$dist}{$arch}} : + make_list($version->{$dist}{$arch}); + if ($param{largest_source_version_only} and + $arch eq 'source' and @vers > 1) { + # order the versions, then pick the biggest version number + @vers = sort_versions(@vers); + @vers = $vers[-1]; + } + for my $ver (@vers) { my $f_ver = $ver; if ($param{source}) { ($f_ver) = make_source_versions(package => $package, @@ -611,7 +632,7 @@ sub make_source_versions { } my @srcinfo = binary_to_source(binary => $pkg, version => $version, - arch => $arch); + length($arch)?(arch => $arch):()); if (not @srcinfo) { # We don't have explicit information about the # binary-to-source mapping for this version