1 # This module is part of debbugs, and
2 # is released under the terms of the GPL version 2, or any later
3 # version (at your option). See the file README and COPYING for more
5 # Copyright 2018 by Don Armstrong <don@donarmstrong.com>.
7 package Debbugs::Collection::Package;
11 Debbugs::Collection::Package -- Package generation factory
24 use v5.10; # for state
25 use namespace::autoclean;
28 use Debbugs::Common qw(make_list hash_slice);
29 use Debbugs::Config qw(:config);
33 use List::AllUtils qw(part);
35 use Debbugs::Version::Binary;
36 use Debbugs::Collection::Version;
37 use Debbugs::Collection::Correspondent;
38 use Debbugs::VersionTree;
40 extends 'Debbugs::Collection';
42 has '+members' => (isa => 'ArrayRef[Debbugs::Package]');
47 if (exists $args->{packages}) {
49 add($self->_member_constructor(packages =>
54 around add_by_key => sub {
58 $self->_member_constructor(packages => [@_]);
59 return $self->$orig(@members);
62 sub _member_constructor {
63 # handle being called $self->_member_constructor;
67 if ($self->has_schema) {
68 $schema = $self->schema;
71 if (defined $schema) {
73 Debbugs::Package::_get_valid_version_info_from_db(packages => $args{packages},
76 for my $package (keys %{$packages}) {
78 Debbugs::Package->new(%{$packages->{$package}},
80 package_collection => $self->universe,
81 correspondent_collection =>
82 $self->correspondent_collection->universe,
87 for my $package (make_list($args{packages})) {
89 Debbugs::Package->new(name => $package,
90 package_collection => $self->universe,
91 correspondent_collection =>
92 $self->correspondent_collection->universe,
99 sub add_packages_and_versions {
101 $self->add($self->_member_constructor(packages => \@_));
104 # state $common_dists = [@{$config{distributions}}];
105 # sub _get_packages {
107 # my $s = $args{schema};
109 # my %src_ver_packages;
111 # my %bin_ver_packages;
112 # # split packages into src/ver, bin/ver, src, and bin so we can select them
113 # # from the database
115 # for my $pkg (@{$args{packages}}) {
117 # if ($pkg->[0] =~ /^src:(.+)$/) {
118 # for my $ver (@{$pkg}[1..$#{$pkg}]) {
119 # $src_ver_packages{$1}{$ver} = 1;
122 # for my $ver (@{$pkg}[1..$#{$pkg}]) {
123 # $bin_ver_packages{$pkg->[0]}{$ver} = 1;
126 # } elsif ($pkg =~ /^src:(.+)$/) {
127 # $src_packages{$1} = 1;
129 # $bin_packages{$pkg} = 1;
132 # my @src_ver_search;
133 # for my $sp (keys %src_ver_packages) {
134 # push @src_ver_search,
135 # (-and => {'src_pkg.pkg' => $sp,
136 # 'me.ver' => [keys %{$src_ver_packages{$sp}}],
141 # my $src_rs = $s->resultset('SrcVer')->
142 # search({-or => [-and => {'src_pkg.pkg' => [keys %src_packages],
143 # -or => {'suite.codename' => $common_dists,
144 # 'suite.suite_name' => $common_dists,
150 # {join => ['src_pkg',
151 # {'src_associations' => 'suite'},
153 # '+select' => [qw(src_pkg.pkg),
154 # qw(suite.codename),
155 # qw(src_associations.modified),
156 # q(CONCAT(src_pkg.pkg,'/',me.ver))],
157 # '+as' => [qw(src_pkg_name codename modified_time src_pkg_ver)],
158 # result_class => 'DBIx::Class::ResultClass::HashRefInflator',
159 # order_by => {-desc => 'me.ver'}
162 # while (my $pkg = $src_rs->next) {
163 # my $n = 'src:'.$pkg->{src_pkg_name};
164 # if (exists $packages{$n}) {
165 # push @{$packages{$n}{versions}},
166 # $pkg->{src_pkg_ver};
167 # if (defined $pkg->{codename}) {
168 # push @{$packages{$n}{dists}{$pkg->{codename}}},
169 # $#{$packages{$n}{versions}};
173 # {name => $pkg->{src_pkg_name},
176 # versions => [$pkg->{src_pkg_ver}],
177 # dists => {defined $pkg->{codename}?($pkg->{codename} => [1]):()},
188 has 'correspondent_collection' =>
190 isa => 'Debbugs::Collection::Correspondent',
191 default => sub {Debbugs::Collection::Correspondent->new()},
196 isa => 'Debbugs::VersionTree',
198 builder => '_build_versiontree',
201 sub _build_versiontree {
203 return Debbugs::VersionTree->new($self->has_schema?(schema => $self->schema):());
207 sub get_source_versions_distributions {
211 $self->apply(sub {$_->get_source_version_distribution(@_)});
213 Debbugs::Collection::Version->new(versions => \@return,
214 $self->has_schema?(schema => $self->schema):(),
215 package_collection => $self->universe,
219 # given a list of binary versions or src/versions, returns all of the versions
220 # in this package collection which are known to match. You'll have to be sure to
221 # load appropriate versions beforehand for this to actually work.
222 sub get_source_versions {
227 if ($ver =~ m{(<src>.+?)/(?<ver>.+)$/}) {
228 my $sp = $self->get_or_create('src:'.$+{src});
230 $sp->get_source_version($ver);
234 for my $p ($self->members) {
238 $p->get_source_version($ver);
245 if (not $found_valid) {
247 Debbugs::Version::Binary->new(version => $ver,
248 package_collection => $self->universe,
250 $self->has_schema?(schema => $self->schema):(),
256 Debbugs::Collection::Version->new(versions => \@return,
257 $self->has_schema?(schema => $self->schema):(),
258 package_collection => $self->universe,
263 __PACKAGE__->meta->make_immutable;
269 # indent-tabs-mode: nil
270 # cperl-indent-level: 4