jaromail

a commandline tool to easily and privately handle your e-mail
git clone git://parazyd.org/jaromail.git
Log | Files | Refs | Submodules | README

commit d021cdc5828a71e5cddd818cb86a2b3f3b5d4fba
parent 11971daa8f94ee17732277ac9500b0dae572a337
Author: Jaromil <jaromil@dyne.org>
Date:   Tue, 28 Aug 2012 03:00:33 +0200

fixes and cleanups to maildir operations: merge and filter

Diffstat:
Msrc/zlibs/maildirs | 130+++++++++++++++++++++++++++++++++++++++++++++++++++++++------------------------
1 file changed, 91 insertions(+), 39 deletions(-)

diff --git a/src/zlibs/maildirs b/src/zlibs/maildirs @@ -25,13 +25,13 @@ # returns 0 (success) if yes # no in all other cases maildircheck() { - { test -r $1 } || { + { test -r "$1" } || { error "Maildir not existing: $1" return 1 } - { test -w $1 } || { + { test -w "$1" } || { error "Directory not writable: $1" return 1 } - { test -r $1/cur } \ + { test -r "$1/cur" } \ && { return 0 } # Yes is a maildir # shortened test to speedup # && { test -r $1/new } \ @@ -42,15 +42,13 @@ maildircheck() { maildirmake() { - if [ -z $1 ]; then + { test -z "$1" } && { error "internal error: missing argument for maildirmake" - return - fi + return } - if [ -r $1 ]; then - func "maildir exists: $1" - return - fi + { test -r "$1" } && { + func "directory exists: $1" + return } ${=mkdir} ${1}/cur ${=mkdir} ${1}/new @@ -83,39 +81,81 @@ list_maildirs() { rmdupes() { tmp=$TMPDIR/$datestamp.rmdupes.$RANDOM newlock $tmp - for folder in ${=PARAM}; do - { test ! -r $folder } && { folder=$MAILDIRS/$folder } - { test ! -r $folder } && { error "Maildir not found: $folder"; continue } - notice "Removing duplicates in $folder" + for folder in ${=@}; do + { test -r "$folder" } || { folder=$MAILDIRS/$folder } + { test -r "$folder" } || { + error "Directory not found: $folder" + continue } + + maildircheck ${folder} + { test $? = 0 } || { + error "Not a maildir folder: $folder" + continue } + + notice "Checking for duplicates in $folder" c=0 for i in `find ${folder} -type f`; do - # 5MB should be enough ehre? - formail -D 5000000 $tmp <$i \ + # 128MB should be enough ehre? + formail -D 128000000 $tmp <$i \ && rm $i && c=`expr $c + 1` done done unlink $tmp - notice "$c duplicates found and deleted" + + if [ "$c" = "0" ]; then + act "No duplicates found" + else + act "$c duplicates found and deleted" + fi } merge() { src=${PARAM[1]} dst=${PARAM[2]} - if ! [ -r ${src}/cur ]; then - error "No source maildir found in $src" - return 1 - fi - if ! [ -r ${dst}/cur ]; then - error "No destination maildir found in $dst" - return 1 - fi + + { test "$src" = "$dst" } && { + error "Cannot merge same directory in itself: $src = $dst" + return 1 } + + maildircheck $src + { test $? = 0 } || { + error "Source is not a maildir: $src" + return 1 } + + maildircheck $dst + { test $? = 0 } || { + error "Destination is not a maildir: $dst" + return 1 } + notice "Merging maildir ${src} into ${dst}" c=0 - for i in `find ${src}/cur -type f`; do mv $i ${dst}/cur/; c=$(($c + 1)); done - for i in `find ${src}/new -type f`; do mv $i ${dst}/new/; c=$(($c + 1)); done - for i in `find ${src}/tmp -type f`; do mv $i ${src}/tmp/; c=$(($c + 1)); done - act "$c mails succesfully moved." - notice "Operation completed, you can now safely remove ${src}" + for i in `find ${src}/cur -type f`; do + mv $i ${dst}/cur/; c=$(($c + 1)) + { test $? = 0 } || { + error "error moving file: $i" + error "merge aborted." + return 1 } + done + for i in `find ${src}/new -type f`; do + mv $i ${dst}/new/; c=$(($c + 1)) + { test $? = 0 } || { + error "error moving file: $i" + error "merge aborted." + return 1 } + done + for i in `find ${src}/tmp -type f`; do + mv $i ${dst}/tmp/; c=$(($c + 1)) + { test $? = 0 } || { + error "error moving file: $i" + error "merge aborted." + return 1 } + done + notice "$c mails succesfully moved" + act "Removing source directory ${src}" + ${=rm} -r ${src} + act "Purging duplicates in destination" + rmdupes ${dst} + act "Done. All mails merged into ${dst}" } # re-sort all maildir through the procmail filters @@ -139,21 +179,33 @@ filter() { cp -r $PROCMAILDIR $TMPDIR/$pdir prc=$TMPDIR/$pdir/rc } - + + typeset -al fall + for folder in ${=PARAM}; do - typeset -al fall - { test ! -r $folder } && { folder=$MAILDIRS/$folder } - { test ! -r $folder } && { error "Maildir not found: $folder"; return 1 } + { test -r "$folder" } || { folder=$MAILDIRS/$folder } + { test -r "$folder" } || { + error "Directory not found: $folder" + continue } + + maildircheck ${folder} + { test $? = 0 } || { + error "Not a maildir folder: $folder" + continue } + notice "Filtering folder $folder" # first index current state for m in `find $folder -type f`; do fall+=($m); done - # then process it, this way ignoring new mails send to same folder - for n in ${=fall}; do - cat $n | procmail -m $prc - done - unset fall done + # then process it, this way ignoring new mails send to same folder + act "Please wait while filtering ${#fall} maildirs..." + for n in ${=fall}; do + cat $n | procmail -m $prc + done + notice "Done filtering" + unset fall + total=`mailstat -k $WORKDIR/log/procmail.log | tail -n1 | awk '{print $2}'` briefing=`mailstat -kt $WORKDIR/log/procmail.log |awk '!/procmail/ { print " " $2 "\t" $3 }'|sort -nr` echo "${briefing}"