
    e.#                         d dl Z d dlZd dlmZ d dlmZmZmZmZ d dl	m
Z
 d dlmZ  e       Zdad Zd Zd Zd	 Zd
 Z G d d      Z G d d      Zy)    N)Lock)listdirmakedirspathunlink)exc_info)NoSectionErrorc                     t         j                         dury t        5  t         j                  | ||       d d d        y # 1 sw Y   y xY wNT)_mbnames
is_enabled_mbLockaddAccountFolder)accountnamefolder_root
foldernames      ./usr/share/offlineimap3/offlineimap/mbnames.pyaddr      sD    D(	 H!!+{JGH H Hs	   ?Ac                 ,    t         t        | ||      a y y N)r   _Mbnames)confuidry_runs      r   initr   )   s    D"g.     c                     t         j                         du rt         j                  |        y t         j                          y r   )r   r   prunepruneAll)accountss    r   r   r   0   s+    $x r   c                      t         j                         duryt         j                         durt         j                          yy)zWrite the mbnames file.TN)r   r   get_incrementalwrite r   r   r#   r#   9   s8     D(!- .r   c                     t         j                         duryt         j                  |        t         j                         du rt         j	                          yy)z Write intermediate mbnames file.TN)r   r   writeIntermediateFiler"   r#   )r   s    r   r&   r&   E   sF     D("";/!T) *r   c                   (    e Zd ZdZd Zd Zd Zd Zy)_IntermediateMbnameszmbnames data for one account.c                     || _         g | _        || _        || _        || _        t        j                  |d|z        | _        || _        y )Nz%s.json)	r   _foldernames_accountname_folder_root_folderfilterr   join_path_dryrun)selfr   r   
mbnamesdirfolderfilterr   r   s          r   __init__z_IntermediateMbnames.__init__T   sI     '')YYz9{+BC
r   c                 X    || j                   vr| j                   j                  |       y y r   )r*   append)r1   r   s     r   r   z_IntermediateMbnames.add_   s)    T...$$Z0 /r   c                     | j                   S r   )r,   r1   s    r   get_folder_rootz$_IntermediateMbnames.get_folder_rootc   s       r   c                    g }| j                   D ]H  }| j                  | j                  |      s |j                  | j                  || j                  d       J | j
                  r)| j                  j                  d| j                  z         yt        | j                  dd      5 }t        j                  ||       ddd       y# 1 sw Y   yxY w)z/Write intermediate mbnames file in JSON format.)r   r   localfoldersmbnames would write %swutf-8encodingN)r*   r-   r+   r6   r,   r0   r   infor/   openjsondump)r1   itemlistr   intermediateFDs       r   r#   z_IntermediateMbnames.writef   s     ++ 	J!!$"3"3Z@#'#4#4",$($5$5! 	 <<GGLL1DJJ>?JJg7 4:H		(N34 4 4s   'CCN)__name__
__module____qualname____doc__r4   r   r9   r#   r$   r   r   r(   r(   Q   s    '	1!4r   r(   c                   H    e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zy)r   c                    || _         || _        || _        d | _        i | _        d | _        d | _        d | _        d | _        d | _	        |j                         }t        j                  |j                         d      }d | _        d | _        d | _        d | _        	 | j                  st%        |       || _        	 | j                   j)                  ddd      | _        | j                   j+                  ddd      | _        |j-                  |j+                  dd	            | _        |j-                  |j+                  dd
            | _        |j-                  |j+                  dd            | _        t        j.                  t        j0                  g}|j3                  |j+                  dd      |      | _        | j                   j5                  dd      r7|j-                  | j                   j+                  dd      dt6        i      | _	        | j                   j5                  dd      r8|j-                  | j                   j+                  dd      dt6        i      | _        y y # t&        $ r Y w xY w# t8        $ r Y y w xY w)Nc                      yr   r$   )r   r   s     r   <lambda>z#_Mbnames.__init__.<locals>.<lambda>   s    r   c                     | d   | d   fS )Nr   r   r$   )ds    r   rN   z#_Mbnames.__init__.<locals>.<lambda>   s    -(8!L/'J r   mbnamesenabledFperitem   )rawheadersepfooterfilenamesort_keyfuncrer3   )_configr   r0   _enabled_intermediates_incremental_mbnamesdirr/   r-   _func_sortkeygetlocalevalr   r.   getmetadatadir_peritem_header_sep_footerr   OSErrorgetdefaultbooleangeteval
expanduser
expandvarsapply_xforms
has_optionr[   r	   )r1   configr   r   	localevalr2   xformss          r   r4   z_Mbnames.__init__|   s#     
AJ'')	YYv446	B
		<<$ &	 LL::9e-DM LL,,Y	q,IDM$>>&**Y*IJDL!vzz)U'CDDI$>>&**Y*IJDLoot7F,,

