X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=Debbugs%2FPackage.pm;h=70f0e35832d828bc290816d039c663746cc4692f;hb=1baf641677a804c01464aa9af8b98d1382fb5dfb;hp=f3cf1056d58ee77b64e8e9f6ad9911ef59bc0a80;hpb=daecace23d15f729a9350f60324308c5bb50a158;p=debbugs.git diff --git a/Debbugs/Package.pm b/Debbugs/Package.pm index f3cf105..70f0e35 100644 --- a/Debbugs/Package.pm +++ b/Debbugs/Package.pm @@ -33,10 +33,35 @@ use Debbugs::Version::Binary; extends 'Debbugs::OOBase'; +=head2 name + +Name of the Package + +=head2 qualified_name + +name if binary, name prefixed with C if source + +=cut + has name => (is => 'ro', isa => 'Str', required => 1, ); +sub qualified_name { + my $self = shift; + return + # src: if source, nothing if binary + ($self->_type eq 'source' ? 'src:':'') . + $self->name; +} + + +=head2 type + +Type of the package; either C or C + +=cut + has type => (is => 'bare', isa => 'Str', lazy => 1, builder => '_build_type', @@ -52,13 +77,11 @@ sub _build_type { } } -sub qualified_name { - my $self = shift; - return - # src: if source, nothing if binary - ($self->_type eq 'source' ? 'src:':'') . - $self->name; -} +=head2 url + +url to the package + +=cut sub url { my $self = shift; @@ -85,6 +108,16 @@ around BUILDARGS => sub { return $class->$orig(%args); }; +=head2 is_source + +true if the package is a source package + +=head2 is_binary + +true if the package is a binary package + +=cut + sub is_source { return $_[0]->_type eq 'source' } @@ -93,6 +126,10 @@ sub is_binary { return $_[0]->_type eq 'binary' } +=head2 valid -- true if the package has any valid versions + +=cut + has valid => (is => 'ro', isa => 'Bool', lazy => 1, builder => '_build_valid', @@ -101,7 +138,7 @@ has valid => (is => 'ro', isa => 'Bool', sub _build_valid { my $self = shift; - if ($self->_valid_versioninfo > 0) { + if ($self->valid_version_info_count> 0) { return 1; } return 0; @@ -114,16 +151,17 @@ has 'valid_version_info' => (is => 'bare', isa => 'ArrayRef', traits => ['Array'], lazy => 1, - builder => '_build_valid_versioninfo', - predicate => '_has_valid_versioninfo', - clearer => '_clear_valid_versioninfo', - handles => {'_get_valid_versioninfo' => 'get', - '_grep_valid_versioninfo' => 'grep', - '_valid_versioninfo' => 'elements', + builder => '_build_valid_version_info', + predicate => '_has_valid_version_info', + clearer => '_clear_valid_version_info', + handles => {'_get_valid_version_info' => 'get', + 'valid_version_info_grep' => 'grep', + '_valid_version_info' => 'elements', + 'valid_version_info_count' => 'count', }, ); -sub _build_valid_versioninfo { +sub _build_valid_version_info { my $self = shift; my $pkgs = $self->_get_valid_version_info_from_db; for my $invalid_version (@{$pkgs->{$self->qualified_name}->{invalid_versions}}) { @@ -191,6 +229,7 @@ sub _get_valid_version_info_from_db { }, ); } + my @src_packages = keys %src_packages; my @bin_ver_search; for my $sp (keys %bin_ver_packages) { @@ -200,6 +239,7 @@ sub _get_valid_version_info_from_db { }, ); } + my @bin_packages = keys %bin_packages; my $packages = {}; sub _default_pkg_info { return {name => $_[0], @@ -234,118 +274,128 @@ sub _get_valid_version_info_from_db { $bp->{$pkg->{bin_pkg}}++; } } - my $src_rs = $s->resultset('SrcVer')-> - search({-or => [-and => {'src_pkg.pkg' => [keys %src_packages], - -or => {'suite.codename' => $common_dists, - 'suite.suite_name' => $common_dists, - }, - }, - @src_ver_search, - ], - }, - {join => ['src_pkg', - {'src_associations' => 'suite'}, - {'bin_vers' => ['bin_pkg','arch']}, - 'maintainer', - ], - 'select' => [qw(src_pkg.pkg), - qw(suite.codename), - qw(suite.suite_name), - qw(src_associations.modified), - qw(me.ver), - q(CONCAT(src_pkg.pkg,'/',me.ver)), - qw(bin_vers.ver bin_pkg.pkg arch.arch), - qw(maintainer.name), - ], - 'as' => [qw(src_pkg codename suite_name), - qw(modified_time src_ver src_pkg_ver), - qw(bin_ver bin_pkg arch maintainer), - ], - result_class => 'DBIx::Class::ResultClass::HashRefInflator', - }, - ); - add_result_to_package($packages,$src_rs, - \%src_ver_packages, - \%bin_ver_packages, - \%src_packages, - \%bin_packages, - ); - my $bin_assoc_rs = - $s->resultset('BinAssociation')-> - search({-and => {'bin_pkg.pkg' => [keys %bin_packages], - -or => {'suite.codename' => $common_dists, - 'suite.suite_name' => $common_dists, - }, - }}, - {join => [{'bin' => - [{'src_ver' => ['src_pkg', - 'maintainer', - ]}, - 'bin_pkg', - 'arch']}, - 'suite', - ], - 'select' => [qw(src_pkg.pkg), - qw(suite.codename), - qw(suite.suite_name), - qw(me.modified), - qw(src_ver.ver), - q(CONCAT(src_pkg.pkg,'/',src_ver.ver)), - qw(bin.ver bin_pkg.pkg arch.arch), - qw(maintainer.name), - ], - 'as' => [qw(src_pkg codename suite_name), - qw(modified_time src_ver src_pkg_ver), - qw(bin_ver bin_pkg arch maintainer), - ], - result_class => 'DBIx::Class::ResultClass::HashRefInflator', - }, - ); - add_result_to_package($packages,$bin_assoc_rs, - \%src_ver_packages, - \%bin_ver_packages, - \%src_packages, - \%bin_packages, - ); - my $bin_rs = $s->resultset('BinVer')-> - search({-or => [@bin_ver_search, - ], - }, - {join => ['bin_pkg', - {'bin_associations' => 'suite'}, - {'src_ver' => ['src_pkg', - 'maintainer', - ]}, - 'arch', - ], - 'select' => [qw(src_pkg.pkg), - qw(suite.codename), - qw(suite.suite_name), - qw(bin_associations.modified), - qw(src_ver.ver), - q(CONCAT(src_pkg.pkg,'/',src_ver.ver)), - qw(me.ver bin_pkg.pkg arch.arch), - qw(maintainer.name), - ], - 'as' => [qw(src_pkg codename suite_name), - qw(modified_time src_ver src_pkg_ver), - qw(bin_ver bin_pkg arch maintainer), - ], - result_class => 'DBIx::Class::ResultClass::HashRefInflator', - }, - ); - add_result_to_package($packages,$bin_rs, - \%src_ver_packages, - \%bin_ver_packages, - \%src_packages, - \%bin_packages, - ); + if (@src_packages) { + my $src_rs = $s->resultset('SrcVer')-> + search({-or => [-and => {'src_pkg.pkg' => [@src_packages], + -or => {'suite.codename' => $common_dists, + 'suite.suite_name' => $common_dists, + }, + }, + @src_ver_search, + ], + }, + {join => ['src_pkg', + { + 'src_associations' => 'suite'}, + { + 'bin_vers' => ['bin_pkg','arch']}, + 'maintainer', + ], + 'select' => [qw(src_pkg.pkg), + qw(suite.codename), + qw(suite.suite_name), + qw(src_associations.modified), + qw(me.ver), + q(CONCAT(src_pkg.pkg,'/',me.ver)), + qw(bin_vers.ver bin_pkg.pkg arch.arch), + qw(maintainer.name), + ], + 'as' => [qw(src_pkg codename suite_name), + qw(modified_time src_ver src_pkg_ver), + qw(bin_ver bin_pkg arch maintainer), + ], + result_class => 'DBIx::Class::ResultClass::HashRefInflator', + }, + ); + add_result_to_package($packages,$src_rs, + \%src_ver_packages, + \%bin_ver_packages, + \%src_packages, + \%bin_packages, + ); + } + if (@bin_packages) { + my $bin_assoc_rs = + $s->resultset('BinAssociation')-> + search({-and => {'bin_pkg.pkg' => [@bin_packages], + -or => {'suite.codename' => $common_dists, + 'suite.suite_name' => $common_dists, + }, + }}, + {join => [{'bin' => + [{'src_ver' => ['src_pkg', + 'maintainer', + ]}, + 'bin_pkg', + 'arch']}, + 'suite', + ], + 'select' => [qw(src_pkg.pkg), + qw(suite.codename), + qw(suite.suite_name), + qw(me.modified), + qw(src_ver.ver), + q(CONCAT(src_pkg.pkg,'/',src_ver.ver)), + qw(bin.ver bin_pkg.pkg arch.arch), + qw(maintainer.name), + ], + 'as' => [qw(src_pkg codename suite_name), + qw(modified_time src_ver src_pkg_ver), + qw(bin_ver bin_pkg arch maintainer), + ], + result_class => 'DBIx::Class::ResultClass::HashRefInflator', + }, + ); + add_result_to_package($packages,$bin_assoc_rs, + \%src_ver_packages, + \%bin_ver_packages, + \%src_packages, + \%bin_packages, + ); + } + if (@bin_ver_search) { + my $bin_rs = $s->resultset('BinVer')-> + search({-or => [@bin_ver_search, + ], + }, + {join => ['bin_pkg', + { + 'bin_associations' => 'suite'}, + {'src_ver' => ['src_pkg', + 'maintainer', + ]}, + 'arch', + ], + 'select' => [qw(src_pkg.pkg), + qw(suite.codename), + qw(suite.suite_name), + qw(bin_associations.modified), + qw(src_ver.ver), + q(CONCAT(src_pkg.pkg,'/',src_ver.ver)), + qw(me.ver bin_pkg.pkg arch.arch), + qw(maintainer.name), + ], + 'as' => [qw(src_pkg codename suite_name), + qw(modified_time src_ver src_pkg_ver), + qw(bin_ver bin_pkg arch maintainer), + ], + result_class => 'DBIx::Class::ResultClass::HashRefInflator', + }, + ); + add_result_to_package($packages,$bin_rs, + \%src_ver_packages, + \%bin_ver_packages, + \%src_packages, + \%bin_packages, + ); + } for my $sp (keys %src_ver_packages) { if (not exists $packages->{'src:'.$sp}) { $packages->{'src:'.$sp} = _default_pkg_info($sp,'source',0); } for my $sv (keys %{$src_ver_packages{$sp}}) { + next if $src_ver_packages{$sp}{$sv} > 0; $packages->{'src:'.$sp}{invalid_versions}{$sv} = 1; } } @@ -355,6 +405,7 @@ sub _get_valid_version_info_from_db { _default_pkg_info($bp,'binary',0); } for my $bv (keys %{$bin_ver_packages{$bp}}) { + next if $bin_ver_packages{$bp}{$bv} > 0; $packages->{$bp}{invalid_versions}{$bv} = 1; } } @@ -384,7 +435,7 @@ sub _build_source_version_to_info { my $self = shift; my $info = {}; my $i = 0; - for my $v ($self->_valid_versioninfo) { + for my $v ($self->_valid_version_info) { push @{$info->{$v->{src_ver}}}, $i; $i++; } @@ -404,7 +455,7 @@ sub _build_binary_version_to_info { my $self = shift; my $info = {}; my $i = 0; - for my $v ($self->_valid_versioninfo) { + for my $v ($self->_valid_version_info) { push @{$info->{$v->{bin_ver}}}, $i; $i++; } @@ -423,8 +474,9 @@ sub _build_dist_to_info { my $self = shift; my $info = {}; my $i = 0; - for my $v ($self->_valid_versioninfo) { - push @{$info->{$v->{dist}}}, $i; + for my $v ($self->_valid_version_info) { + next unless defined $v->{suite_name} and length($v->{suite_name}); + push @{$info->{$v->{suite_name}}}, $i; $i++; } return $info; @@ -452,11 +504,11 @@ has 'binaries' => (is => 'ro', sub _build_binaries { my $self = shift; if ($self->is_binary) { - return $self->package_collection->limit($self); + return $self->package_collection->limit($self->name); } # OK, walk through the valid_versions for this package my @binaries = - uniq map {$_->{bin_pkg}} $self->_valid_versioninfo; + uniq map {$_->{bin_pkg}} $self->_valid_version_info; return $self->package_collection->limit(@binaries); } @@ -469,13 +521,41 @@ has 'sources' => (is => 'ro', sub _build_sources { my $self = shift; + return $self->package_collection->limit($self->source_names); +} + +sub source_names { + my $self = shift; + if ($self->is_source) { - return $self->package_collection->limit($self); + return $self->name } - # OK, walk through the valid_versions for this package - my @sources = - uniq map {'src:'.$_->{src_pkg_name}} $self->_valid_versioninfo; - return $self->package_collection->limit(@sources); + return uniq map {'src:'.$_->{src_pkg}} $self->_valid_version_info; +} + +=head2 maintainers + +L of the maintainer(s) of the current package + +=cut + +has maintainers => (is => 'ro', + isa => 'Debbugs::Collection::Correspondent', + lazy => 1, + builder => '_build_maintainers', + predicate => '_has_maintainers', + ); + +sub _build_maintainers { + my $self = shift; + my @maintainers; + for my $v ($self->_valid_version_info) { + next unless length($v->{suite_name}) and length($v->{maintainer}); + push @maintainers,$v->{maintainer}; + } + @maintainers = + uniq @maintainers; + return $self->correspondent_collection->limit(@maintainers); } has 'versions' => (is => 'bare', @@ -513,7 +593,7 @@ sub get_source_version_distribution { grep {defined $_} $self->_get_dist_to_info($dist); for my $v ($self-> - _get_valid_versioninfo(@ver_loc)) { + _get_valid_version_info(@ver_loc)) { $src_pkg_vers{$v->{src_pkg_ver}} = 1; } } @@ -540,7 +620,7 @@ sub get_source_version { @{$self->_get_binary_version_to_info($ver)//[]}; next unless @ver_loc; my @vers = map {$self-> - _get_valid_versioninfo($_)} + _get_valid_version_info($_)} @ver_loc; for my $v (@vers) { if (keys %archs) { @@ -575,10 +655,10 @@ sub _create_version { push @versions, $v, Debbugs::Version::Source-> - new(package => $self, + new(pkg => $self, version => $v, package_collection => $self->package_collection, - $self->has_schema?(schema => $self->schema):(), + $self->schema_argument, ); } } else { @@ -586,16 +666,22 @@ sub _create_version { push @versions, $v, Debbugs::Version::Binary-> - new(package => $self, + new(pkg => $self, version => $v, package_collection => $self->package_collection, - $self->has_schema?(schema => $self->schema):(), + $self->schema_argument, ); } } $self->_set_version(@versions); } +=head2 package_collection + +L to get additional packages required + +=cut + # gets used to retrieve packages has 'package_collection' => (is => 'ro', isa => 'Debbugs::Collection::Package', @@ -605,7 +691,24 @@ has 'package_collection' => (is => 'ro', sub _build_package_collection { my $self = shift; - return Debbugs::Collection::Package->new($self->has_schema?(schema => $self->schema):()); + return Debbugs::Collection::Package->new($self->schema_argument) +} + +=head2 correspondent_collection + +L to get additional maintainers required + +=cut + +has 'correspondent_collection' => (is => 'ro', + isa => 'Debbugs::Collection::Correspondent', + builder => '_build_correspondent_collection', + lazy => 1, + ); + +sub _build_correspondent_collection { + my $self = shift; + return Debbugs::Collection::Correspondent->new($self->schema_argument) } sub CARP_TRACE {