�`^c@s|dZddlmZeddd�[dZdZdZd Zdd
lZdd
lZdd
l Z dd
l
Z
dd
lZdd
lZddl
m
Z
dd
ddgZd
efd��YZdfd��YZe jd�Zd�Zdfd��YZde
jfd��YZdefd��YZdfd��YZdd�Zdd�Zd�Zedkrxe�nd
S(s�MH interface -- purely object-oriented (well, almost)
Executive summary:
import mhlib
mh = mhlib.MH() # use default mailbox directory and profile
mh = mhlib.MH(mailbox) # override mailbox location (default from profile)
mh = mhlib.MH(mailbox, profile) # override mailbox and profile
mh.error(format, ...) # print error message -- can be overridden
s = mh.getprofile(key) # profile entry (None if not set)
path = mh.getpath() # mailbox pathname
name = mh.getcontext() # name of current folder
mh.setcontext(name) # set name of current folder
list = mh.listfolders() # names of top-level folders
list = mh.listallfolders() # names of all folders, including subfolders
list = mh.listsubfolders(name) # direct subfolders of given folder
list = mh.listallsubfolders(name) # all subfolders of given folder
mh.makefolder(name) # create new folder
mh.deletefolder(name) # delete folder -- must have no subfolders
f = mh.openfolder(name) # new open folder object
f.error(format, ...) # same as mh.error(format, ...)
path = f.getfullname() # folder's full pathname
path = f.getsequencesfilename() # full pathname of folder's sequences file
path = f.getmessagefilename(n) # full pathname of message n in folder
list = f.listmessages() # list of messages in folder (as numbers)
n = f.getcurrent() # get current message
f.setcurrent(n) # set current message
list = f.parsesequence(seq) # parse msgs syntax into list of messages
n = f.getlast() # get last message (0 if no messagse)
f.setlast(n) # set last message (internal use only)
dict = f.getsequences() # dictionary of sequences in folder {name: list}
f.putsequences(dict) # write sequences back to folder
f.createmessage(n, fp) # add message from file f as number n
f.removemessages(list) # remove messages in list from folder
f.refilemessages(list, tofolder) # move messages in list to other folder
f.movemessage(n, tofolder, ton) # move one message to a given destination
f.copymessage(n, tofolder, ton) # copy one message to a given destination
m = f.openmessage(n) # new open message object (costs a file descriptor)
m is a derived class of mimetools.Message(rfc822.Message), with:
s = m.getheadertext() # text of message's headers
s = m.getheadertext(pred) # text of message's headers, filtered by pred
s = m.getbodytext() # text of message's body, decoded
s = m.getbodytext(0) # text of message's body, not decoded
i�(twarnpy3ksOthe mhlib module has been removed in Python 3.0; use the mailbox module insteadt
stacklevelis
~/.mh_profiles~/Mails
.mh_sequencesi�N(tbisecttMHtErrortFoldertMessagecBseZRS((t__name__t
__module__(((s/sys/lib/python2.7/mhlib.pyR[scBs�eZdZddd�Zd�Zd�Zd�Zd�Zd�Z d�Z
d�Zd �Zd
�Z
d�Zd�Zd
�Zd�ZRS(s<Class representing a particular collection of folders.
Optional constructor arguments are the pathname for the directory
containing the collection, and the MH profile to use.
If either is omitted or empty a default is used; the default
directory is taken from the MH profile if it is specified there.cCs�|dkrt}ntjj|�|_|dkrH|jd�}n|sWt}ntjj|�r�|ddkr�tjj d|�}ntjj|�}tjj
|�s�td�n||_dS(sConstructor.tPathit~sMH() path not foundN(tNonet
MH_PROFILEtostpatht
expandusertprofilet
getprofiletPATHtisabstjointisdirR(tselfRR((s/sys/lib/python2.7/mhlib.pyt__init__fs #cCsd|j|jfS(sString representation.s
MH(%r, %r)(RR(R((s/sys/lib/python2.7/mhlib.pyt__repr__rscGstjjd||�dS(sARoutine to print an error. May be overridden by a derived class.s
MH error: %s
N(tsyststderrtwrite(Rtmsgtargs((s/sys/lib/python2.7/mhlib.pyterrorvscCst|j|�S(s*Return a profile entry, None if not found.(tpicklineR(Rtkey((s/sys/lib/python2.7/mhlib.pyRzscCs|jS(s9Return the path (the name of the collection's directory).(R(R((s/sys/lib/python2.7/mhlib.pytgetpath~scCs7ttjj|j�d�d�}|s3d}n|S(s&Return the name of the current folder.tcontextsCurrent-Foldertinbox(RR
RRR!(RR"((s/sys/lib/python2.7/mhlib.pyt
getcontext�s
cCsItjj|j�d�}t|d�}|jd|�|j�dS(s#Set the name of the current folder.R"twsCurrent-Folder: %s
N(R
RRR!topenRtclose(RR"tfntf((s/sys/lib/python2.7/mhlib.pyt
setcontext�scCsqg}|j�}xNtj|�D]=}tjj||�}tjj|�r"|j|�q"q"W|j�|S(s*Return the names of the top-level folders.(R!R
tlistdirRRRtappendtsort(RtfoldersRtnametfullname((s/sys/lib/python2.7/mhlib.pytlistfolders�s
c Cs�tjj|j|�}tj|�j}|dkr:gSg}tj|�}xt|D]l}tjj||�}tjj|�rVtjj||�}|j|�|d}|dkr�Pq�qVqVW|j�|S(scReturn the names of the subfolders in a given folder
(prefixed with the given folder name).ii( R
RRtstattst_nlinkR+RR,R-( RR/R0tnlinkst
subfolderstsubnamestsubnametfullsubnametname_subname((s/sys/lib/python2.7/mhlib.pytlistsubfolders�s
cCs
|jd�S(s<Return the names of all folders and subfolders, recursively.t(tlistallsubfolders(R((s/sys/lib/python2.7/mhlib.pytlistallfolders�sc
Cs$tjj|j|�}tj|�j}|dkr:gSg}tj|�}x�|D]�}|ddksVt|�r~qVntjj||�}tjj|�rVtjj||�}|j|�tjj |�s�j
|�} || }n|d}|dkrPqqVqVW|j�|S(s>Return the names of subfolders in a given folder, recursively.iit,i(R
RRR2R3R+t isnumericRR,tislinkR<R-(
RR/R0R4R5R6R7R8R9t
subsubfolders((s/sys/lib/python2.7/mhlib.pyR<�s,
cCs
t||�S(s0Return a new Folder object for the named folder.(R(RR/((s/sys/lib/python2.7/mhlib.pyt
openfolder�scCset|jd�}|r6t|�r6t|d�}nt}tjtjj|j �|�|�dS(s@Create a new folder (or raise os.error if it cannot be created).sFolder-ProtectiN(
RRR?tinttFOLDER_PROTECTR
tmkdirRRR!(RR/tprotecttmode((s/sys/lib/python2.7/mhlib.pyt
makefolder�s
cCs�tjj|j�|�}xetj|�D]T}tjj||�}ytj|�Wq+tjk
r~|jd|�q+Xq+Wtj|�dS(s�Delete a folder. This removes files in the folder but not
subdirectories. Raise os.error if deleting the folder itself fails.s%s not deleted, continuing...N(R
RRR!R+tunlinkRtrmdir(RR/R0R7R8((s/sys/lib/python2.7/mhlib.pytdeletefolder�s N(RRt__doc__RRRRRR!R$R*R1R:R=R<RBRHRK(((s/sys/lib/python2.7/mhlib.pyR_s s
^[1-9][0-9]*$cCstj|�dk S(N(tnumericprogtmatchR(tstr((s/sys/lib/python2.7/mhlib.pyR?�scBs�eZdZd�Zd�Zd�Zd�Zd�Zd�Zd�Z d�Z
d �Zd
�Zd�Z
d�Zd
�Zd�Zd�Zd�Zd�Zdd�Zd�Zd�Zd�Zd�Zd�Zd�Zd�ZRS(s'Class representing a particular folder.cCs>||_||_tjj|j��s:td|�ndS(sConstructor.sno folder %sN(tmhR/R
RRtgetfullnameR(RRPR/((s/sys/lib/python2.7/mhlib.pyR�s cCsd|j|jfS(sString representation.sFolder(%r, %r)(RPR/(R((s/sys/lib/python2.7/mhlib.pyR�scGs|jj|�dS(sError message handler.N(RPR(RR((s/sys/lib/python2.7/mhlib.pyRscCstjj|jj|j�S(s'Return the full pathname of the folder.(R
RRRPR/(R((s/sys/lib/python2.7/mhlib.pyRQscCstjj|j�t�S(s8Return the full pathname of the folder's sequences file.(R
RRRQtMH_SEQUENCES(R((s/sys/lib/python2.7/mhlib.pytgetsequencesfilenamescCstjj|j�t|��S(s4Return the full pathname of a message in the folder.(R
RRRQRO(Rtn((s/sys/lib/python2.7/mhlib.pytgetmessagefilenamescCs|jj|j�S(s!Return list of direct subfolders.(RPR:R/(R((s/sys/lib/python2.7/mhlib.pyR:scCs|jj|j�S(sReturn list of all subfolders.(RPR<R/(R((s/sys/lib/python2.7/mhlib.pyR<scCs�g}tj}|j}x6tj|j��D]}||�r.||�q.q.Wtt|�}|j�|r�|d|_ n d|_ |S(s�Return the list of messages currently present in the folder.
As a side effect, set self.last to the last message (or 0).i�i(
RMRNR,R
R+RQtmapRCR-tlast(RtmessagesRNR,R/((s/sys/lib/python2.7/mhlib.pytlistmessagess
cCs�i}|j�}yt|d�}Wntk
r9|SXx�|j�}|sSPn|jd�}t|�dkr�|jd||j�f�n|dj�}t|dj�d�j �}|||<q=|S(s+Return the set of sequences for the folder.trt:isbad sequence in %s: %siit (
RSR&tIOErrortreadlinetsplittlenRtstriptIntSetttolist(Rt sequencesR0R)tlinetfieldsR tvalue((s/sys/lib/python2.7/mhlib.pytgetsequences)s$
cCs�|j�}d}xk|j�D]]\}}tdd�}|j|�|s_t|d�}n|jd||j�f�qW|s�ytj |�Wq�tj
k
r�q�Xn
|j�dS(s.Write the set of sequences back to the folder.R;R\R%s%s: %s
N(RSRt iteritemsRbtfromlistR&RttostringR
RIRR'(RRdR0R)R tseqts((s/sys/lib/python2.7/mhlib.pytputsequences=s
!cCsE|j�}yt|d�SWn ttfk
r@td�nXdS(s<Return the current message. Raise Error when there is none.tcursno cur messageN(Rhtmaxt
ValueErrortKeyErrorR(Rtseqs((s/sys/lib/python2.7/mhlib.pyt
getcurrentNs
cCs#t|j�dt|�d�dS(sSet the current message.RoiN(t
updatelineRSRO(RRT((s/sys/lib/python2.7/mhlib.pyt
setcurrentVscCsL|j�}|s%td|j�n|dkr5|S|jd�}|dkr
|| d||d}}}|d dkr�|d |d}}nt|�s�td|�nyt|�}Wn#ttfk
r�t|�}nXy|j ||�}Wn�tk
r�} |j
�}
||
krV| s=d|} nt| tj�d �n|
|}|svtd
|�n|dkr�||S|| Sq
X|s�|dkr�d}q�n|dkr�
||�}|td||�|!St
||d�}||||!Sn|jd�}|dkr�|j || |�}|j ||d|�}
t
||d�}t
||
�}|||!}|s�td|�n|Sy|j ||�}WnOtk
r} |j
�}
||
kr| s�|} nt| �n|
|SX||krAt|�r1td|�qHtd|�n|gSdS(s�Parse an MH sequence specification into a message list.
Attempt to mimic mh-sequence(5) as close as possible.
Also attempt to mimic observed behavior regarding which
conditions cause which error messages.sno messages in %stallR[iR;is-+sbad message list %sissequence %s emptyt-tprevRWsmessage %d doesn't exists
no %s messageN(Ryslast(RYRR/tfindR?RCRqt
OverflowErrorR`t_parseindexRhRtexc_infoRRp(RRlRwtitheadtdirttailtcounttanchorRRstmsgstbegintendtjRZRT((s/sys/lib/python2.7/mhlib.pyt
parsesequenceZs|
cCsLt|�r;yt|�SWq;ttfk
r7tjSXn|d
krQ|j�S|dkre|dS|dkry|dS|dkr�|j�}t||�}y||SWq�tk
r�t d�q�Xn|d kr?|j�}t||d
�}|dkrt d�ny||d
SWq?tk
r;t d�q?Xnt d�dS(s7Internal: parse a message number (or cur, first, etc.).Rot.tfirstiRWi�tnextsno next messageRyisno prev messageN(scurR�(R?RCR{RqRtmaxintRtRt
IndexErrorRR(RRlRwRTR~((s/sys/lib/python2.7/mhlib.pyR|�s8
cCs
t||�S(s+Open a message -- returns a Message object.(R(RRT((s/sys/lib/python2.7/mhlib.pytopenmessage�scCsg}g}x�|D]�}|j|�}|jdt|��}ytj|�Wntjk
rhnXytj||�Wn#tjk
r�}|j|�qX|j|�qW|r�|j|�n|r
t|�dkr�j|d�q
tjd|f�ndS(s2Remove one or more messages -- may raise os.error.R>iismultiple errors:N( RUROR
RIRtrenameR,tremovefromallsequencesR`(RtlistterrorstdeletedRTRt commapathR((s/sys/lib/python2.7/mhlib.pytremovemessages�s(
icCs�g}i}x�D]�|j�d}|j|�}|j|�} ytj|| �Wn�tjk
r�y!tj|| �tj|�Wq�ttjfk
r�}
|j |
�ytj| �Wqtjk
r�qXqq�nX|j
|�|||<qW|r@|r*|j||j��n|j
|j��n|r�t|�dkrktj|d�q�tjd|f�ndS(s_Refile one or more messages -- may raise os.error.
'tofolder' is an open folder object.iismultiple errors:N(tgetlastRUR
R�Rtshutiltcopy2RIR]R,tsetlastt_copysequencestitemsR�tkeysR`(RR�ttofoldert
keepsequencesR�trefiledRTttonRttopathR((s/sys/lib/python2.7/mhlib.pytrefilemessages�s:
cCs�|j�}|j�}d}x�|j�D]�\}}y||}d} Wntk
rjg}d} nXx6|D].\}
}|
|krr|j|�d}qrqrW| r+|r+|||<q+q+W|r�|j|�ndS(s.Helper for refilemessages() to copy sequences.iiN(RhR�RrR,Rn(Rt
fromfoldertrefileditemst
fromsequencesttosequencestchangedR/RlttoseqtnewtfromnR�((s/sys/lib/python2.7/mhlib.pyR�
s$
c Cs#|j|�}t|�}|j�~|j|�}|jd|�}ytj||�Wntjk
rtnXytj||�Wn�tjk
rd}z'|jd�tj ||�d}Wd|s�tj
|�Wq�jk
r�q�Xtj
|�nX|j|g�dS(saMove one message over a specific destination message,
which may or may not already exist.s,%diiN(RUR&R'R
R�RR�RR�R�RIR�( RRTR�R�RR)R�tbackuptopathtok((s/sys/lib/python2.7/mhlib.pytmovemessage"s2
c Cs�|j|�}t|�}|j�~|j|�}|jd|�}ytj||�Wntjk
rtnXd}z'|jd�tj ||�d}Wd|s�ytj
|�Wq�tjk
r�q�XnXdS(saCopy one message over a specific destination message,
which may or may not already exist.s,%diiN(RUR&R'R
R�RR�RR�R�RI( RRTR�R�RR)R�R�R�((s/sys/lib/python2.7/mhlib.pytcopymessageBs(
c Cs�|j|�}|jd|�}ytj||�Wntjk
rLnXd}d}zOt|d�}x)|j|�}|s�Pn|j|�qn|j�d}Wd|s�ytj|�Wq�tjk
r�q�XnXdS( s3Create a message, with text from the open file txt.s,%diiiR%iNi@( RUR
R�RR&treadRR'RI( RRTttxtRt
backuppathR�tBUFSIZER)tbuf((s/sys/lib/python2.7/mhlib.pyt
createmessage\s,
cCs�t|d�r'|j|kr'|`n|j�}d}xo|j�D]a\}}|dkrdqFnx@|D]8}||krk|j|�d}|s�||=q�qkqkWqFW|r�|j|�ndS(s`Remove one or more messages from all sequences (including last)
-- but not from 'cur'!!!RWiRoiN(thasattrRWRhR�tremoveRn(RR�RdR�R/RlRT((s/sys/lib/python2.7/mhlib.pyR�vs
cCs#t|d�s|j�n|jS(sReturn the last message number.RW(R�RYRW(R((s/sys/lib/python2.7/mhlib.pyR��s
cCs4|dkr't|d�r0|`q0n ||_dS(sSet the last message number.RWN(RR�RW(RRW((s/sys/lib/python2.7/mhlib.pyR��s(RRRLRRRRQRSRUR:R<RYRhRnRtRvR�R|R�R�R�R�R�R�R�R�R�R�(((s/sys/lib/python2.7/mhlib.pyR�s4 T # cBsGeZdd�Zd�Zdd�Zdd�Zd�Zd�ZRS(cCsV||_||_|dkr?|j|�}t|d�}ntjj||�dS(sConstructor.RZN(tfoldertnumberRRUR&t mimetoolsRR(RR)RTtfpR((s/sys/lib/python2.7/mhlib.pyR�s cCsdt|j�|jfS(sString representation.sMessage(%s, %s)(treprR�R�(R((s/sys/lib/python2.7/mhlib.pyR�scCs�|dkrdj|j�Sg}d}xn|jD]c}|dj�s|jd�}|dkr||| j��}qn|r2|j|�q2q2Wdj|�S(s�Return the message's header text as a string. If an
argument is specified, it is used as a filter predicate to
decide which headers to return (its argument is the header
name converted to lower case).R;iR[N(RRtheaderstisspaceRztlowerR,(RtpredR�thitReR~((s/sys/lib/python2.7/mhlib.pyt
getheadertext�sicCs�|jj|j�|j�}|s2|dkr?|jj�Syddlm}Wn!tk
rvddlm}nX|�}tj |j||�|j
�S(s�Return the message's body text as string. This undoes a
Content-Transfer-Encoding, but does not interpret other MIME
features (e.g. multipart messages). To suppress decoding,
pass 0 as an argument.R;t7bitt8bittbinaryi�(tStringIO(R;R�R�R�(R�tseektstartofbodytgetencodingR�t cStringIOR�tImportErrorR�tdecodetgetvalue(RR�tencodingR�toutput((s/sys/lib/python2.7/mhlib.pytgetbodytext�s
cCs�|j�dkrtd�n|jd�}|s?td�n|jj|j�tj|j�}|j|�g}xO|j �r�d|j
dt|�f}t|j
||�}|j|�qzW|j�|S(s�Only for multipart messages: return the message's body as a
list of SubMessage objects. Each submessage object behaves
(almost) as a Message object.t multipartsContent-Type is not multipart/*tboundarys"multipart/* without boundary params%s.%ri(tgetmaintypeRtgetparamR�R�R�t multifilet MultiFiletpushR�R�R`t
SubMessageR�R,tpop(RtbdrytmftpartsRTtpart((s/sys/lib/python2.7/mhlib.pytgetbodyparts�s
cCs*|j�dkr|j�S|j�SdS(s3Return body, either a string or a list of messages.R�N(R�R�R�(R((s/sys/lib/python2.7/mhlib.pytgetbody�s
N( RRRRRR�R�R�R�(((s/sys/lib/python2.7/mhlib.pyR�s R�cBs8eZd�Zd�Zdd�Zd�Zd�ZRS(cCsktj||||�|j�dkr=tj|�|_ntj|�|_tj|dd�|_dS(sConstructor.R�R�iN(RRR�R�tbodyR�tbodyencoded(RR)RTR�((s/sys/lib/python2.7/mhlib.pyR�s
cCs.|j|j|j}}}d|||fS(sString representation.sSubMessage(%s, %s, %s)(R�R�R�(RR)RTR�((s/sys/lib/python2.7/mhlib.pyR�sicCs3|s
|jSt|j�td�kr/|jSdS(NR;(R�ttypeR�(RR�((s/sys/lib/python2.7/mhlib.pyR��scCs&t|j�tg�kr"|jSdS(N(R�R�(R((s/sys/lib/python2.7/mhlib.pyR��scCs|jS(N(R�(R((s/sys/lib/python2.7/mhlib.pyR��s(RRRRR�R�R�(((s/sys/lib/python2.7/mhlib.pyR��s
RbcBs�eZdZdddd�Zd�Zd�Zd�Zd�Zd�Z d �Z
d
�Zd�Zd�Z
d
�Zd�Zd�Zd�Zd�Zd�ZRS(s�Class implementing sets of integers.
This is an efficient representation for sets consisting of several
continuous ranges, e.g. 1-100,200-400,402-1000 is represented
internally as a list of three pairs: [(1,100), (200,400),
(402,1000)]. The internal representation is always kept normalized.
The constructor has up to three arguments:
- the string used to initialize the set (default ''),
- the separator between ranges (default ',')
- the separator between begin and end of a range (default '-')
The separators must be strings (not regexprs) and should be different.
The tostring() function yields a string that can be passed to another
IntSet constructor; __repr__() is a valid IntSet constructor itself.
R>RxcCs5g|_||_||_|r1|j|�ndS(N(tpairstseptrngt
fromstring(RtdataR�R�((s/sys/lib/python2.7/mhlib.pyRs
cCs
g|_dS(N(R�(R((s/sys/lib/python2.7/mhlib.pytreset scCst|j|j�S(N(tcmpR�(Rtother((s/sys/lib/python2.7/mhlib.pyt__cmp__#scCs
t|j�S(N(thashR�(R((s/sys/lib/python2.7/mhlib.pyt__hash__&scCsd|j�|j|jfS(NsIntSet(%r, %r, %r)(RkR�R�(R((s/sys/lib/python2.7/mhlib.pyR)scCs�|jj�d}x�|t|j�kr�|j|d\}}|j|\}}||dkr�|t||�fg|j|d|d+q|d}qWdS(Ni(R�R-R`Rp(RR~talotahitblotbhi((s/sys/lib/python2.7/mhlib.pyt normalize,s
-cCs|d}xo|jD]d\}}||kr7t|�}nt|�|jt|�}|rn||j|}q|}qW|S(NR;(R�R�R�R�(RRmtlothitt((s/sys/lib/python2.7/mhlib.pyRk7s
cCsAg}x4|jD])\}}t||d�}||}qW|S(Ni(R�trange(RtlR�R�tm((s/sys/lib/python2.7/mhlib.pyRc@s
cCs"x|D]}|j|�qWdS(N(R,(RR�R~((s/sys/lib/python2.7/mhlib.pyRjGs
cCst�}|j|_|S(N(RbR�(RR�((s/sys/lib/python2.7/mhlib.pytcloneKs
cCs|jddS(Ni(R�(R((s/sys/lib/python2.7/mhlib.pytminPscCs|jddS(Ni�(R�(R((s/sys/lib/python2.7/mhlib.pyRpSscCs>x7|jD],\}}||ko-|knr
tSq
WtS(N(R�tTruetFalse(RtxR�R�((s/sys/lib/python2.7/mhlib.pytcontainsVscCsqx�t|j��D]�|j|\}}||kr�d|kra||f|j|<n|jj|||f�|dkr�d|j|ddkr�j|dd|j|dfg|j|d|d+ndS||krdSqWt|j�d}|dkrW|j|\}}|d|krW||f|j|<dSn|jj||f�dS(Nii(R�R`R�tinsertR,(RR�R~R�R�((s/sys/lib/python2.7/mhlib.pyR,[s&+,cCs4||krdS|jj||f�|j�dS(N(R�R,R�(Rtxlotxhi((s/sys/lib/python2.7/mhlib.pytaddpairtscCsg}x�|j|j�D]�}g}x9|j|j�D]%}|j�}|jt|��q8Wt|�dkr�|j|d|df�qt|�dkr�|d|dkr�|j|d|df�qtd�qW|j||_|j �dS(Niiisbad data passed to IntSet(
R_R�R�RaR,RCR`RqR�R�(RR�R�R�R�tsubpRm((s/sys/lib/python2.7/mhlib.pyR�ys&
N(RRRLRRR�R�R�RR�RkRcRjR�R�RpR�R,RR�(((s/sys/lib/python2.7/mhlib.pyRbs" icCs�yt|d�}Wntk
r'dSXtj|�d}tj||oPtj�}x~|j�}|soPn|j|�rY|t |�d}x5|j�}|s�|dj
�r�Pn||}q�|j�SqYdS(NRZR[ii(R&R]Rtretescapetcompilet
IGNORECASER^RNR`R�Ra(tfileR tcasefoldR)tpattprogRettext((s/sys/lib/python2.7/mhlib.pyR�s&
cCsay)t|d�}|j�}|j�Wntk
rBg}nXtj|�d}tj||oktj�}|dkr�d}nd||f}xst t
|��D]C} || }
|j|
�r�|dkr�|| =n
||| <Pq�q�W|dk r|j|�n|d}t|d�}x|D]}
|j
|
�q,W|j�tj||�dS(NRZs:(.*)
s%s: %s
R
R%(R&t readlinesR'R]RRRRRR�R`RNR,RR
R�(RR RgRR)tlinesR R
tnewlineR~Rettempfile((s/sys/lib/python2.7/mhlib.pyRu�s4
c Cs�tjd�t�ad�}|d�|d�ddddd d
g}x|D]}|d|f�qRW|d�|d
�tjd�a|d�|d�|d�tj�}tdd�j�|d<|GHtj |�|d�x%t
|�D]}|d|f�q�d�tj�}tj|�a|d�x|d/D]t}y|d*|f�Wntk
r�}d+G|GHnXtj
d,|f�j�}tt|j��}|Gd-GHqMW|d.�dS(0Nsrm -rf $HOME/Mail/@testcSs|GHt|�GHdS(N(teval(Rm((s/sys/lib/python2.7/mhlib.pytdo�ssmh.listfolders()smh.listallfolders()s@tests@test/test1s@test/test2s@test/test1/test11s@test/test1/test12s@test/test1/test11/test111smh.makefolder(%r)smh.listsubfolders('@test')smh.listallsubfolders('@test')sf.listsubfolders()sf.listallsubfolders()sf.getsequences()s
1-10 12-20R\tfoosmh.deletefolder(%r)smh.getcontext()sf.getcurrent()R�RWRoR�RyR�sfirst:3slast:3scur:3scur:-3sprev:3snext:3s1:3s1:-3s100:3s100:-3s10000:3s10000:-3Rwsf.parsesequence(%r)sError:spick %r 2>/dev/nulls<-- picksf.listmessages()(sfirstslastscurR�sprevsnextsfirst:3slast:3scur:3scur:-3sprev:3snext:3s1:3s1:-3s100:3s100:-3s10000:3s10000:-3sall(R
tsystemRRPRBR)RhRbRcRntreversedR$RtpopenR�RVRCR_( RttestfoldersR�RsR"RlRtstuffR�((s/sys/lib/python2.7/mhlib.pyttest�sP
t__main__(RLtwarningsRRRRRRDR
RRR�R�R�Rt__all__t ExceptionRRRRMR?RRR�RbRRuRR(((s/sys/lib/python2.7/mhlib.pyt<module>6s<
� �M�" *
|