#!/bin/sh
: ; exec klone $0 "$@"
; The above line finds the klone executable in the $PATH
;;Skeleton of a typical klone script
;;(stack-dump-on-error t)
;;(kdb t)
(setq args (getopts "USAGE: gmail [options] patterns
Scans your MH mail via glimpse in a more user-friendly way, in that glimpse
searches files containing ALL the patterns.
This script supposes that your mail + indexes are in ~/Mail, and stores
the results of searches in the folder ~/Mail/TMP as links to mails
To use it you must index (at night) your mails, for instance by
glimpseindex -b -B -i -H ~/Mail ~/Mail
and do:
echo * > ~/Mail/.glimpse_exclude
for i in 0 1 2 3 4 5 6 7 8 9; do echo \"*$i\";done>~/Mail/.glimpse_include
If a file ~/Mail/.glimpse_relative_path excists, it is used to prefix
glimpse paths
"
("-F" file-pattern A-F
"limits the search to those files whose name
(including the whole path) matches file_pattern")
("-i" () A-i "case insensitive search")
("-k" () A-k "fgrep search")
("-w" () A-w "patterns must be a complete word")
("-x" () A-x "patterns must be a complete line")
("-1" () E-1 "agrep: 1 error permitted (0 default)")
("-2" () E-2 "2 errors tolerated")
("-3" () E-3 "2 errors tolerated")
("-4" () E-4 "2 errors tolerated")
("-5" () E-5 "2 errors tolerated")
("-6" () E-6 "2 errors tolerated")
("-7" () E-7 "2 errors tolerated")
("-8" () E-8 "2 errors tolerated")
("-d" destdir TMP "where to put results (default ~/Mail/TMP)")
("-v" () verbose "verbose operation")
("-ns" () nosort "dont sort messages")
))
(defun main (&aux
glimpse
file
(count 0)
(N 0)
(ht (Hashtable ()))
(search-string (copy ""))
(re (regcomp "^([^:]*[/][0-9][0-9]*):"))
(dir (expand-filename (if TMP TMP "~/Mail/TMP")))
(old-dir (expand-filename "~/Mail/Old"))
(path-prefix "")
)
(setq *current-directory* "~")
(if (file-stats "~/Mail/.glimpse_relative_path") (progn
(setq path-prefix (match "^([^\n]*)"
(String (open "~/Mail/.glimpse_relative_path")) 1
))
(if (not path-prefix) (setq path-prefix ""))
))
(dolist (arg args)
(if (/= "" search-string)
(nconc search-string ";")
)
(nconc search-string arg)
)
(sh rm "-rf" ,dir)
(if (/= 'directory (file-type dir)) (sh mkdir ,dir))
(if (/= 'directory (file-type dir))
(progn (PF "problem creating %0, aborting!\n" dir) (exit 1))
)
(setq command (+ (list "glimpse" "-H" "Mail" "-W" "-y" )
(if A-F (list "-F" A-F))
(if A-i '("-i"))
(if A-w '("-w"))
(if A-x '("-x"))
(if A-k '("-k"))
(if E-1 '("-1"))
(if E-2 '("-2"))
(if E-3 '("-3"))
(if E-4 '("-4"))
(if E-5 '("-5"))
(if E-6 '("-6"))
(if E-7 '("-7"))
(if E-8 '("-8"))
(list "-e" search-string)))
(if verbose (PF "issuing command: %0\n" command))
(system command :output 'glimpse)
(while (setq line (read-line glimpse ()))
(if (and (regexec re line)
(setq file (+ path-prefix (regsub re 1)))
(incf count)
(not (getn ht file))
)
(progn
(if verbose (write-line line))
(put ht file t)
(incf N)
(wait (system (list "ln" "-s" file (+ dir "/" (String N)))))
)))
(PF "%0 in %1 files found, put in %2\n" count N dir)
(uniq-mess dir old-dir)
(if (and (not nosort) (> N 0))
(sh sortm "+TMP")
)
)
(defun uniq-mess (dir old-dir &aux
(ids (Hashtable ())) ;base of messages (list) per ID
id
files
(*current-directory* dir)
)
(dolist (file (directory))
(setq id (message-id file))
(if (setq files (getn ids id))
(lappend files file)
(put ids id (vector file))
)
)
(dohash (id files ids)
(dolist (file (subseq files 1)) ;keep only first one
(sh rm ,file)
))
)
(setq message-id:re (regcomp "^Message-Id: *(.*)$"))
(defun message-id (file &aux
(fd (open file))
(res file) ;default id is unique: file name
)
(catch 'EOF (while t
(if (regexec message-id:re (read-line fd))
(throw 'EOF (setq res (regsub message-id:re 1)))
)))
res
)
(main)
;;; EMACS MODES
;;; Local Variables: ***
;;; mode:lisp ***
;;; End: ***
syntax highlighted by Code2HTML, v. 0.9.1