return @result;
}
+my %msgnum_cache;
sub get_highest_msgnum {
my $mhfolder = shift;
my $dir;
my $highest;
my $msgnum;
+ if (defined($msgnum_cache{$mhfolder})) {
+ return $msgnum_cache{$mhfolder}++;
+ }
+
$dir = "$mh/$mhfolder";
if (not opendir(DIR, $dir)) {
die("opendir($dir): $!");
}
}
- return $highest;
+ return $msgnum_cache{$mhfolder} = $highest;
+}
+
+sub mark {
+ my $folder = shift;
+ my $msgnum = shift;
+ my $seq = shift;
+ my $fn = "$mh/$folder/.mh_sequences";
+ my $fh;
+ my @sequences;
+
+ if (not open($fh, $fn)) {
+ $!{ENOENT} or die("open($fn): $!");
+ } else {
+ @sequences = <$fh>;
+ chomp(@sequences);
+ }
+
+ my $marked = 0;
+ open($fh, '>', $fn) or die("open(>$fn): $!");
+ for $_ (@sequences) {
+ if (/^$seq: /) {
+ print($fh "$_ $msgnum\n");
+ $marked = 1;
+ } else {
+ print($fh "$_\n");
+ }
+ }
+ $marked or print($fh "$seq: $msgnum\n");
+ close($fh) or die("close(>$fn): $!");
}
sub store_message {
if ($mhfolder eq 'SPAM') {
push(@SPAM, $msgnum);
} else {
- $status = system('mark', "+$mhfolder", "$msgnum", '-sequence',
- 'unseen', '-add');
- # XXX need to handle signalled and stopped, and print
- # the exit code or signal number.
- if (not WIFEXITED($status)) {
- die("Failed to run mark");
- } elsif (WEXITSTATUS($status) != 0) {
- die("Failed to mark message unseen.");
- }
+ mark($mhfolder, $msgnum, 'unseen');
}
}