From cc06d9ad3fdd35582118b87fa1b2be5d5b0de7db Mon Sep 17 00:00:00 2001 From: Don Armstrong Date: Wed, 13 Jun 2018 17:30:08 -0700 Subject: [PATCH] support usertags in Debbugs::Bug and Debbugs::Bug::Tag --- Debbugs/Bug.pm | 9 ++++-- Debbugs/Bug/Tag.pm | 74 ++++++++++++++++++++++++++++++++++++---------- Debbugs/User.pm | 24 ++++++++++++++- 3 files changed, 88 insertions(+), 19 deletions(-) diff --git a/Debbugs/Bug.pm b/Debbugs/Bug.pm index 641881a..4af9b73 100644 --- a/Debbugs/Bug.pm +++ b/Debbugs/Bug.pm @@ -446,13 +446,18 @@ sub _build_archived { 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 diff --git a/Debbugs/Bug/Tag.pm b/Debbugs/Bug/Tag.pm index 7b3df32..a124af9 100644 --- a/Debbugs/Bug/Tag.pm +++ b/Debbugs/Bug/Tag.pm @@ -41,36 +41,74 @@ around BUILDARGS => sub { 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 { @@ -86,16 +124,6 @@ sub usertag_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 (@_) { @@ -123,6 +151,20 @@ sub join_all { 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; } diff --git a/Debbugs/User.pm b/Debbugs/User.pm index 2457e54..3c4cf6a 100644 --- a/Debbugs/User.pm +++ b/Debbugs/User.pm @@ -154,6 +154,7 @@ sub new { "visible_cats" => [], "unknown_stanzas" => [], values => {}, + bug_tags => {}, email => $email, }; bless $self, $class; @@ -176,7 +177,12 @@ sub new { 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; @@ -235,6 +241,22 @@ sub new { 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; -- 2.39.2