File Coverage

blib/lib/Mail/Box/MH/Labels.pm
Criterion Covered Total %
statement 83 85 97.6
branch 25 34 73.5
condition 3 3 100.0
subroutine 12 12 100.0
pod 6 7 85.7
total 129 141 91.4


line stmt bran cond sub pod time code
1             # This code is part of Perl distribution Mail-Box version 4.01.
2             # The POD got stripped from this file by OODoc version 3.05.
3             # For contributors see file ChangeLog.
4              
5             # This software is copyright (c) 2001-2025 by Mark Overmeer.
6              
7             # This is free software; you can redistribute it and/or modify it under
8             # the same terms as the Perl 5 programming language system itself.
9             # SPDX-License-Identifier: Artistic-1.0-Perl OR GPL-1.0-or-later
10              
11              
12             package Mail::Box::MH::Labels;{
13             our $VERSION = '4.01';
14             }
15              
16 11     11   1553 use parent 'Mail::Reporter';
  11         25  
  11         75  
17              
18 11     11   928 use strict;
  11         25  
  11         423  
19 11     11   57 use warnings;
  11         22  
  11         883  
20              
21 11     11   66 use Log::Report 'mail-box', import => [ qw/__x error fault info/ ];
  11         25  
  11         146  
22              
23 11     11   2346 use Mail::Message::Head::Subset ();
  11         29  
  11         16430  
24              
25             #--------------------
26              
27             #--------------------
28              
29             sub init($)
30 21     21 0 272 { my ($self, $args) = @_;
31 21         134 $self->SUPER::init($args);
32 21 50       165 $self->{MBML_filename} = $args->{filename} or error __x"MH labels require a filename.";
33 21         132 $self;
34             }
35              
36             #--------------------
37              
38 29     29 1 92 sub filename() { $_[0]->{MBML_filename} }
39              
40             #--------------------
41              
42             sub get($)
43 434     434 1 983 { my ($self, $msgnr) = @_;
44 434         3316 $self->{MBML_labels}[$msgnr];
45             }
46              
47              
48             sub read()
49 17     17 1 936 { my $self = shift;
50 17         88 my $seqfn = $self->filename;
51              
52 17 100       1190 open my $seq, '<:raw', $seqfn
53             or return;
54              
55 9         25 my @labels;
56              
57 9         42 local $_;
58 9         350 while(<$seq>)
59 16         75 { s/\s*\#.*$//;
60 16 50       56 length or next;
61              
62 16 50       175 s/^\s*(\w+)\s*\:\s*// or next;
63 16         57 my $label = $1;
64              
65 16         33 my $set = 1;
66 16 100       76 if($label eq 'cur' ) { $label = 'current' }
  1 100       3  
67 2         5 elsif($label eq 'unseen') { $label = 'seen'; $set = 0 }
  2         30  
68              
69 16         65 foreach (split /\s+/)
70 32 100       177 { if( /^(\d+)\-(\d+)\s*$/ )
    50          
71 10         146 { push @{$labels[$_]}, $label, $set foreach $1..$2;
  78         302  
72             }
73             elsif( /^\d+\s*$/ )
74 22         39 { push @{$labels[$_]}, $label, $set;
  22         180  
75             }
76             }
77             }
78 9         128 $seq->close;
79 9         211 $self->{MBML_labels} = \@labels;
80 9         58 $self;
81             }
82              
83              
84             sub write(@)
85 11     11 1 25 { my $self = shift;
86 11         45 my $filename = $self->filename;
87              
88             # Remove when no messages are left.
89 11 50       65 unless(@_)
90 0         0 { unlink $filename;
91 0         0 return $self;
92             }
93              
94 11 50       1847 open my $out, '>:raw', $filename
95             or fault __x"cannot write MH labels file to {file}", file => $filename;
96              
97 11         98 $self->print($out, @_);
98 11 50       591 close $out
99             or fault __x"error while closing MH labels file {file} after write", file => $filename;
100              
101 11         77 $self;
102             }
103              
104              
105             sub append(@)
106 1     1 1 2 { my $self = shift;
107 1         7 my $filename = $self->filename;
108              
109 1 50       68 open my $out, '>>:raw', $filename
110             or fault __x"cannot append to MH labels file {file}", file => $filename;
111              
112 1         9 $self->print($out, @_);
113 1 50       45 close $out
114             or fault __x"error while closing MH labels file {file} after append", file => $filename;
115              
116 1         5 $self;
117             }
118              
119              
120             sub print($@)
121 12     12 1 41 { my ($self, $out) = (shift, shift);
122              
123             # Collect the labels from the selected messages.
124 12         27 my %labeled;
125 12         38 foreach my $message (@_)
126 310         716 { my $labels = $message->labels;
127 310         1371 my $seq = $message->filename =~ s!.*/!!r;
128              
129 10         29 push @{$labeled{unseen}}, $seq
130 310 100       643 unless $labels->{seen};
131              
132 310         597 foreach (keys %$labels)
133 351         1460 { push @{$labeled{$_}}, $seq
134 369 100       749 if $labels->{$_};
135             }
136             }
137 12         54 delete $labeled{seen};
138              
139             # Write it out
140              
141 12         31 local $" = ' ';
142 12         50 foreach (sort keys %labeled)
143             {
144 12         25 my @msgs = @{$labeled{$_}}; #they are ordered already.
  12         48  
145 12 100       42 $_ = 'cur' if $_ eq 'current';
146 12         117 print $out "$_:";
147              
148 12         40 while(@msgs)
149 21         42 { my $start = shift @msgs;
150 21         41 my $end = $start;
151 21   100     188 $end = shift @msgs while @msgs && $msgs[0]==$end+1;
152              
153 21 100       101 print $out ($start==$end ? " $start" : " $start-$end");
154             }
155 12         49 print $out "\n";
156             }
157              
158 12         45 $self;
159             }
160              
161             1;