Mercurial > hg > paul
view 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 source
#!/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)
