From 880c654c43620eb872fba30cea3f7a303eb4d613 Mon Sep 17 00:00:00 2001 From: mxmehl Date: Fri, 28 Jul 2017 17:12:21 +0200 Subject: [PATCH] add debugging and dynamic date ranges to improve speed of finding and tagging mails --- astroid/poll.sh | 2 +- astroid/scripts/move-tag.sh | 40 ++++++++++++++++++++++++++++++++++--- 2 files changed, 38 insertions(+), 4 deletions(-) diff --git a/astroid/poll.sh b/astroid/poll.sh index 8346773..4e20a14 100755 --- a/astroid/poll.sh +++ b/astroid/poll.sh @@ -7,7 +7,7 @@ source "$TMP" # Move selectedly tagged mails to folders if they are only in INBOX echo "[DEBUG] Move tagged mails in INBOX to folders" -bash $CURDIR/scripts/move-tag.sh +bash $CURDIR/scripts/move-tag.sh ${var_conn} # If offline mode, do a quick sync if [ "$var_conn" == "off" ]; then diff --git a/astroid/scripts/move-tag.sh b/astroid/scripts/move-tag.sh index 518acb6..416bf87 100755 --- a/astroid/scripts/move-tag.sh +++ b/astroid/scripts/move-tag.sh @@ -5,6 +5,8 @@ CURDIR=$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd ) +DEBUG=false # use 'true' to echo verbose debug messages + CSV="$CURDIR"/tag-list.csv # Table of tags/folders MAILDIR="$HOME/Mails/FSFE" # Maildir TRASHTAG="del" # Tag of trashed mails @@ -17,10 +19,13 @@ LOG="$CURDIR"/move-tag.log # Location of logfile USETAGS=".+" # List of tags which shall be moved THREADTAGS=".+" # List of tags for which single, but connected messages in INBOX shall be tagged -BL_USETAGS="" -BL_THREADTAGS="$TRASHTAG|$SPAMTAG|$ARCHTAG|draft" +BL_USETAGS="" # Tags which are *not* considered to be moved +BL_THREADTAGS="$TRASHTAG|$SPAMTAG|$ARCHTAG|draft" # Tags for which their whole thread will not be tagged if they are still in INBOX + touch "$LOG" # Create logfile or update time stamp +LASTRUN="$CURDIR"/move-tag-lastrun.log # file where the date of the last successful run of this script is saved +var_conn=$1 # supposed to be "on" or "off" function pdate { DATE=$(date +%y-%m-%d_%H:%M:%S) @@ -33,6 +38,21 @@ function logrun { eval "$@" 2>> "$LOG" } +function debugmsg { + if ${DEBUG}; then + echo "$(pdate) $@" + fi +} + +# Set date until when files are searched for, depending on current connection status +if [ "${var_conn}" == "off" ]; then + DATELIMIT=$(date -d "$(cat ${LASTRUN}) - 1 days" +%Y-%m-%d) + logrun echo "Datelimit for search set to $DATELIMIT" +else + DATELIMIT=$(date -d "$(cat ${LASTRUN}) - 1 weeks" +%Y-%m-%d) + logrun echo "Datelimit for search set to $DATELIMIT" +fi + while read line; do TAG=$(echo $line | cut -d";" -f1) FOL=$(echo $line | cut -d";" -f2) @@ -42,16 +62,19 @@ while read line; do # TRASH tag "del" if [ "$TAG" = "$TRASHTAG" ]; then + debugmsg "search trash tagged mails" HITFILES=$(notmuch search --output=files --exclude=false tag:$TRASHTAG and not path:$TRASHFOL/**) # Files which are tagged with "del" but not in Trash bin FOL="$TRASHFOL" # Set destination folder to Trash # SPAM tag "spam" elif [ "$TAG" = "$SPAMTAG" ]; then + debugmsg "search spam tagged mails" HITFILES=$(notmuch search --output=files --exclude=false tag:$SPAMTAG and not path:$SPAMFOL/**) # Files which are tagged with "spam" but not in Spam folder FOL="$SPAMFOL" # Set destination folder to INBOX.Junk # ARCHIVE tag "archive" elif [ "$TAG" = "$ARCHTAG" ]; then + debugmsg "search archive tagged mails" HITFILES=$(notmuch search --output=files --exclude=false tag:$ARCHTAG and not path:$ARCHFOL/**) # Files which are tagged with "archive" but not in ARCHIVE folder # Folder will be derived from the current position later @@ -62,9 +85,11 @@ while read line; do # If one file is tagged (except del, spam, archive), also tag the other mails of its thread respectively, IF they are located in INBOX [TODO: is this the best approach?]. Only then they can be moved by this script # 1. Get thread ids of all entries with the searched tag - THREADS=$(notmuch search --exclude=false tag:$TAG and date:$(date -d "-6 weeks" +%Y-%m-%d)..$(date -d "+1 year" +%Y-%m-%d) | cut -d" " -f1 | cut -d":" -f2) + debugmsg "search for all threads tagged with $TAG" + THREADS=$(notmuch search --exclude=false tag:$TAG and date:$DATELIMIT..$(date -d "+1 year" +%Y-%m-%d) | cut -d" " -f1 | cut -d":" -f2) # 2. Get message ids of all messages in these threads + debugmsg "search for all IDs of these threads" MID= for t in $THREADS; do MID="$MID "$(notmuch search --output=messages --exclude=false thread:$t) @@ -72,19 +97,23 @@ while read line; do done # 3. Tag all message ids of messages which are still in INBOX + debugmsg "tag all these IDs if they are in INBOX:" $(echo "$MID" | wc -w) "files" for m in $MID; do if $(notmuch search --exclude=false --output=files "$m" | grep -q "$MAILDIR/INBOX/"); then + debugmsg "tag $m with $TAG" logrun notmuch tag +"$TAG" -- "$m" fi done # Search for these lone messages in INBOX + debugmsg "search for these messages which are still in INBOX" HITFILES=$(notmuch search --output=files --exclude=false path:INBOX/** and tag:$TAG | grep "$MAILDIR/INBOX/") fi fi # Move files to their destination folders + debugmsg "move the files of tag $TAG" for m in $HITFILES; do # Destination folder is derived from the current location @@ -99,5 +128,10 @@ while read line; do logrun mv "$m" "$DESTFOL" done fi + + debugmsg "Tag $TAG finished" + debugmsg "" done < "$CSV" + +echo $(date +%Y-%m-%d) > ${LASTRUN}