X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=Debbugs%2FUser.pm;h=50a09657233ae06e9951d4e7003559b66b445df5;hb=0ce9751d4f117f3bfe4d713cd24a4ae820ab625d;hp=3b90ec4147c3b095729b84733ea19daa732d6fbd;hpb=e814b29f2bfc8e2ed738b9224a0606040fa116ac;p=debbugs.git diff --git a/Debbugs/User.pm b/Debbugs/User.pm index 3b90ec4..50a0965 100644 --- a/Debbugs/User.pm +++ b/Debbugs/User.pm @@ -83,10 +83,10 @@ use warnings; 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; @@ -109,6 +109,23 @@ sub is_valid_user { 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 @@ -137,11 +154,12 @@ sub new { "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; } @@ -159,7 +177,12 @@ sub new { 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; @@ -218,6 +241,27 @@ sub new { 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; @@ -348,22 +392,6 @@ sub write_usertags { =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);