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)