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 my $id = $self->bug->id;
113 for my $user (@{$self->users}) {
114 for my $tag ($user->tags_on_bug($id)) {
115 $t->{$tag} = $user->email;
122 return ($_[0]->tag_is_set($_[1]) or
123 $_[0]->usertag_is_set($_[1]));
127 return exists $_[0]->_tags->{$_[1]} ? 1 : 0;
131 return exists $_[0]->_usertags->{$_[1]} ? 1 : 0;
137 if (not $self->valid_tag($tag)) {
138 confess("Invalid tag $tag");
140 $self->_tags->{$tag} = 1;
146 return exists $valid_tags->{$_[1]}?1:0;
151 return $self->join_all(' ');
158 return join($joiner,$self->all_tags);
165 return join($joiner,$self->usertags);
172 return join($joiner,$self->tags);
176 return uniq sort $_[0]->tags,$_[0]->usertags;
180 return sort keys %{$_[0]->_tags}
186 for my $tag ($self->tags) {
187 next unless exists $short_tags->{$tag};
190 short => $short_tags->{$tag},
201 return sort keys %{$_[0]->_usertags}
210 # indent-tabs-mode: nil
211 # cperl-indent-level: 4