use strict;
use Fcntl ':flock';
use vars qw($VERSION $DEBUG %EXPORT_TAGS @EXPORT_OK @EXPORT);
-use base qw(Exporter);
+use Exporter qw(import);
use Debbugs::Config qw(:config);
-use List::Util qw(min);
+use List::AllUtils qw(min);
use Carp;
use IO::File;
return ($u =~ /^[a-zA-Z0-9._+-]+[@][a-z0-9-.]{4,}$/);
}
+=head2 usertag_file_from_email
+
+ my $filename = usertag_file_from_email($email)
+
+Turns an email into the filename where the usertag can be located.
+
+=cut
+
+sub usertag_file_from_email {
+ my ($email) = @_;
+ my $email_length = length($email) % 7;
+ my $escaped_email = $email;
+ $escaped_email =~ s/([^0-9a-zA-Z_+.-])/sprintf("%%%02X", ord($1))/eg;
+ return "$config{usertag_dir}/$email_length/$escaped_email";
+}
+
+
#######################################################################
# The real deal
"visible_cats" => [],
"unknown_stanzas" => [],
values => {},
+ bug_tags => {},
email => $email,
};
bless $self, $class;
- $self->{filename} = _file_from_email($self->{email});
+ $self->{filename} = usertag_file_from_email($self->{email});
if (not -r $self->{filename}) {
return $self;
}
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;
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 has_bug_tags {
+ my $self = shift;
+ return keys %{$self->{bug_tags}} > 0;
+}
+
sub write {
my $self = shift;
=head1 PRIVATE FUNCTIONS
-=head2 _file_from_email
-
- my $filename = _file_from_email($email)
-
-Turns an email into the filename where the usertag can be located.
-
-=cut
-
-sub _file_from_email {
- my ($email) = @_;
- my $email_length = length($email) % 7;
- my $escaped_email = $email;
- $escaped_email =~ s/([^0-9a-zA-Z_+.-])/sprintf("%%%02X", ord($1))/eg;
- return "$config{usertag_dir}/$email_length/$escaped_email";
-}
-
=head2 _read_stanza
my @stanza = _read_stanza($fh);
sub _wrap_to_length {
my ($content,$line_length) = @_;
- my $current_line_length;
+ my $current_line_length = 0;
my $result = "";
while ($content =~ m/^([^,]*,\s*)(.*)$/ || $content =~ m/^([^,]+)()$/) {
my $current_word = $1;