X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=Debbugs%2FPackages.pm;h=877466f91d2b4ce7f64c489546b0c34b79344a74;hb=ff088d8cd98186cdfa55c7117c88cadddd5f6f04;hp=62d26827ab10e037df67d27e4e2c8e71493c0c75;hpb=71c5c6083a3aa5342e37c824955e5adf12a63ded;p=debbugs.git diff --git a/Debbugs/Packages.pm b/Debbugs/Packages.pm index 62d2682..877466f 100644 --- a/Debbugs/Packages.pm +++ b/Debbugs/Packages.pm @@ -12,7 +12,7 @@ package Debbugs::Packages; use warnings; use strict; -use base qw(Exporter); +use Exporter qw(import); use vars qw($VERSION @EXPORT_OK %EXPORT_TAGS @EXPORT); use Carp; @@ -39,7 +39,7 @@ use Storable qw(dclone); use Params::Validate qw(validate_with :types); use Debbugs::Common qw(make_list globify_scalar sort_versions); -use List::Util qw(min max); +use List::AllUtils qw(min max); use IO::File; @@ -72,13 +72,14 @@ our $_pkgcomponent; our $_srcpkg; sub getpkgsrc { return $_pkgsrc if $_pkgsrc; - return {} unless defined $Debbugs::Packages::gPackageSource; + return {} unless defined $config{package_source} and + length $config{package_source}; my %pkgsrc; my %pkgcomponent; my %srcpkg; my $fh = IO::File->new($config{package_source},'r') - or die("Unable to open $config{package_source} for reading: $!"); + or croak("Unable to open $config{package_source} for reading: $!"); while(<$fh>) { next unless m/^(\S+)\s+(\S+)\s+(\S.*\S)\s*$/; my ($bin,$cmp,$src)=($1,$2,$3); @@ -186,12 +187,15 @@ sub binary_to_source{ cache => {type => HASHREF, default => {}, }, + schema => {type => OBJECT, + optional => 1, + }, }, ); # TODO: This gets hit a lot, especially from buggyversion() - probably # need an extra cache for speed here. - return () unless defined $gBinarySourceMap; + return () unless defined $gBinarySourceMap or defined $param{schema}; if ($param{scalar_only} or not wantarray) { $param{source_only} = 1; @@ -203,6 +207,59 @@ sub binary_to_source{ my @versions = grep {defined $_} make_list(exists $param{version}?$param{version}:[]); my @archs = grep {defined $_} make_list(exists $param{arch}?$param{arch}:[]); return () unless @binaries; + + # any src:foo is source package foo with unspecified version + @source = map {/^src:(.+)$/? + [$1,'']:()} @binaries; + @binaries = grep {$_ !~ /^src:/} @binaries; + if ($param{schema}) { + if ($param{source_only}) { + @source = map {$_->[0]} @source; + my $src_rs = $param{schema}->resultset('SrcPkg')-> + search_rs({'binpkg.pkg' => [@binaries], + @versions?('bin_vers.ver' => [@versions]):(), + @archs?('arch.arch' => [@archs]):(), + }, + {join => {'src_vers'=> + {'bin_vers'=> ['arch','bin_pkg']} + }, + distinct => 1, + }, + ); + push @source, + map {$_->pkg} $src_rs->all; + if ($param{scalar_only}) { + return join(',',@source); + } + return @source; + + } + my $src_rs = $param{schema}->resultset('SrcVer')-> + search_rs({'bin_pkg.pkg' => [@binaries], + @versions?('bin_vers.ver' => [@versions]):(), + @archs?('arch.arch' => [@archs]):(), + }, + {join => ['src_pkg', + {'bin_vers' => ['arch','binpkg']}, + ], + distinct => 1, + }, + ); + push @source, + map {[$_->get_column('src_pkg.pkg'), + $_->get_column('src_ver.ver'), + ]} $src_rs->all; + if (not @source and not @versions and not @archs) { + $src_rs = $param{schema}->resultset('SrcPkg')-> + search_rs({pkg => [@binaries]}, + {distinct => 1}, + ); + push @source, + map {[$_->pkg, + ]} $src_rs->all; + } + return @source; + } my $cache_key = join("\1", join("\0",@binaries), join("\0",@versions), @@ -213,10 +270,6 @@ sub binary_to_source{ @{$param{cache}{$cache_key}}; } for my $binary (@binaries) { - if ($binary =~ m/^src:(.+)$/) { - push @source,[$1,'']; - next; - } if (not tied %_binarytosource) { tie %_binarytosource, MLDBM => $config{binary_source_map}, O_RDONLY or die "Unable to open $config{binary_source_map} for reading"; @@ -234,7 +287,6 @@ sub binary_to_source{ } } else { - my $found_one_version = 0; for my $version (@versions) { next unless exists $bin->{$version}; if (exists $bin->{$version}{all}) { @@ -530,7 +582,6 @@ sub makesourceversions { arch => 'source', versions => '0.1.1', guess_source => 1, - debug => \$debug, warnings => \$warnings, ); @@ -573,7 +624,6 @@ sub make_source_versions { }, ); my ($warnings) = globify_scalar(exists $param{warnings}?$param{warnings}:undef); - my ($debug) = globify_scalar(exists $param{debug} ?$param{debug} :undef); my @packages = grep {defined $_ and length $_ } make_list($param{package}); my @archs = grep {defined $_ } make_list ($param{arch});