Mercurial > hg > paul
diff bin/rq.py @ 0:2aa53823fb21
new repo
| author | Henry S. Thompson <ht@inf.ed.ac.uk> |
|---|---|
| date | Sat, 06 Jun 2026 10:19:04 +0100 |
| parents | |
| children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/bin/rq.py Sat Jun 06 10:19:04 2026 +0100 @@ -0,0 +1,198 @@ +#!/usr/bin/python2 +import sys +import re +import locale +from os import stat, unlink, system +from mailbox import mbox +from email.parser import Parser +import datetime +from tempfile import NamedTemporaryFile + +locale.setlocale(locale.LC_ALL, '') + +def cmp1(x,y): + c1=cmp(x[0],y[0]) + if c1: + return c1 + else: + return cmp(x[1],y[1]) + +def cmp2(x,y): + c1=cmp(x[0],y[0]) + if c1: + return c1 + else: + return locale.strcoll(x[1],y[1]) + +def dumpHdrsAndText(msg,outfile): + #print "MSG: %s"%repr(msg) + #print >>sys.stderr,'Content-Type: %s'%msg.get('Content-Type',None) + #print >>sys.stderr,'Content-Transfer-Encoding: %s'%msg.get('Content-Transfer-Encoding',None) + outfile.writelines("%s: %s\n"%(k,v) for (k,v) in msg.items()) + outfile.write("\n") + if msg.is_multipart(): + outfile.write('\nmultipart: %s\n\n'%len(msg.get_payload())) + for m in msg.get_payload(): + #print "PART: %s"%repr(m) + #print "part %s"%m.get('Content-Type','xx') + dumpHdrsAndText(m,outfile) + elif msg.get('Content-Type',None).find('text/')==0: + outfile.write(msg.get_payload(decode=True)) + else: + #print 'OCT: %s'%msg.get('Content-Type','xx') + pass + +pl=re.compile("([^\t]*)\t\\[file://([^\\]]*)\\]\t\[(.*)\]\t") +pif=re.compile("/(pers|group)-([12][0-9][0-9][0-9].[01][0-9])/([0-9]*)") +pof=re.compile("/.evolution/mail/local/([12][0-9][0-9][0-9].[01][0-9])$") +ovf=re.compile("\.overview$") +incoming={} +outgoing={} +other=[] +mboxes={} +tfl=[] +ov=0 +mparser=None + +dosort=sys.argv[1]=="1" +doless=sys.argv[2]=="1" + +locs=[] + +for l in sys.stdin: + res=pl.match(l.rstrip()) + if res: + (type,filename,subj)=res.groups() + #print type, filename, subj + res=pif.search(filename) + if res: + if ovf.search(filename): + ov=ov+1 + else: + incoming[(res.group(2),res.group(3))]=filename + else: + res=pof.search(filename) + if res: + k=(res.group(1),subj) + n=outgoing.get(k,0) + outgoing[k]=n+1 + else: + try: + k=stat(filename).st_mtime + #k=1216786059.1472759 + other+=[(k,filename,subj)] + except: + pass + else: + print >> sys.stderr, "oops:",l +print "%s pers, %s out, %s other, %s .overview"%(len(incoming),len(outgoing),len(other),ov) +ik=incoming.keys() +ok=outgoing.keys() +xk=other +if dosort: + ik.sort(cmp=cmp1,reverse=True) + ok.sort(cmp=cmp2,reverse=True) + xk.sort(cmp=cmp2,reverse=True) +ikl=len(ik) +okl=len(ok) +xkl=len(xk) +i=o=x=0 +iTop=None +oTop=None +xTop=None +# if not sorted will be pretty messed up. . . +while (i<ikl or o<okl or x<xkl): + if (iTop is None): + if (i<ikl): + iTop = ik[i][0] + else: + iTop = "0000-00" + if (oTop is None): + if (o<okl): + oTop = ok[o][0] + else: + oTop = "0000-00" + if (xTop is None): + if (x<xkl): + xTop = datetime.date.fromtimestamp(xk[x][0]).strftime("%Y-%m") + else: + xTop = "0000-00" + if iTop>=oTop: + if iTop>=xTop: + # it's i we want + #print >>sys.stderr,"i",i,iTop,ik[i],incoming[ik[i]] + iloc=incoming[ik[i]] + if doless: + # check for encoded text + ccmd="grep -Pzq 'Content-Transfer-Encoding: base64' \"%s\""%iloc + #print >>sys.stderr,ccmd + #sys.stderr.flush() + if not system(ccmd): + if mparser is None: + mparser=Parser() + tf=NamedTemporaryFile(delete=False) + print >>tf,iloc + dumpHdrsAndText(mparser.parse(open(iloc)),tf) + tfl.append(tf.name) + tf.close() + iloc=tf.name + locs.append(iloc) + i=i+1 + iTop=None + continue + else: + # it's x we want + pass + elif oTop>=xTop: + # it's o we want + #print "o",o,oTop,ok[o],outgoing[ok[o]] + k=ok[o] + res=int(outgoing[k]) + # Need to write a temporary file drawn from k[0] for successive + # subjects == k[1] + if doless: + try: + mb=mboxes[oTop] + except KeyError: + mboxes[oTop]=mb=mbox("/disk/scratch/mail/cpy/general/"+oTop).values() + for m in mb: + if m['subject']==k[1]: + tf=NamedTemporaryFile(delete=False) + locs.append(tf.name) + tfl.append(tf.name) + tf.write(m.as_string()) + tf.close() + else: + locs.append("%s/%s"%(oTop,k[1])) + o=o+1 + oTop=None + continue + else: + # it's x we want + pass + #print >>sys.stderr,"x",x,xTop,xk[x] + #sys.stderr.flush() + xloc=xk[x][1] + if doless: + # check for encoded text + ccmd="grep -Pzq 'Content-Transfer-Encoding: base64' \"%s\""%xloc + #print >>sys.stderr,ccmd + #sys.stderr.flush() + if not system(ccmd): + if mparser is None: + mparser=Parser() + tf=NamedTemporaryFile(delete=False) + print >>tf,xloc + dumpHdrsAndText(mparser.parse(open(xloc)),tf) + tfl.append(tf.name) + tf.close() + xloc=tf.name + locs.append(xloc) + x=x+1 + xTop=None +if doless: + system('less '+' '.join(locs)) +else: + print '\n'.join(locs) +for f in tfl: + unlink(f)
