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
my $orig = shift;
my $class = shift;
if (@_ == 1 && !ref $_[0]) {
- my @tags = split / /,$_[0];
- my %tags;
- @tags{@tags} = (1) x @tags;
- return $class->$orig(tags => \%tags);
+ return $class->$orig(keywords => $_[0]);
} else {
return $class->$orig(@_);
}
};
+sub BUILD {
+ my $self = shift;
+ my $args = shift;
+ if (exists $args->{keywords}) {
+ my @tags = split /[, ]/,$args->{keywords};
+ return unless @tags;
+ $self->_set_tag(map {($_,1)} @tags);
+ delete $args->{keywords};
+ }
+}
+
has tags => (is => 'ro',
isa => 'HashRef[Str]',
traits => ['Hash'],
lazy => 1,
reader => '_tags',
builder => '_build_tags',
- handles => {has_tags => 'count'}
+ handles => {has_tags => 'count',
+ _set_tag => 'set',
+ unset_tag => 'delete',
+ },
);
has usertags => (is => 'ro',
isa => 'HashRef[Str]',
lazy => 1,
+ traits => ['Hash'],
+ handles => {unset_usertag => 'delete',
+ has_usertags => 'count',
+ },
reader => '_usertags',
builder => '_build_usertags',
);
+sub has_any_tags {
+ my $self = shift;
+ return ($self->has_tags || $self->has_usertags);
+}
+
+has bug => (is => 'ro',
+ isa => 'Debbugs::Bug',
+ required => 1,
+ );
+
+has users => (is => 'ro',
+ isa => 'ArrayRef[Debbugs::User]',
+ default => sub {[]},
+ );
+
sub _build_tags {
return {};
}
sub _build_usertags {
- return {};
+ my $self = shift;
+ local $_;
+ my $t = {};
+ for my $user (@{$self->users}) {
+ for my $tag ($user->tags_on_bug($self->bug->id)) {
+ $t->{$tag} = $user->email;
+ }
+ }
+ return $t;
}
sub is_set {
return exists $_[0]->_usertags->{$_[1]} ? 1 : 0;
}
-sub unset_tag {
- my $self = shift;
- delete $self->_tags->{$_} foreach @_;
-}
-
-sub unset_usertag {
- my $self = shift;
- delete $self->_usertags->{$_} foreach @_;
-}
-
sub set_tag {
my $self = shift;
for my $tag (@_) {
return join($joiner,$self->all_tags);
}
+sub join_usertags {
+ my $self = shift;
+ my $joiner = shift;
+ $joiner //= ', ';
+ return join($joiner,$self->usertags);
+}
+
+sub join_tags {
+ my $self = shift;
+ my $joiner = shift;
+ $joiner //= ', ';
+ return join($joiner,$self->tags);
+}
+
sub all_tags {
return uniq sort $_[0]->tags,$_[0]->usertags;
}
"visible_cats" => [],
"unknown_stanzas" => [],
values => {},
+ bug_tags => {},
email => $email,
};
bless $self, $class;
my %tag = @stanza;
my $t = $tag{"Tag"};
$ut->{$t} = [] unless defined $ut->{$t};
- push @{$ut->{$t}}, split /\s*,\s*/, $tag{Bugs};
+ my @bugs = split /\s*,\s*/, $tag{Bugs};
+ push @{$ut->{$t}}, @bugs;
+ for my $bug (@bugs) {
+ push @{$self->{bug_tags}{$bug}},
+ $t;
+ }
} elsif ($stanza[0] eq "Category") {
my @cat = ();
my %stanza = @stanza;
return $self;
}
+sub email {
+ my $self = shift;
+ return $self->{email};
+}
+
+sub tags {
+ my $self = shift;
+
+ return $self->{"tags"};
+}
+
+sub tags_on_bug {
+ my $self = shift;
+ return map {@{$self->{"bug_tags"}{$_}//[]}} @_;
+}
+
sub write {
my $self = shift;