X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=Debbugs%2FBug%2FTag.pm;h=a124af9f9710ef0313c050166d845a98fbadaa11;hb=cc06d9ad3fdd35582118b87fa1b2be5d5b0de7db;hp=7b3df32074f8ecf1833094302c86c2265d3e3602;hpb=b12ebdaa6068e5bb808f4ff480d832e970fd3520;p=debbugs.git 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; }