commit c1567f801455c137acdd24a1c3f816eb9fa58c8f
parent 938f43a2d04f3806ac8f539594dd1bd6197c3449
Author: Jaromil <jaromil@dyne.org>
Date: Sun, 4 Jan 2015 11:41:57 +0100
reorganized extract_mails functions
Diffstat:
M | src/zlibs/addressbook | | | 117 | ++++++++++++++++++++++++++++++++++++++++--------------------------------------- |
M | src/zlibs/search | | | 122 | +++++++++++++++++++++++++++++++++++++++---------------------------------------- |
2 files changed, 119 insertions(+), 120 deletions(-)
diff --git a/src/zlibs/addressbook b/src/zlibs/addressbook
@@ -222,67 +222,63 @@ forget() {
# remove_address "${head[(ws:,:)1]}"
}
+# extract all addresses found in a list of email files from stdin
+extract_mails() {
+ _mails=`cat`
+ # we switch dryrun temporarily off to use learn()
+ # without modifying the addressbook
+ _dryrun=$DRYRUN
+ DRYRUN=1
+
+ # learn from senders, recipients or all
+ _action="$1"
+
+ typeset -a learned
+ for m in ${(f)_mails}; do
+ _l=`hdr $m | learn $_action`
+ # handles results on multiple lines (recipients, all)
+ for ii in ${(f)_l}; do
+ learned+=("$ii")
+ done
+ done
+
+ DRYRUN=$_dryrun
+ # eliminates duplicates
+ typeset -A result
+ for i in ${learned}; do
+ _e=${i[(ws:,:)1]}
+ [[ "${result[$_e]}" = "" ]] && {
+ _n=${i[(ws:,:)2]}
+ result+=("$_e" "$_n")
+ print - "$_n <$_e>"
+ }
+ done
+ notice "${#result} addresses extracted"
+}
+
# extract all addresses found into a maildir
extract_maildir() {
## first arg is a directory
md="$1"
func "extract maildir: $md"
## extract from a maildir
- maildircheck "$md" && {
- _action="$2"
- case $_action in
- all) ;;
- recipient) ;;
- sender) ;;
- *) _action="all" ;;
- esac
-
- # search files
- _mails=`find $md -type f`
- # search symlinks
- _mails+=`find $md -type l`
-
- # TODO ismailfile() to check if file is a mail?
-
- # we switch dryrun temporarily off to use learn()
- # without modifying the addressbook
- _dryrun=$DRYRUN
- DRYRUN=1
-
- notice "Extracting and listing $_action in maildir: $md"
- act "please wait while scanning `print $_mails | wc -l` mail files..."
- typeset -a learned
-
- for i in ${(f)_mails}; do
- _l=`hdr $i | learn $_action`
- # handles results on multiple lines (recipients, all)
- for ii in ${(f)_l}; do
- learned+=("$ii")
- done
- done
-
- DRYRUN=$_dryrun
- # eliminates duplicates
- typeset -A result
- for i in ${learned}; do
- _e=${i[(ws:,:)1]}
- [[ "${result[$_e]}" = "" ]] && {
- _n=${i[(ws:,:)2]}
- result+=("$_e" "$_n")
- print - "$_n <$_e>"
- }
- done
- notice "Unique $_action found: ${#result}"
- # counts which addresses are known to us
- _known=0
- for i in ${(k)result}; do
- lookup_email ${i}
- [[ $? = 0 ]] && {
- _known=$(( $_known + 1 )) }
- done
- act "addresses known: $_known"
- return 0
- }
+ maildircheck "$md" || return 1
+
+ _action="$2"
+ case $_action in
+ all) ;;
+ recipient) ;;
+ sender) ;;
+ *) _action="all" ;;
+ esac
+
+ # search files
+ _mails=`find $md -type f`
+ # search symlinks
+ _mails+=`find $md -type l`
+
+ print - ${_mails} | extract_mails "$_action"
+ return 0
}
# extract all entries in addressbook or all addresses in a pgp keyring
@@ -389,9 +385,14 @@ extract() {
}
func "extract from search query"
- # args are simply strings, then run a search and extract addresses
- nm_search ${=PARAM}
- extract_maildir "$MAILDIRS"/cache/notmuch/results all
+
+ # we switch dryrun temporarily off to use learn()
+ # without modifying the addressbook
+ _dryrun=$DRYRUN
+ DRYRUN=1
+
+ # run a search and list email files
+ nm_search ${=PARAM} | extract_mails
}
diff --git a/src/zlibs/search b/src/zlibs/search
@@ -43,7 +43,7 @@ nm_setup() {
mkdir -p $nm_dir
# setup the default tags for all new messages
- deftags=${1}
+ deftags="$1"
act "notmuch setup $deftags"
@@ -97,7 +97,24 @@ nm_index() {
notice "Indexing completed"
}
+
nm_search() {
+ func "notmuch --config=${nm_dir}/rc search --output=files ${=PARAM}"
+
+ # launch the search with notmuch
+ search_results=`nm search --output=files ${=PARAM}`
+ [[ $? = 0 ]] || {
+ error "notmuch search failed with an error"
+ return 1 }
+ act "`print ${search_results} | wc -l` results found"
+ for i in ${(f)search_results}; do
+ print $i
+ done
+}
+
+
+# run a search with notmuch and show results with alot
+alot_search() {
read_account
nm_setup
@@ -178,25 +195,6 @@ EOF
alot -c "$MAILDIRS"/cache/alot/rc -n "$MAILDIRS"/cache/notmuch/rc \
search ${=PARAM}
return $?
-
- func "notmuch --config=${nm_dir}/rc search --output=files ${=PARAM}"
-
- # launch the search with notmuch
- search_results=`nm search --output=files ${=PARAM}`
- act "`print ${search_results} | wc -l` results found"
- [[ $? = 0 ]] || {
- error "notmuch search failed with an error"
- return 1 }
-
- # populate the maildir with results
- _resdir="$MAILDIRS"/cache/notmuch/results
- func "notmuch results in $_resdir"
- rm -rf "$_resdir"
- act "populating a maildir with results"
- maildirmake $_resdir
- for i in ${(f)search_results}; do
- ln -s $i "$_resdir/new/`basename $i`"
- done
}
search() {
@@ -230,7 +228,7 @@ search() {
}
# run search across emails
- nm_search ${=PARAM}
+ alot_search ${=PARAM}
}
backup() {
@@ -245,59 +243,59 @@ backup() {
# check if the name of a maildir is among params
# we need at least 2 maildirs, the second is the destination
for p in ${PARAM}; do
- c=$(( $c + 1 ))
-
- if [ $c = ${#PARAM} ]; then
- # last one is always the destination
- func "destination is ${p}"
- fold+=(${p})
-
- elif [ -r "${p}" ]; then
-
- { maildircheck ${p} } && {
- func "param ${p} is a maildir"
- fold+=(${p})
- { test ${#fold} = 1 } && {
- # base path is the dir of the first folder
- pushd `dirname ${p}`
- basedir=`pwd`
- popd }
- }
-
- elif [ -r "${MAILDIRS}/${p}" ]; then
-
- { maildircheck ${MAILDIRS}/${p} } && {
- func "param ${p} is a jaro maildir"
- fold+=(${MAILDIRS}/${p})
- }
-
- else # not a folder, add it to expressions array
- func "param ${p} is an expression"
- expr+=(${p})
- fi
+ c=$(( $c + 1 ))
+
+ if [ $c = ${#PARAM} ]; then
+ # last one is always the destination
+ func "destination is ${p}"
+ fold+=(${p})
+
+ elif [ -r "${p}" ]; then
+
+ { maildircheck ${p} } && {
+ func "param ${p} is a maildir"
+ fold+=(${p})
+ { test ${#fold} = 1 } && {
+ # base path is the dir of the first folder
+ pushd `dirname ${p}`
+ basedir=`pwd`
+ popd }
+ }
+
+ elif [ -r "${MAILDIRS}/${p}" ]; then
+
+ { maildircheck ${MAILDIRS}/${p} } && {
+ func "param ${p} is a jaro maildir"
+ fold+=(${MAILDIRS}/${p})
+ }
+
+ else # not a folder, add it to expressions array
+ func "param ${p} is an expression"
+ expr+=(${p})
+ fi
done
{ test ${#fold} -lt 2 } && {
- error "Not enough folders specified for backup: minimum is 2"
- act "When specifying more than 2, the last one is the destination"
- return 1
+ error "Not enough folders specified for backup: minimum is 2"
+ act "When specifying more than 2, the last one is the destination"
+ return 1
}
dst=${fold[${#fold}]}
{ test -r "$dst" } || { maildirmake "${dst}" }
{ test ${#expr} = 0 } && {
- error "No expression set for backup, please indicate what you want to backup"
- act "For example: d:10y-2y (all mails older than 1 year up to 10 years ago)"
- act "Or a simple search string, all expressions can be verified using search."
- return 1
+ error "No expression set for backup, please indicate what you want to backup"
+ act "For example: d:10y-2y (all mails older than 1 year up to 10 years ago)"
+ act "Or a simple search string, all expressions can be verified using search."
+ return 1
}
# forge the folder string for mairix conf
folders=""
for f in ${=fold}; do
- { test $f = $dst } || {
- folders="$folders`basename $f`:" }
+ { test $f = $dst } || {
+ folders="$folders`basename $f`:" }
done
notice "Backup of all mails in '$folders' matching expression '$expr'"
@@ -321,8 +319,8 @@ mformat=maildir
EOF
mairix -F -f ${mairixrc} -t -M ${expr}
{ test -r $basedir/$tempdst } && {
- merge $basedir/$tempdst $dst
- notice "Destination folder size is `du -hs $dst | awk '{print $1}'`"
+ merge $basedir/$tempdst $dst
+ notice "Destination folder size is `du -hs $dst | awk '{print $1}'`"
}
${=rm} ${mairixrc}