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);
33 {map {($_,1)} @{$config{tags}}};
36 {%{$config{tags_single_letter}}};
38 extends 'Debbugs::OOBase';
40 around BUILDARGS => sub {
43 if (@_ == 1 && !ref $_[0]) {
44 return $class->$orig(keywords => $_[0]);
46 return $class->$orig(@_);
53 if (exists $args->{keywords}) {
54 my @tags = split /[, ]/,$args->{keywords};
56 $self->_set_tag(map {($_,1)} @tags);
57 delete $args->{keywords};
61 has tags => (is => 'ro',
62 isa => 'HashRef[Str]',
66 builder => '_build_tags',
67 handles => {has_tags => 'count',
69 unset_tag => 'delete',
72 has usertags => (is => 'ro',
73 isa => 'HashRef[Str]',
76 handles => {unset_usertag => 'delete',
77 has_usertags => 'count',
79 reader => '_usertags',
80 builder => '_build_usertags',
85 return ($self->has_tags || $self->has_usertags);
88 has bug => (is => 'ro',
89 isa => 'Debbugs::Bug',
93 has users => (is => 'ro',
94 isa => 'ArrayRef[Debbugs::User]',
102 sub _build_usertags {
106 for my $user (@{$self->users}) {
107 for my $tag ($user->tags_on_bug($self->bug->id)) {
108 $t->{$tag} = $user->email;
115 return ($_[0]->tag_is_set($_[1]) or
116 $_[0]->usertag_is_set($_[1]));
120 return exists $_[0]->_tags->{$_[1]} ? 1 : 0;
124 return exists $_[0]->_usertags->{$_[1]} ? 1 : 0;
130 if (not $self->valid_tag($tag)) {
131 confess("Invalid tag $tag");
133 $self->_tags->{$tag} = 1;
139 return exists $valid_tags->{$_[1]}?1:0;
144 return $self->join_all(' ');
151 return join($joiner,$self->all_tags);
158 return join($joiner,$self->usertags);
165 return join($joiner,$self->tags);
169 return uniq sort $_[0]->tags,$_[0]->usertags;
173 return sort keys %{$_[0]->_tags}
179 for my $tag ($self->tags) {
180 next unless exists $short_tags->{$tag};
183 short => $short_tags->{$tag},
194 return sort keys %{$_[0]->_usertags}
203 # indent-tabs-mode: nil
204 # cperl-indent-level: 4