9j16;DJ ||&&y.A%.^^LL$$Y?$&M" ||&&y.A%.^^LL$$Y?$&M" B)  		.  		s%   I 9F$I/ 	I,+I,/	I;:I;c              #      K   t        | j                        D ]E  }t        j                  | j                  |      }t        j                  |      s9|dd  dk(  sB| G y w)Nz.json)r   r`   r   r.   isfile)r1   foos     r   _iterIntermediateFilesz_Mbnames._iterIntermediateFiles   sT     4++, 	C))D,,c2C{{3CH$7		s   AA!A!A!c                     | j                   r| j                  j                  d|z         y t        |       | j                  j                  d|z         y )Nzmbnames would remove %sz
removed %s)r0   r   rA   r   )r1   r   s     r   _removeIntermediateFilez _Mbnames._removeIntermediateFile   s;    <<GGLL2T9:4LGGLL,-r   c                     || j                   vrEt        ||| j                  | j                  | j                  | j
                        | j                   |<   | j                   |   j                  |       y)z$Add foldername entry for an account.N)r^   r(   r`   r-   r0   r   r   )r1   r   r   r   s       r   r   z_Mbnames.addAccountFolder   sh     d111/C  ""0D, 	K(,,Z8r   c                 v    | j                   "| j                  j                  ddd      | _         | j                   S )NrQ   incrementalF)r_   r\   ri   r8   s    r   r"   z_Mbnames.get_incremental   s:    $ $ > >=%!1D    r   c                     | j                   S r   )r]   r8   s    r   r   z_Mbnames.is_enabled   s    }}r   c                     d}| j                         D ]4  }t        j                  |      }|d d }||vs"d}| j                  |       6 |du r| j                  j                  d       y y )NFrt   Tzno cache file to remove)rw   r   basenamery   r   rA   )r1   r    removalsintermediateFilerY   r   s         r   r   z_Mbnames.prune   sv     $ ; ; = 	?}}%56H"3B-K(*,,-=>	? uGGLL23 r   c                 P    | j                         D ]  }| j                  |        y r   )rw   ry   )r1   r   s     r   r   z_Mbnames.pruneAll   s*     $ ; ; = 	;(()9:	;r   c           
      |   g }| j                         D ]F  }	 t        |dd      5 }t        j                  |      D ]  }|j	                  |        	 d d d        H |j                  | j                         |D cg c]  }| j                  |z   }}| j                  r)| j                  j!                  d	| j"                  z         y 	 t        | j"                  d
d      5 }|j%                  | j&                         |j%                  | j(                  j+                  |             |j%                  | j,                         d d d        y # 1 sw Y   xY w# t
        t        f$ r5}| j                  j                  d|dt        |             Y d }~d }~wt        $ r6}| j                  j                  |t               d   d|z         Y d }~d }~ww xY wc c}w # 1 sw Y   y xY w# t
        t        f$ r?}| j                  j                  |t               d   d| j"                  z         Y d }~y d }~ww xY w)Nrr>   r?   z*could not read intermediate mbnames file 'z':   z.intermediate mbnames file %s not properly read)keyr<   r=   z$mbnames file %s not properly written)rw   rB   rC   loadr6   rh   IOErrorr   errorstr	Exceptionr   sortra   rd   r0   rA   r/   r#   re   rf   r.   rg   )r1   rE   r   rF   itemerP   mbnamesFiles           r   r#   z_Mbnames.write   s    $ ; ; = 	(#A .DR $		. 9 . -..	" 	$,,-/78!DMMA%88<<GGLL1DJJ>?

C'; 4>I%%dll3%%diinnX&>?%%dll3	4 4-. . W% A&6A@ A A JqME%&  94 4
 W% JqM:TZZG sw   E,EE<G
G- "A!G!G- E	EG'*FG#+GG!G*&G- *G- -H;<5H66H;c                     	 | j                   |   j                          y # t        t        f$ r?}| j                  j                  |t               d   d| j                  z         Y d }~y d }~ww xY w)Nr   z1intermediate mbnames file %s not properly written)r^   r#   rh   r   r   r   r   r/   )r1   r   r   s      r   r&   z_Mbnames.writeIntermediateFile  s`    	,224! 	GGMM
1CdjjP 	s     A.5A))A.N)rG   rH   rI   r4   rw   ry   r   r"   r   r   r   r#   r&   r$   r   r   r   r   {   s6    0d.9!
4;%Nr   r   )r[   rC   	threadingr   osr   r   r   r   sysr   configparserr	   r   r   r   r   r   r#   r&   r(   r   r$   r   r   <module>r      sY   & 
   . .  '
&H/	'4 '4TX Xr   