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});
- if (not -r $p) {
- return bless $user, "Debbugs::User";
+ $self->{filename} = usertag_file_from_email($self->{email});
+ if (not -r $self->{filename}) {
+ return $self;
}
- my $uf = IO::File->new($p,'r')
- or die "Unable to open file $p for reading: $!";
+ my $uf = IO::File->new($self->{filename},'r')
+ or die "Unable to open file $self->{filename} for reading: $!";
if ($need_lock) {
flock($uf, LOCK_EX);
- $user->{"locked"} = $uf;
+ $self->{"locked"} = $uf;
}
while(1) {
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;
- my $uf;
+
my $ut = $self->{"tags"};
my $p = $self->{"filename"};
sub read_usertags {
my ($usertags,$email) = @_;
- carp "read_usertags is deprecated";
+# carp "read_usertags is deprecated";
my $user = get_user($email);
- for my $t (keys %{$user->{"tags"}}) {
- $ut->{$t} = [] unless defined $ut->{$t};
- push @{$ut->{$t}}, @{$user->{"tags"}->{$t}};
+ for my $tag (keys %{$user->{"tags"}}) {
+ $usertags->{$tag} = [] unless defined $usertags->{$tag};
+ push @{$usertags->{$tag}}, @{$user->{"tags"}->{$tag}};
}
return $usertags;
}
sub write_usertags {
my ($usertags,$email) = @_;
- carp "write_usertags is deprecated";
+# carp "write_usertags is deprecated";
my $user = Debbugs::User->new($email,1); # locked
- $user->{"tags"} = { %{$ut} };
+ $user->{"tags"} = { %{$usertags} };
$user->write();
}
=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;
1;
__END__
-# -*- cperl-set-style: PerlStyle -*-