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)