]> diplodocus.org Git - minc/commitdiff
(filter_mail): Build and return a hash of all folders to which we add
authorepg <>
Tue, 6 Sep 2005 16:39:45 +0000 (16:39 +0000)
committerepg <>
Tue, 6 Sep 2005 16:39:45 +0000 (16:39 +0000)
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.

minc

diff --git a/minc b/minc
index f3ebfcd..f271347 100755 (executable)
--- 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): $!");
 }
 
 \f
@@ -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);
 }