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::Bug::Tag;
11 Debbugs::Bug::Tag -- OO interface to bug tags
15 use Debbugs::Bug::Tag;
26 use v5.10; # for state
29 use List::AllUtils qw(uniq);
30 use Debbugs::Config qw(:config);
34 {map {($_,1)} @{$config{tags}}};
37 {%{$config{tags_single_letter}}};
39 extends 'Debbugs::OOBase';
41 around BUILDARGS => sub {
44 if (@_ == 1 && !ref $_[0]) {
45 return $class->$orig(keywords => $_[0]);
47 return $class->$orig(@_);
54 if (exists $args->{keywords}) {
56 if (ref($args->{keywords})) {
57 @tags = @{$args->{keywords}}
59 @tags = split /[, ]/,$args->{keywords};
62 $self->_set_tag(map {($_,1)} @tags);
63 delete $args->{keywords};
67 has tags => (is => 'ro',
68 isa => 'HashRef[Str]',
72 builder => '_build_tags',
73 handles => {has_tags => 'count',
75 unset_tag => 'delete',
78 has usertags => (is => 'ro',
79 isa => 'HashRef[Str]',
82 handles => {unset_usertag => 'delete',
83 has_usertags => 'count',
85 reader => '_usertags',
86 builder => '_build_usertags',
91 return ($self->has_tags || $self->has_usertags);
94 has bug => (is => 'ro',
95 isa => 'Debbugs::Bug',
99 has users => (is => 'ro',
100 isa => 'ArrayRef[Debbugs::User]',
108 sub _build_usertags {
112 for my $user (@{$self->users}) {
113 for my $tag ($user->tags_on_bug($self->bug->id)) {
114 $t->{$tag} = $user->email;
121 return ($_[0]->tag_is_set($_[1]) or
122 $_[0]->usertag_is_set($_[1]));
126 return exists $_[0]->_tags->{$_[1]} ? 1 : 0;
130 return exists $_[0]->_usertags->{$_[1]} ? 1 : 0;
136 if (not $self->valid_tag($tag)) {
137 confess("Invalid tag $tag");
139 $self->_tags->{$tag} = 1;
145 return exists $valid_tags->{$_[1]}?1:0;
150 return $self->join_all(' ');
157 return join($joiner,$self->all_tags);
164 return join($joiner,$self->usertags);
171 return join($joiner,$self->tags);
175 return uniq sort $_[0]->tags,$_[0]->usertags;
179 return sort keys %{$_[0]->_tags}
185 for my $tag ($self->tags) {
186 next unless exists $short_tags->{$tag};
189 short => $short_tags->{$tag},
200 return sort keys %{$_[0]->_usertags}
209 # indent-tabs-mode: nil
210 # cperl-indent-level: 4