return $status;
}
+has log => (is => 'bare', isa => 'Debbugs::Log',
+ lazy => 1,
+ builder => '_build_log',
+ handles => {_read_record => 'read_record',
+ log_records => 'read_all_records',
+ },
+ );
+
+sub _build_log {
+ my $self = shift;
+ return Debbugs::Log->new(bug_num => $self->id,
+ inner_file => 1,
+ );
+}
+
+has spam => (is => 'bare', isa => 'Debbugs::Log::Spam',
+ lazy => 1,
+ builder => '_build_spam',
+ handles => ['is_spam'],
+ );
+sub _build_spam {
+ my $self = shift;
+ return Debbugs::Log::Spam->new(bug_num => $self->id);
+}
+
has 'package_collection' => (is => 'ro',
isa => 'Debbugs::Collection::Package',
builder => '_build_package_collection',
return $self->mergedwith->count > 0;
}
+has _mergedwith_array =>
+ (is => 'ro',
+ isa => 'ArrayRef[Int]',
+ builder => '_build_mergedwith_array',
+ lazy => 1,
+ );
+
+sub _build_mergedwith_array {
+ my $self = shift;
+ return [sort {$a <=> $b}
+ $self->_split_if_defined('mergedwith')];
+}
+
sub _build_mergedwith {
my $self = shift;
return $self->bug_collection->
- limit(sort {$a <=> $b}
- $self->_split_if_defined('mergedwith'));
+ limit(@{$self->_mergedwith_array//[]});
}
sub _build_pending {
return $_[0]->status->{pending} // '';
return $_[0]->location eq 'archived'?1:0;
}
-has tags => (is => 'ro', isa => 'Object',
+has tags => (is => 'ro',
+ isa => 'Debbugs::Bug::Tag',
clearer => '_clear_tags',
builder => '_build_tags',
lazy => 1,
);
sub _build_tags {
- return Debbugs::Bug::Tag->new($_[0]->status->{keywords});
+ my $self = shift;
+ return Debbugs::Bug::Tag->new(keywords => $self->status->{keywords},
+ bug => $self,
+ users => $self->bug_collection->users,
+ );
}
=item buggy
return 1 if $self->matches($param{exclude});
}
if (exists $param{repeat_merged} and not $param{repeat_merged}) {
- my @merged = sort {$a<=>$b} $self->bug, map {$_->bug} $self->mergedwith->members;
+ my @merged = sort {$a<=>$b} $self->bug, @{$self->_mergedwith_array // []};
return 1 if first {sub {defined $_}}
@{$param{seen_merged}}{@merged};
@{$param{seen_merged}}{@merged} = (1) x @merged;
return 0;
}
+sub email {
+ my $self = shift;
+ return $self->id.'@'.$config{email_domain};
+}
+
+sub subscribe_email {
+ my $self = shift;
+ return $self->id.'-subscribe@'.$config{email_domain};
+}
+
sub url {
my $self = shift;
return $config{web_domain}.'/'.$self->id;
}
+sub mbox_url {
+ my $self = shift;
+ return $config{web_domain}.'/mbox:'.$self->id;
+}
+
+sub mbox_status_url {
+ my $self = shift;
+ return $self->mbox_url.'?mboxstatus=yes';
+}
+
+sub mbox_maint_url {
+ my $self = shift;
+ $self->mbox_url.'?mboxmaint=yes';
+}
+
+sub version_url {
+ my $self = shift;
+ return version_url(package => $self->package,
+ found => [$self->found->members],
+ fixed => [$self->fixed->members],
+ @_,
+ );
+}
+
sub related_packages_and_versions {
my $self = shift;
my @packages;
if (length($self->status->{package}//'')) {
@packages = split /,/,$self->status->{package}//'';
}
+ if (length($self->status->{affects}//'')) {
+ push @packages,
+ split /,/,$self->status->{affects}//'';
+ }
my @versions =
(@{$self->status->{found_versions}//[]},
@{$self->status->{fixed_versions}//[]});
}
}
for my $pkg (@packages) {
- push @return,
- [$pkg,@unqualified_versions];
+ if (@unqualified_versions) {
+ push @return,
+ [$pkg,@unqualified_versions];
+ } else {
+ push @return,$pkg;
+ }
}
return @return;
}