From: epg <> Date: Tue, 6 Sep 2005 16:39:45 +0000 (+0000) Subject: (filter_mail): Build and return a hash of all folders to which we add X-Git-Url: https://diplodocus.org/git/minc/commitdiff_plain/1dba30e208f26a65a6882607468a25512d1e75f4 (filter_mail): Build and return a hash of all folders to which we add new messages. (update_folders): New function to write out a new .folders file, so any new folders added in this run are visible to lukem's new(1). (MAIN): Call update_folders with the hash returned by filter_mail. --- diff --git a/minc b/minc index f3ebfcd..f271347 100755 --- a/minc +++ b/minc @@ -33,6 +33,7 @@ use Data::Dumper; use Errno; use Fcntl qw(O_WRONLY O_EXCL O_CREAT); use FileHandle; +use File::Temp qw(tempfile); use File::stat; use Getopt::Long qw(:config gnu_getopt no_ignore_case); use POSIX qw(strftime WEXITSTATUS WIFEXITED); @@ -537,6 +538,7 @@ sub filter_mail { my $spam = 0; my $saved = 0; my $msgnum; + my %folders; # XXX lame names and hard-coded proportions. my $nf = int($COLUMNS * 0.1); @@ -575,6 +577,7 @@ sub filter_mail { defined($mhfolder) or ($mhfolder = find_mh_folder($msg, %headers)); $msgnum = store_message($msg, $mhfolder); + $folders{$mhfolder}++; if ($mhfolder eq 'SPAM') { $spam++; @@ -610,6 +613,41 @@ sub filter_mail { for my $hook (@stop_hooks) { $hook->(\%batons); } + + return %folders; +} + +sub update_folders { + my $folders = shift; + my ($fh, $fn); + + if (not open($fh, "$mh/.folders")) { + warn("open($mh/.folders): $!"); + return; + } + + while (<$fh>) { + chomp; + $folders->{$_}++; + } + + eval { ($fh, $fn) = tempfile("$mh/.folders.XXXXX") }; + if ($@) { + warn("$@"); + return; + } + + for my $folder (sort(keys(%$folders))) { + print($fh "$folder\n"); + } + + if (not close($fh)) { + warn("close($fn): $!"); + unlink($fn) or warn("unlink($fn): $!"); + return; + } + + rename($fn, "$mh/.folders") or warn("rename($fn, $mh/.folders): $!"); } @@ -624,7 +662,7 @@ MAIN: { } chdir("$MAILDIR/new") or die("chdir($MAILDIR/new): $!"); - filter_mail(map { $_->[1] } + my %folders = filter_mail(map { $_->[1] } sort { $a->[0] <=> $b->[0] } map { if (not ($st = stat($_))) { @@ -634,6 +672,8 @@ MAIN: { } getfiles('.')); + update_folders(\%folders); + @SPAM and (exec('scan', '+SPAM', @SPAM) or die); }