B
    2*™\´s ã               @   sn  d Z dZdZddlmZ ddlZddlZddlZddl	Z	ddl
Z
ddlZddlZddlZddlZyddlZW n ek
r„   dZY nX yddlZW n ek
rª   dZY nX eefZyeef7 ZW n ek
rÖ   Y nX dddd	d
ddddddddddgZdZdZed ZdZdZdZdZdZdZ dZ!dZ"dZ#dZ$d Z%d!Z&d"Z'd#Z(d$Z)d%Z*d&Z+d'Z,d(Z-d)Z.dZ/d*Z0d+Z1e0Z2e e!e"e#e&e'e(e$e%e)e*e+fZ3e e!e(e+fZ4e)e*e+fZ5d,Z6d-d.d/d0hZ7e8e8e8e9e9e9d1œZ:ej;d2krÐd3Z<ne =¡ Z<d4d5„ Z>d6d7„ Z?d8d9„ Z@d:e2fd;d<„ZAd=d>„ ZBdedfd?d@„ZCdAdB„ ZDdCdD„ ZEG dEd	„ d	eFƒZGG dFd„ deGƒZHG dGd
„ d
eGƒZIG dHd„ deGƒZJG dId„ deGƒZKG dJd„ deGƒZLG dKdL„ dLeLƒZMG dMdN„ dNeLƒZNG dOdP„ dPeLƒZOG dQdR„ dReLƒZPG dSdT„ dTeLƒZQG dUdV„ dVƒZRG dWdX„ dXƒZSG dYdZ„ dZeTƒZUG d[d\„ d\eTƒZVG d]d^„ d^ejWƒZXG d_d„ deTƒZYG d`d„ deTƒZZdad„ Z[eZjZdbdc„ Z\e]ddkrje\ƒ  dS )ez0.9.0u"   Lars GustÃ¤bel (lars@gustaebel.de)u4   Gustavo Niemeyer, Niels GustÃ¤bel, Richard Townsend.é    )ÚopenNÚTarFileÚTarInfoÚ
is_tarfileÚTarErrorÚ	ReadErrorÚCompressionErrorÚStreamErrorÚExtractErrorÚHeaderErrorÚENCODINGÚUSTAR_FORMATÚ
GNU_FORMATÚ
PAX_FORMATÚDEFAULT_FORMATr   ó    i   é   s   ustar   s   ustar 00éd   é›   ó   0ó   1ó   2ó   3ó   4ó   5ó   6ó   7ó   Ló   Kó   Só   xó   gó   Xé   é   )ÚpathÚlinkpathÚsizeÚmtimeÚuidÚgidÚunameÚgnamer%   r&   r+   r,   )ZatimeZctimer(   r)   r*   r'   Úntzutf-8c             C   s(   |   ||¡} | d |… |t| ƒ t  S )N)ÚencodeÚlenÚNUL)ÚsÚlengthÚencodingÚerrors© r5   ú2C:\ALexclude\prg\programme\Python37\Lib\tarfile.pyÚstnž   s    r7   c             C   s*   |   d¡}|dkr| d |… } |  ||¡S )Nr   éÿÿÿÿ)ÚfindÚdecode)r1   r3   r4   Úpr5   r5   r6   Únts¤   s    
r<   c             C   sª   | d dkrfd}x0t t| ƒd ƒD ]}|dK }|| |d  7 }q"W | d dkr¦dt| ƒd  |  }n@y"t| ddƒ} t|  ¡ p€d	dƒ}W n tk
r¤   td
ƒ‚Y nX |S )Nr   )é€   éÿ   r#   é   r>   é   ÚasciiÚstrictÚ0zinvalid header)Úranger/   r<   ÚintÚstripÚ
ValueErrorÚInvalidHeaderError)r1   ÚnÚir5   r5   r6   Únti¬   s    rK   r?   c             C   sÜ   t | ƒ} d|   kr$d|d  k rDn ntd|d | f dƒt }n”|tkrÐd|d   |   krrd|d  k rÐn nZ| dkrŠtdgƒ}ntdgƒ}d| |  } x6t|d ƒD ]}| d| d@ ¡ | dL } q®W ntd	ƒ‚|S )
Nr   r?   r#   z%0*orA   r@   r=   r>   zoverflow in number field)rE   Úbytesr0   r   Ú	bytearrayrD   ÚinsertrG   )rI   ÚdigitsÚformatr1   rJ   r5   r5   r6   ÚitnÀ   s     2
rQ   c             C   s0   dt t d| ¡ƒ }dt t d| ¡ƒ }||fS )Nr@   Z
148B8x356BZ
148b8x356b)ÚsumÚstructÚunpack_from)ÚbufZunsigned_chksumZsigned_chksumr5   r5   r6   Úcalc_chksumsÝ   s    	rV   c       	      C   sª   |pd}|dkrd S |d kr.t  | ||¡ d S t||ƒ\}}x8t|ƒD ],}|  |¡}t|ƒ|k rh|dƒ‚| |¡ qFW |dkr¦|  |¡}t|ƒ|k rœ|dƒ‚| |¡ d S )Ni @  r   zunexpected end of data)ÚshutilÚcopyfileobjÚdivmodrD   Úreadr/   Úwrite)	ÚsrcÚdstr2   Ú	exceptionÚbufsizeÚblocksÚ	remainderÚbrU   r5   r5   r6   rX   ê   s$    


rX   c             C   s    dd l }| dtd¡ t | ¡S )Nr   z$deprecated in favor of stat.filemoder$   )ÚwarningsÚwarnÚDeprecationWarningÚstatÚfilemode)Úmoderc   r5   r5   r6   rg     s    rg   c             C   s8   t tjdd ƒ}|d k	r(|  |d¡ |¡} t| dd d S )Nr3   Úbackslashreplaceú )Úend)ÚgetattrÚsysÚstdoutr.   r:   Úprint)r1   r3   r5   r5   r6   Ú_safe_print
  s    rp   c               @   s   e Zd ZdS )r   N)Ú__name__Ú
__module__Ú__qualname__r5   r5   r5   r6   r     s   c               @   s   e Zd ZdS )r
   N)rq   rr   rs   r5   r5   r5   r6   r
     s   c               @   s   e Zd ZdS )r   N)rq   rr   rs   r5   r5   r5   r6   r     s   c               @   s   e Zd ZdS )r   N)rq   rr   rs   r5   r5   r5   r6   r     s   c               @   s   e Zd ZdS )r	   N)rq   rr   rs   r5   r5   r5   r6   r	     s   c               @   s   e Zd ZdS )r   N)rq   rr   rs   r5   r5   r5   r6   r      s   c               @   s   e Zd ZdS )ÚEmptyHeaderErrorN)rq   rr   rs   r5   r5   r5   r6   rt   #  s   rt   c               @   s   e Zd ZdS )ÚTruncatedHeaderErrorN)rq   rr   rs   r5   r5   r5   r6   ru   &  s   ru   c               @   s   e Zd ZdS )ÚEOFHeaderErrorN)rq   rr   rs   r5   r5   r5   r6   rv   )  s   rv   c               @   s   e Zd ZdS )rH   N)rq   rr   rs   r5   r5   r5   r6   rH   ,  s   rH   c               @   s   e Zd ZdS )ÚSubsequentHeaderErrorN)rq   rr   rs   r5   r5   r5   r6   rw   /  s   rw   c               @   s,   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	S )
Ú_LowLevelFilec             C   sF   t jt jt jB t jB dœ| }tt dƒr2|t jO }t  ||d¡| _d S )N)ÚrÚwÚO_BINARYi¶  )	ÚosÚO_RDONLYÚO_WRONLYÚO_CREATÚO_TRUNCÚhasattrr{   r   Úfd)ÚselfÚnamerh   r5   r5   r6   Ú__init__<  s    

z_LowLevelFile.__init__c             C   s   t  | j¡ d S )N)r|   Úcloser‚   )rƒ   r5   r5   r6   r†   E  s    z_LowLevelFile.closec             C   s   t  | j|¡S )N)r|   rZ   r‚   )rƒ   r'   r5   r5   r6   rZ   H  s    z_LowLevelFile.readc             C   s   t  | j|¡ d S )N)r|   r[   r‚   )rƒ   r1   r5   r5   r6   r[   K  s    z_LowLevelFile.writeN)rq   rr   rs   r…   r†   rZ   r[   r5   r5   r5   r6   rx   6  s   	rx   c               @   sp   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	dd„ Z
ddd„Zddd„Zdd„ Zdd„ ZdS )Ú_Streamc       	      C   sä  d| _ |d krt||ƒ}d| _ |dkr6t|ƒ}| ¡ }|p<d| _|| _|| _|| _|| _d| _	d| _
d| _yL|dkrÖydd l}W n tk
rž   tdƒ‚Y nX || _| d¡| _|d	krÌ|  ¡  |j| _n|  ¡  nà|d
kr:ydd l}W n tk
r
   tdƒ‚Y nX |d	kr.d| _| ¡ | _t| _n
| ¡ | _n||dkr ydd l}W n tk
rn   tdƒ‚Y nX |d	kr”d| _| ¡ | _|j| _n
| ¡ | _n|dkr¶td| ƒ‚W n&   | j sÒ| j ¡  d| _‚ Y nX d S )NTFÚ*Ú ó    r   Úgzzzlib module is not availablery   Úbz2zbz2 module is not availableÚxzzlzma module is not availableÚtarzunknown compression type %r) Ú_extfileobjrx   Ú_StreamProxyÚgetcomptyper„   rh   ÚcomptypeÚfileobjr_   rU   ÚposÚclosedÚzlibÚImportErrorr   Úcrc32ÚcrcÚ_init_read_gzÚerrorr^   Ú_init_write_gzrŒ   ÚdbufZBZ2DecompressorÚcmpÚOSErrorZBZ2CompressorÚlzmaZLZMADecompressorÚ	LZMAErrorZLZMACompressorr†   )	rƒ   r„   rh   r’   r“   r_   r–   rŒ   r    r5   r5   r6   r…   Y  sl    












z_Stream.__init__c             C   s   t | dƒr| js|  ¡  d S )Nr•   )r   r•   r†   )rƒ   r5   r5   r6   Ú__del__Ÿ  s    z_Stream.__del__c             C   s‚   | j  d| j j| j j | j jd¡| _t dtt	 	¡ ƒ¡}|  
d| d ¡ | j d¡rf| jd d… | _|  
| j dd	¡t ¡ d S )
Né	   r   z<Ls   ‹s   ÿz.gzéýÿÿÿz
iso-8859-1Úreplace)r–   ZcompressobjZDEFLATEDÚ	MAX_WBITSZDEF_MEM_LEVELrž   rS   ÚpackrE   ÚtimeÚ_Stream__writer„   Úendswithr.   r0   )rƒ   Z	timestampr5   r5   r6   rœ   £  s    z_Stream._init_write_gzc             C   sR   | j dkr| j || j¡| _|  jt|ƒ7  _| j dkrD| j |¡}|  |¡ d S )Nr‹   rŽ   )	r’   r–   r˜   r™   r”   r/   rž   Úcompressr©   )rƒ   r1   r5   r5   r6   r[   ±  s    

z_Stream.writec             C   sR   |  j |7  _ x>t| j ƒ| jkrL| j | j d | j… ¡ | j | jd … | _ qW d S )N)rU   r/   r_   r“   r[   )rƒ   r1   r5   r5   r6   Z__write»  s    z_Stream.__writec             C   s²   | j r
d S d| _ zŠ| jdkr:| jdkr:|  j| j ¡ 7  _| jdkr˜| jr˜| j | j¡ d| _| jdkr˜| j t 	d| j
¡¡ | j t 	d| jd@ ¡¡ W d | js¬| j ¡  X d S )NTrz   rŽ   rŠ   r‹   z<Ll   ÿÿ )r•   rh   r’   rU   rž   Úflushr“   r[   rS   r§   r™   r”   r   r†   )rƒ   r5   r5   r6   r†   Ä  s    
z_Stream.closec             C   sò   | j  | j j ¡| _d| _|  d¡dkr0tdƒ‚|  d¡dkrFtdƒ‚t|  d¡ƒ}|  d¡ |d	@ rt|  d¡ƒd
t|  d¡ƒ  }|  	|¡ |d@ r¶x|  d¡}|r°|t
kršP qšW |d@ rÜx|  d¡}|rÖ|t
krÀP qÀW |d@ rî|  d¡ d S )NrŠ   r$   s   ‹znot a gzip filer#   ó   zunsupported compression methodé   é   r@   r?   é   )r–   Zdecompressobjr¦   rž   r   Ú_Stream__readr   r   ÚordrZ   r0   )rƒ   ÚflagZxlenr1   r5   r5   r6   rš   Ú  s.    
 


z_Stream._init_read_gzc             C   s   | j S )N)r”   )rƒ   r5   r5   r6   Útellù  s    z_Stream.tellr   c             C   s\   || j  dkrNt|| j  | jƒ\}}xt|ƒD ]}|  | j¡ q.W |  |¡ ntdƒ‚| j S )Nr   z seeking backwards is not allowed)r”   rY   r_   rD   rZ   r	   )rƒ   r”   r`   ra   rJ   r5   r5   r6   Úseekþ  s    z_Stream.seekNc             C   sZ   |d kr:g }x |   | j¡}|s P | |¡ qW d |¡}n
|   |¡}|  jt|ƒ7  _|S )NrŠ   )Ú_readr_   ÚappendÚjoinr”   r/   )rƒ   r'   ÚtrU   r5   r5   r6   rZ     s    
z_Stream.readc             C   s°   | j dkr|  |¡S t| jƒ}| jg}xd||k rŠ|  | j¡}|sBP y| j |¡}W n | jk
rp   tdƒ‚Y nX | 	|¡ |t|ƒ7 }q(W d 
|¡}||d … | _|d |… S )NrŽ   zinvalid compressed datarŠ   )r’   r±   r/   r   r_   rž   Z
decompressr^   r   r·   r¸   )rƒ   r'   Úcr¹   rU   r5   r5   r6   r¶     s"    





z_Stream._readc             C   sn   t | jƒ}| jg}x6||k rH| j | j¡}|s0P | |¡ |t |ƒ7 }qW d |¡}||d … | _|d |… S )NrŠ   )r/   rU   r“   rZ   r_   r·   r¸   )rƒ   r'   rº   r¹   rU   r5   r5   r6   Z__read3  s    



z_Stream.__read)r   )N)rq   rr   rs   r…   r¢   rœ   r[   r©   r†   rš   r´   rµ   rZ   r¶   r±   r5   r5   r5   r6   r‡   N  s   F
	

r‡   c               @   s,   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	S )
r   c             C   s   || _ | j  t¡| _d S )N)r“   rZ   Ú	BLOCKSIZErU   )rƒ   r“   r5   r5   r6   r…   I  s    z_StreamProxy.__init__c             C   s   | j j| _| jS )N)r“   rZ   rU   )rƒ   r'   r5   r5   r6   rZ   M  s    
z_StreamProxy.readc             C   sP   | j  d¡rdS | j dd… dkr8| j dd… dkr8d	S | j  d
¡rHdS dS d S )Ns   ‹r‹   r   é   s   BZhr¯   é
   s   1AY&SYrŒ   )s   ]  €s   ý7zXZr   rŽ   )rU   Ú
startswith)rƒ   r5   r5   r6   r‘   Q  s    $z_StreamProxy.getcomptypec             C   s   | j  ¡  d S )N)r“   r†   )rƒ   r5   r5   r6   r†   [  s    z_StreamProxy.closeN)rq   rr   rs   r…   rZ   r‘   r†   r5   r5   r5   r6   r   D  s   
r   c               @   sf   e Zd Zddd„Zdd„ Zdd„ Zdd	„ Zd
d„ Zdd„ Ze	j
fdd„Zddd„Zdd„ Zdd„ ZdS )Ú_FileInFileNc             C   sÎ   || _ || _|| _d| _t|dd ƒ| _d| _|d kr>d|fg}d| _g | _d}| j}xT|D ]L\}}||kr~| j 	d||d f¡ | j 	d||| |f¡ ||7 }|| }qZW || jk rÊ| j 	d|| jd f¡ d S )Nr   r„   FT)
r“   Úoffsetr'   Úpositionrl   r„   r•   Ú	map_indexÚmapr·   )rƒ   r“   rÀ   r'   Z	blockinfoZlastposZrealposr5   r5   r6   r…   h  s(    

z_FileInFile.__init__c             C   s   d S )Nr5   )rƒ   r5   r5   r6   r¬     s    z_FileInFile.flushc             C   s   dS )NTr5   )rƒ   r5   r5   r6   Úreadable„  s    z_FileInFile.readablec             C   s   dS )NFr5   )rƒ   r5   r5   r6   Úwritable‡  s    z_FileInFile.writablec             C   s
   | j  ¡ S )N)r“   Úseekable)rƒ   r5   r5   r6   rÆ   Š  s    z_FileInFile.seekablec             C   s   | j S )N)rÁ   )rƒ   r5   r5   r6   r´     s    z_FileInFile.tellc             C   s   |t jkr tt|dƒ| jƒ| _nj|t jkr\|dk rFt| j| dƒ| _qŠt| j| | jƒ| _n.|t jkr‚tt| j| | jƒdƒ| _ntdƒ‚| jS )Nr   zInvalid argument)	ÚioÚSEEK_SETÚminÚmaxr'   rÁ   ÚSEEK_CURÚSEEK_ENDrG   )rƒ   rÁ   Úwhencer5   r5   r6   rµ   ’  s    


z_FileInFile.seekc       	      C   s  |d kr| j | j }nt|| j | j ƒ}d}xà|dkrxZ| j| j \}}}}|| j  krd|k rln nP q:|  jd7  _| jt| jƒkr:d| _q:W t||| j ƒ}|rè| j || j|  ¡ | j |¡}t|ƒ|krÞt	dƒ‚||7 }n|t
| 7 }||8 }|  j|7  _q.W |S )NrŠ   r   r#   zunexpected end of data)r'   rÁ   rÉ   rÃ   rÂ   r/   r“   rµ   rZ   r   r0   )	rƒ   r'   rU   ÚdataÚstartÚstoprÀ   r2   rb   r5   r5   r6   rZ   ¢  s.    

z_FileInFile.readc             C   s&   |   t|ƒ¡}||d t|ƒ…< t|ƒS )N)rZ   r/   )rƒ   rb   rU   r5   r5   r6   ÚreadintoÁ  s    z_FileInFile.readintoc             C   s
   d| _ d S )NT)r•   )rƒ   r5   r5   r6   r†   Æ  s    z_FileInFile.close)N)N)rq   rr   rs   r…   r¬   rÄ   rÅ   rÆ   r´   rÇ   rÈ   rµ   rZ   rÑ   r†   r5   r5   r5   r6   r¿   b  s   

r¿   c                   s   e Zd Z‡ fdd„Z‡  ZS )ÚExFileObjectc                s&   t |j|j|j|jƒ}tƒ  |¡ d S )N)r¿   r“   Úoffset_datar'   ÚsparseÚsuperr…   )rƒ   ÚtarfileÚtarinfor“   )Ú	__class__r5   r6   r…   Ì  s    
zExFileObject.__init__)rq   rr   rs   r…   Ú__classcell__r5   r5   )rØ   r6   rÒ   Ê  s   rÒ   c               @   sŠ  e Zd ZdZdSdd„Zedd„ ƒZejdd„ ƒZedd	„ ƒZejd
d	„ ƒZdd„ Z	dd„ Z
eedfdd„Zdd„ Zdd„ Zdd„ Zedd„ ƒZdd„ Zedd„ ƒZedd„ ƒZed d!„ ƒZed"d#„ ƒZed$d%„ ƒZed&d'„ ƒZd(d)„ Zd*d+„ Zd,d-„ Zd.d/„ Zd0d1„ Zd2d3„ Z d4d5„ Z!d6d7„ Z"d8d9„ Z#d:d;„ Z$d<d=„ Z%d>d?„ Z&d@dA„ Z'dBdC„ Z(dDdE„ Z)dFdG„ Z*dHdI„ Z+dJdK„ Z,dLdM„ Z-dNdO„ Z.dPdQ„ Z/dRS )Tr   )r„   rh   r)   r*   r'   r(   ÚchksumÚtypeÚlinknamer+   r,   ÚdevmajorÚdevminorrÀ   rÓ   Úpax_headersrÔ   rÖ   Ú_sparse_structsÚ_link_targetr‰   c             C   sj   || _ d| _d| _d| _d| _d| _d| _t| _d| _	d| _
d| _d| _d| _d| _d| _d | _i | _d S )Ni¤  r   r‰   )r„   rh   r)   r*   r'   r(   rÚ   ÚREGTYPErÛ   rÜ   r+   r,   rÝ   rÞ   rÀ   rÓ   rÔ   rß   )rƒ   r„   r5   r5   r6   r…   ã  s"    zTarInfo.__init__c             C   s   | j S )N)r„   )rƒ   r5   r5   r6   r%   ý  s    zTarInfo.pathc             C   s
   || _ d S )N)r„   )rƒ   r„   r5   r5   r6   r%     s    c             C   s   | j S )N)rÜ   )rƒ   r5   r5   r6   r&     s    zTarInfo.linkpathc             C   s
   || _ d S )N)rÜ   )rƒ   rÜ   r5   r5   r6   r&   	  s    c             C   s   d| j j| jt| ƒf S )Nz<%s %r at %#x>)rØ   rq   r„   Úid)rƒ   r5   r5   r6   Ú__repr__  s    zTarInfo.__repr__c             C   sl   | j | jd@ | j| j| j| j| j| j| j| j	| j
| j| jdœ}|d tkrh|d  d¡sh|d  d7  < |S )Niÿ  )r„   rh   r)   r*   r'   r(   rÚ   rÛ   rÜ   r+   r,   rÝ   rÞ   rÛ   r„   ú/)r„   rh   r)   r*   r'   r(   rÚ   rÛ   rÜ   r+   r,   rÝ   rÞ   ÚDIRTYPErª   )rƒ   Úinfor5   r5   r6   Úget_info  s     
zTarInfo.get_infoÚsurrogateescapec             C   sT   |   ¡ }|tkr|  |||¡S |tkr4|  |||¡S |tkrH|  ||¡S tdƒ‚d S )Nzinvalid format)rè   r   Úcreate_ustar_headerr   Úcreate_gnu_headerr   Úcreate_pax_headerrG   )rƒ   rP   r3   r4   rç   r5   r5   r6   Útobuf(  s    zTarInfo.tobufc             C   sn   t |d< t|d  ||¡ƒtkr(tdƒ‚t|d  ||¡ƒtkr^|  |d ||¡\|d< |d< |  |t||¡S )NÚmagicrÜ   zlinkname is too longr„   Úprefix)	ÚPOSIX_MAGICr/   r.   ÚLENGTH_LINKrG   ÚLENGTH_NAMEÚ_posix_split_nameÚ_create_headerr   )rƒ   rç   r3   r4   r5   r5   r6   rê   6  s    zTarInfo.create_ustar_headerc             C   s€   t |d< d}t|d  ||¡ƒtkr<||  |d t||¡7 }t|d  ||¡ƒtkrl||  |d t||¡7 }||  |t	||¡ S )Nrî   rŠ   rÜ   r„   )
Ú	GNU_MAGICr/   r.   rñ   Ú_create_gnu_long_headerÚGNUTYPE_LONGLINKrò   ÚGNUTYPE_LONGNAMErô   r   )rƒ   rç   r3   r4   rU   r5   r5   r6   rë   C  s    zTarInfo.create_gnu_headerc       
   	   C   s0  t |d< | j ¡ }x„ddtfddtfddfD ]h\}}}||kr@q,y||  dd	¡ W n" tk
rv   || ||< w,Y nX t|| ƒ|kr,|| ||< q,W xhd
D ]`\}}||kr¸d||< qž|| }d|  krÜd|d  k rên n
t|t	ƒržt
|ƒ||< d||< qžW |r|  |t|¡}	nd}	|	|  |tdd¡ S )Nrî   r„   r%   rÜ   r&   )r+   r+   é    )r,   r,   rù   rA   rB   ))r)   r?   )r*   r?   )r'   é   )r(   rú   r   r?   r#   rŠ   r¥   )rð   rß   Úcopyrò   rñ   r.   ÚUnicodeEncodeErrorr/   Ú
isinstanceÚfloatÚstrÚ_create_pax_generic_headerÚXHDTYPErô   r   )
rƒ   rç   r3   rß   r„   Zhnamer2   rO   ÚvalrU   r5   r5   r6   rì   Q  s4    
*zTarInfo.create_pax_headerc             C   s   |   |td¡S )Nzutf-8)r   ÚXGLTYPE)Úclsrß   r5   r5   r6   Úcreate_pax_global_header‚  s    z TarInfo.create_pax_global_headerc             C   s€   |  d¡}xltdt|ƒƒD ]R}d |d |… ¡}d ||d … ¡}t| ||¡ƒtkrt| ||¡ƒtkrP qW tdƒ‚||fS )Nrå   r#   zname is too long)ÚsplitrD   r/   r¸   r.   ÚLENGTH_PREFIXrò   rG   )rƒ   r„   r3   r4   Z
componentsrJ   rï   r5   r5   r6   ró   ˆ  s    
zTarInfo._posix_split_namec             C   sV  t |  dd¡d||ƒt|  dd¡d@ d|ƒt|  dd¡d|ƒt|  d	d¡d|ƒt|  d
d¡d|ƒt|  dd¡d|ƒd|  dt¡t |  dd¡d||ƒ|  dt¡t |  dd¡d||ƒt |  dd¡d||ƒt|  dd¡d|ƒt|  dd¡d|ƒt |  dd¡d||ƒg}t dt d |¡¡}t	|t d … ƒd }|d d… t
d| dƒ |dd …  }|S )Nr„   r‰   r   rh   r   iÿ  r?   r)   r*   r'   rú   r(   s           rÛ   rÜ   rî   r+   rù   r,   rÝ   rÞ   rï   r   z%dsrŠ   i”þÿÿz%06o rA   i›þÿÿ)r7   ÚgetrQ   râ   rð   rS   r§   r»   r¸   rV   rL   )rç   rP   r3   r4   ÚpartsrU   rÚ   r5   r5   r6   rô   ˜  s&    

&zTarInfo._create_headerc             C   s.   t t| ƒtƒ\}}|dkr*| t| t 7 } | S )Nr   )rY   r/   r»   r0   )Zpayloadr`   ra   r5   r5   r6   Ú_create_payload´  s    zTarInfo._create_payloadc             C   sR   |  ||¡t }i }d|d< ||d< t|ƒ|d< t|d< |  |t||¡|  |¡ S )Nz././@LongLinkr„   rÛ   r'   rî   )r.   r0   r/   rõ   rô   r   r
  )r  r„   rÛ   r3   r4   rç   r5   r5   r6   rö   ¾  s    zTarInfo._create_gnu_long_headerc          	   C   s:  d}x@|  ¡ D ]4\}}y| dd¡ W q tk
r@   d}P Y qX qW d}|rV|d7 }x |  ¡ D ]”\}}| d¡}|r„| |d¡}n
| d¡}t|ƒt|ƒ d }d	 }	}
x"|tt|
ƒƒ }	|	|
krÆP |	}
q¬W |tt|
ƒd
ƒd | d | d 7 }q`W i }d|d< ||d< t|ƒ|d< t|d< |  |td
d¡|  	|¡ S )NFzutf-8rB   TrŠ   s   21 hdrcharset=BINARY
ré   r¼   r   rA   ó    ó   =ó   
z././@PaxHeaderr„   rÛ   r'   rî   r¥   )
Úitemsr.   rü   r/   rÿ   rL   rð   rô   r   r
  )r  rß   rÛ   r3   ZbinaryÚkeywordÚvalueZrecordsÚlrI   r;   rç   r5   r5   r6   r   Ï  s<    

*z"TarInfo._create_pax_generic_headerc          	   C   st  t |ƒdkrtdƒ‚t |ƒtkr(tdƒ‚| t¡tkr>tdƒ‚t|dd… ƒ}|t|ƒkrbt	dƒ‚| ƒ }t
|dd… ||ƒ|_t|dd	… ƒ|_t|d	d
… ƒ|_t|d
d… ƒ|_t|dd… ƒ|_t|dd… ƒ|_||_|dd… |_t
|dd… ||ƒ|_t
|dd… ||ƒ|_t
|dd… ||ƒ|_t|dd… ƒ|_t|dd… ƒ|_t
|dd… ||ƒ}|jtkr†|j d¡r†t|_|jtkr6d}g }xrtdƒD ]f}	y0t|||d … ƒ}
t||d |d … ƒ}W n tk
rð   P Y nX | |
|f¡ |d7 }q¤W t|d ƒ}t|dd… ƒ}|||f|_ | !¡ rN|j "d¡|_|rp|jt#krp|d |j |_|S )Nr   zempty headerztruncated headerzend of file headeré”   éœ   zbad checksumr   él   ét   é|   éˆ   é   i  i	  i)  iI  iQ  iY  iô  rå   i‚  r¯   rú   é   iâ  iã  iï  )$r/   rt   r»   ru   Úcountr0   rv   rK   rV   rH   r<   r„   rh   r)   r*   r'   r(   rÚ   rÛ   rÜ   r+   r,   rÝ   rÞ   ÚAREGTYPErª   ræ   ÚGNUTYPE_SPARSErD   rG   r·   Úboolrà   ÚisdirÚrstripÚ	GNU_TYPES)r  rU   r3   r4   rÚ   Úobjrï   r”   ÚstructsrJ   rÀ   ÚnumbytesÚ
isextendedÚorigsizer5   r5   r6   Úfrombuf  sZ    
zTarInfo.frombufc             C   s8   |j  t¡}|  ||j|j¡}|j  ¡ t |_| |¡S )N)	r“   rZ   r»   r&  r3   r4   r´   rÀ   Ú_proc_member)r  rÖ   rU   r!  r5   r5   r6   ÚfromtarfileA  s    zTarInfo.fromtarfilec             C   sT   | j ttfkr|  |¡S | j tkr,|  |¡S | j tttfkrF|  	|¡S |  
|¡S d S )N)rÛ   rø   r÷   Ú_proc_gnulongr  Ú_proc_sparser  r  ÚSOLARIS_XHDTYPEÚ	_proc_paxÚ_proc_builtin)rƒ   rÖ   r5   r5   r6   r'  V  s    



zTarInfo._proc_memberc             C   sR   |j  ¡ | _| j}|  ¡ s$| jtkr4||  | j¡7 }||_|  	|j
|j|j¡ | S )N)r“   r´   rÓ   ÚisregrÛ   ÚSUPPORTED_TYPESÚ_blockr'   rÀ   Ú_apply_pax_inforß   r3   r4   )rƒ   rÖ   rÀ   r5   r5   r6   r-  c  s    zTarInfo._proc_builtinc             C   s†   |j  |  | j¡¡}y|  |¡}W n tk
r>   tdƒ‚Y nX | j|_| jt	krft
||j|jƒ|_n| jtkr‚t
||j|jƒ|_|S )Nz missing or bad subsequent header)r“   rZ   r0  r'   r(  r   rw   rÀ   rÛ   rø   r<   r3   r4   r„   r÷   rÜ   )rƒ   rÖ   rU   Únextr5   r5   r6   r)  t  s    

zTarInfo._proc_gnulongc       
   	   C   sÞ   | j \}}}| ` xœ|r¬|j t¡}d}xvtdƒD ]j}y0t|||d … ƒ}t||d |d … ƒ}	W n tk
rz   P Y nX |r’|	r’| ||	f¡ |d7 }q0W t|d ƒ}qW || _	|j 
¡ | _| j|  | j¡ |_|| _| S )Nr   é   rú   r  iø  )rà   r“   rZ   r»   rD   rK   rG   r·   r  rÔ   r´   rÓ   r0  r'   rÀ   )
rƒ   rÖ   r"  r$  r%  rU   r”   rJ   rÀ   r#  r5   r5   r6   r*  Š  s(    zTarInfo._proc_sparsec             C   s   |j  |  | j¡¡}| jtkr&|j}n
|j ¡ }t 	d|¡}|d k	rX| 
d¡ d¡|d< | d¡}|dkrr|j}nd}t d¡}d}x¢| ||¡}|s˜P | ¡ \}	}
t|	ƒ}	|| d¡d | d¡|	 d … }|  |
dd|j¡}
|
tkr|  |||j|j¡}n|  |dd|j¡}|||
< ||	7 }q†W y|  |¡}W n tk
rT   td	ƒ‚Y nX d
|krn|  ||¡ nHd|krˆ|  |||¡ n.| d¡dkr¶| d¡dkr¶|  |||¡ | jttfkr| ||j|j¡ | j |_ d|kr|j!}| "¡ s|jt#kr|| |j¡7 }||_ |S )Ns   \d+ hdrcharset=([^\n]+)\nr#   zutf-8Ú
hdrcharsetZBINARYs   (\d+) ([^=]+)=r   r$   z missing or bad subsequent headerzGNU.sparse.mapzGNU.sparse.sizezGNU.sparse.majorÚ1zGNU.sparse.minorrC   r'   )$r“   rZ   r0  r'   rÛ   r  rß   rû   ÚreÚsearchÚgroupr:   r  r3   ÚcompileÚmatchÚgroupsrE   rk   rÏ   Ú_decode_pax_fieldr4   ÚPAX_NAME_FIELDSr(  r   rw   Ú_proc_gnusparse_01Ú_proc_gnusparse_00Ú_proc_gnusparse_10r  r+  r1  rÀ   rÓ   r.  r/  )rƒ   rÖ   rU   rß   r:  r4  r3   Zregexr”   r2   r  r  r2  rÀ   r5   r5   r6   r,  ¦  s`    



$	





 
zTarInfo._proc_paxc             C   sp   g }x(t  d|¡D ]}| t| d¡ƒ¡ qW g }x(t  d|¡D ]}| t| d¡ƒ¡ q@W tt||ƒƒ|_d S )Ns   \d+ GNU.sparse.offset=(\d+)\nr#   s   \d+ GNU.sparse.numbytes=(\d+)\n)r6  Úfinditerr·   rE   r8  ÚlistÚziprÔ   )rƒ   r2  rß   rU   Zoffsetsr:  r#  r5   r5   r6   r?    s    zTarInfo._proc_gnusparse_00c             C   s@   dd„ |d   d¡D ƒ}tt|d d d… |dd d… ƒƒ|_d S )Nc             S   s   g | ]}t |ƒ‘qS r5   )rE   )Ú.0Úxr5   r5   r6   ú
<listcomp>  s    z.TarInfo._proc_gnusparse_01.<locals>.<listcomp>zGNU.sparse.mapú,r$   r#   )r  rB  rC  rÔ   )rƒ   r2  rß   rÔ   r5   r5   r6   r>    s    zTarInfo._proc_gnusparse_01c             C   s¬   d }g }|j  t¡}| dd¡\}}t|ƒ}xJt|ƒ|d k rvd|krV||j  t¡7 }| dd¡\}}| t|ƒ¡ q.W |j  ¡ |_t	t
|d d d… |dd d… ƒƒ|_d S )Nr  r#   r$   )r“   rZ   r»   r  rE   r/   r·   r´   rÓ   rB  rC  rÔ   )rƒ   r2  rß   rÖ   ZfieldsrÔ   rU   Znumberr5   r5   r6   r@    s    zTarInfo._proc_gnusparse_10c          	   C   sÆ   x¶|  ¡ D ]ª\}}|dkr(t| d|ƒ q
|dkrBt| dt|ƒƒ q
|dkr\t| dt|ƒƒ q
|tkr
|tkr–yt| |ƒ}W n tk
r”   d}Y nX |dkr¨| d¡}t| ||ƒ q
W | ¡ | _d S )NzGNU.sparse.namer%   zGNU.sparse.sizer'   zGNU.sparse.realsizer   rå   )	r  ÚsetattrrE   Ú
PAX_FIELDSÚPAX_NUMBER_FIELDSrG   r  rû   rß   )rƒ   rß   r3   r4   r  r  r5   r5   r6   r1  -  s"    

zTarInfo._apply_pax_infoc             C   s.   y|  |d¡S  tk
r(   |  ||¡S X d S )NrB   )r:   ÚUnicodeDecodeError)rƒ   r  r3   Zfallback_encodingZfallback_errorsr5   r5   r6   r<  D  s    zTarInfo._decode_pax_fieldc             C   s"   t |tƒ\}}|r|d7 }|t S )Nr#   )rY   r»   )rƒ   r  r`   ra   r5   r5   r6   r0  L  s    zTarInfo._blockc             C   s
   | j tkS )N)rÛ   ÚREGULAR_TYPES)rƒ   r5   r5   r6   r.  U  s    zTarInfo.isregc             C   s   |   ¡ S )N)r.  )rƒ   r5   r5   r6   ÚisfileW  s    zTarInfo.isfilec             C   s
   | j tkS )N)rÛ   ræ   )rƒ   r5   r5   r6   r  Y  s    zTarInfo.isdirc             C   s
   | j tkS )N)rÛ   ÚSYMTYPE)rƒ   r5   r5   r6   Úissym[  s    zTarInfo.issymc             C   s
   | j tkS )N)rÛ   ÚLNKTYPE)rƒ   r5   r5   r6   Úislnk]  s    zTarInfo.islnkc             C   s
   | j tkS )N)rÛ   ÚCHRTYPE)rƒ   r5   r5   r6   Úischr_  s    zTarInfo.ischrc             C   s
   | j tkS )N)rÛ   ÚBLKTYPE)rƒ   r5   r5   r6   Úisblka  s    zTarInfo.isblkc             C   s
   | j tkS )N)rÛ   ÚFIFOTYPE)rƒ   r5   r5   r6   Úisfifoc  s    zTarInfo.isfifoc             C   s
   | j d k	S )N)rÔ   )rƒ   r5   r5   r6   Úissparsee  s    zTarInfo.issparsec             C   s   | j tttfkS )N)rÛ   rR  rT  rV  )rƒ   r5   r5   r6   Úisdevg  s    zTarInfo.isdevN)r‰   )0rq   rr   rs   Ú	__slots__r…   Úpropertyr%   Úsetterr&   rä   rè   r   r   rí   rê   rë   rì   Úclassmethodr  ró   Ústaticmethodrô   r
  rö   r   r&  r(  r'  r-  r)  r*  r,  r?  r>  r@  r1  r<  r0  r.  rM  r  rO  rQ  rS  rU  rW  rX  rY  r5   r5   r5   r6   r   Õ  sR   
1
3?f	c               @   s°  e Zd ZdZdZdZdZeZe	Z
dZeZeZd[dd„Zedddefd	d
„ƒZed\dd„ƒZed]dd„ƒZed^dd„ƒZed_dd„ƒZdddddœZdd„ Zdd„ Zdd„ Zdd „ Zd`d!d"„Zdadd$œd%d&„Zdbdd'œd(d)„Zdcd*d+„Z dddd-œd.d/„Z!dedd-œd1d2„Z"d3d4„ Z#dfd5d6„Z$d7d8„ Z%d9d:„ Z&d;d<„ Z'd=d>„ Z(d?d@„ Z)dAdB„ Z*dCdD„ Z+dEdF„ Z,dGdH„ Z-dIdJ„ Z.dgdKdL„Z/dMdN„ Z0dhdOdP„Z1dQdR„ Z2dSdT„ Z3dUdV„ Z4dWdX„ Z5dYdZ„ Z6dS )ir   r   Fr#   Nry   ré   c          
   C   sª  dddddœ}||krt dƒ‚|| _|| | _|sh| jdkrTtj |¡sTd| _d| _t|| jƒ}d	| _n@|d krt|d
ƒrt	|j
ttfƒr|j
}t|dƒr¢|j| _d| _|r¸tj |¡nd | _
|| _|d k	rÒ|| _|d k	rà|| _|d k	rî|| _|d k	rü|| _|d k	r|| _|	| _|
d k	r0| jtkr0|
| _ni | _|d k	rF|| _|d k	rV|| _|| _d	| _g | _d	| _| j ¡ | _i | _yþ| jdkržd | _ |  !¡ | _ | jdkr2x†| j "| j¡ y| j #| ¡}| j $|¡ W nT t%k
rü   | j "| j¡ P Y n0 t&k
r* } zt't|ƒƒ‚W d d }~X Y nX q¬W | jdkr|d| _| jr|| j (| j )¡ ¡}| j *|¡ |  jt+|ƒ7  _W n&   | js˜| j ,¡  d| _‚ Y nX d S )NÚrbzr+bÚwbZxb)ry   Úarz   rE  z!mode must be 'r', 'a', 'w' or 'x'ra  rz   Fr„   rh   Try   )ra  rz   rE  )-rG   rh   Ú_moder|   r%   ÚexistsÚ	bltn_openr   r   rý   r„   rÿ   rL   Úabspathr“   rP   r×   ÚdereferenceÚignore_zerosr3   r4   r   rß   ÚdebugÚ
errorlevelÚcopybufsizer•   ÚmembersÚ_loadedr´   rÀ   ÚinodesÚfirstmemberr2  rµ   r(  r·   rv   r   r   r  rû   r[   r/   r†   )rƒ   r„   rh   r“   rP   r×   rf  rg  r3   r4   rß   rh  ri  rj  ZmodesÚerU   r5   r5   r6   r…   …  sŠ    





$
zTarFile.__init__c          
      s¶  |s|st dƒ‚|dkr¦‡ fdd„}xttˆ j|dD ]b}tˆ ˆ j| ƒ}|d k	rX| ¡ }	y||d|f|ŽS  ttfk
r”   |d k	rŽ| |	¡ w4Y q4X q4W tdƒ‚nd|kr| dd	¡\}
}|
pÆd}
|pÎd
}|ˆ jkrìtˆ ˆ j| ƒ}ntd| ƒ‚|||
|f|ŽS d|krŽ| dd	¡\}
}|
p*d}
|p4d
}|
dkrHt dƒ‚t	||
|||ƒ}yˆ ||
|f|Ž}W n   | 
¡  ‚ Y nX d|_|S |dkrªˆ j|||f|ŽS t dƒ‚d S )Nznothing to open)ry   zr:*c                s   ˆ j |  dkS )NÚtaropen)Ú	OPEN_METH)r’   )r  r5   r6   Únot_compressed  s    z$TarFile.open.<locals>.not_compressed)Úkeyry   z%file could not be opened successfullyú:r#   rŽ   zunknown compression type %rú|)ry   rz   zmode must be 'r' or 'w'F)ra  rz   rE  zundiscernible mode)rG   Úsortedrq  rl   r´   r   r   rµ   r  r‡   r†   r   rp  )r  r„   rh   r“   r_   Úkwargsrr  r’   ÚfuncZ	saved_posrg   Ústreamr¹   r5   )r  r6   r   ô  sP    %







zTarFile.openc             K   s    |dkrt dƒ‚| |||f|ŽS )N)ry   ra  rz   rE  z!mode must be 'r', 'a', 'w' or 'x')rG   )r  r„   rh   r“   rw  r5   r5   r6   rp  O  s    zTarFile.taropenr£   c          	   K   sð   |dkrt dƒ‚ydd l}|j W n  ttfk
rB   tdƒ‚Y nX y| ||d ||¡}W n. tk
rŠ   |d k	r„|dkr„tdƒ‚‚ Y nX y| j|||f|Ž}W nB tk
rÐ   | 	¡  |dkrÊtdƒ‚‚ Y n   | 	¡  ‚ Y nX d|_
|S )	N)ry   rz   rE  zmode must be 'r', 'w' or 'x'r   zgzip module is not availablerb   ry   znot a gzip fileF)rG   ÚgzipZGzipFiler—   ÚAttributeErrorr   rŸ   r   rp  r†   r   )r  r„   rh   r“   Úcompresslevelrw  rz  r¹   r5   r5   r6   ÚgzopenW  s2    
zTarFile.gzopenc          	   K   s¶   |dkrt dƒ‚ydd l}W n tk
r8   tdƒ‚Y nX |j|pD|||d}y| j|||f|Ž}W nF ttfk
r–   | ¡  |dkrt	dƒ‚‚ Y n   | ¡  ‚ Y nX d|_
|S )	N)ry   rz   rE  zmode must be 'r', 'w' or 'x'r   zbz2 module is not available)r|  ry   znot a bzip2 fileF)rG   rŒ   r—   r   ZBZ2Filerp  rŸ   ÚEOFErrorr†   r   r   )r  r„   rh   r“   r|  rw  rŒ   r¹   r5   r5   r6   Úbz2openy  s(    zTarFile.bz2openc          	   K   s¸   |dkrt dƒ‚ydd l}W n tk
r8   tdƒ‚Y nX |j|pD|||d}y| j|||f|Ž}W nH |jtfk
r˜   | ¡  |dkr’t	dƒ‚‚ Y n   | ¡  ‚ Y nX d|_
|S )	N)ry   rz   rE  zmode must be 'r', 'w' or 'x'r   zlzma module is not available)Úpresetry   znot an lzma fileF)rG   r    r—   r   ZLZMAFilerp  r¡   r~  r†   r   r   )r  r„   rh   r“   r€  rw  r    r¹   r5   r5   r6   Úxzopen–  s&    zTarFile.xzopenrp  r}  r  r  )rŽ   r‹   rŒ   r   c             C   sˆ   | j r
d S d| _ z`| jdkrn| j ttd  ¡ |  jtd 7  _t| jtƒ\}}|dkrn| j tt|  ¡ W d | j	s‚| j 
¡  X d S )NT)ra  rz   rE  r$   r   )r•   rh   r“   r[   r0   r»   rÀ   rY   Ú
RECORDSIZEr   r†   )rƒ   r`   ra   r5   r5   r6   r†   ½  s    
zTarFile.closec             C   s"   |   |¡}|d krtd| ƒ‚|S )Nzfilename %r not found)Ú
_getmemberÚKeyError)rƒ   r„   r×   r5   r5   r6   Ú	getmemberÒ  s    
zTarFile.getmemberc             C   s   |   ¡  | js|  ¡  | jS )N)Ú_checkrl  Ú_loadrk  )rƒ   r5   r5   r6   Ú
getmembersÝ  s    zTarFile.getmembersc             C   s   dd„ |   ¡ D ƒS )Nc             S   s   g | ]
}|j ‘qS r5   )r„   )rD  r×   r5   r5   r6   rF  ë  s    z$TarFile.getnames.<locals>.<listcomp>)rˆ  )rƒ   r5   r5   r6   Úgetnamesç  s    zTarFile.getnamesc             C   sl  |   d¡ |d k	r|j}|d kr$|}tj |¡\}}| tjd¡}| d¡}|  ¡ }| |_	|d krŠt
tdƒr~| js~t |¡}q˜t |¡}nt | ¡ ¡}d}|j}t |¡r|j|jf}	| jsò|jdkrò|	| jkrò|| j|	 kròt}
| j|	 }nt}
|	d rt|| j|	< nht |¡rt}
nVt |¡r0t}
nDt |¡rLt}
t |¡}n(t |¡r^t }
nt !|¡rpt"}
nd S ||_||_#|j$|_%|j&|_'|
tkr¤|j(|_)nd|_)|j*|_+|
|_,||_-t.ròyt. /|j%¡d |_0W n t1k
rð   Y nX t2r&yt2 3|j'¡d |_4W n t1k
r$   Y nX |
t t"fkrht
tdƒrht
tdƒrht 5|j6¡|_7t 8|j6¡|_9|S )	NÚawxrå   Úlstatr‰   r#   r   ÚmajorÚminor):r†  r„   r|   r%   Ú
splitdriver¥   ÚsepÚlstripr×   rÖ   r   rf  r‹  rf   ÚfstatÚfilenoÚst_modeÚS_ISREGÚst_inoÚst_devÚst_nlinkrm  rP  râ   ÚS_ISDIRræ   ÚS_ISFIFOrV  ÚS_ISLNKrN  ÚreadlinkÚS_ISCHRrR  ÚS_ISBLKrT  rh   Úst_uidr)   Úst_gidr*   Úst_sizer'   Úst_mtimer(   rÛ   rÜ   ÚpwdZgetpwuidr+   r„  ÚgrpZgetgrgidr,   rŒ  Zst_rdevrÝ   r  rÞ   )rƒ   r„   Úarcnamer“   Zdrvr×   ZstatresrÜ   ZstmdÚinoderÛ   r5   r5   r6   Ú
gettarinfoí  s~    	




zTarFile.gettarinfoT)rk  c            C   sþ   |   ¡  |d kr| }xä|D ]Ü}|r¦tt |j¡ƒ td|jp@|j|jpJ|jf ƒ | 	¡ sb| 
¡ r|tdd|j|jf  ƒ ntd|j ƒ tdt |j¡d d…  ƒ t|j| ¡ r¸dnd ƒ |rð| ¡ rÚtd	|j ƒ | ¡ rðtd
|j ƒ tƒ  qW d S )Nz%s/%sz%10sz%d,%dz%10dz%d-%02d-%02d %02d:%02d:%02dr®   rå   r‰   z-> zlink to )r†  rp   rf   rg   rh   r+   r)   r,   r*   rS  rU  rÝ   rÞ   r'   r¨   Z	localtimer(   r„   r  rO  rÜ   rQ  ro   )rƒ   Úverboserk  r×   r5   r5   r6   rB  Q  s*    
zTarFile.list)Úfilterc         	   C   s:  |   d¡ |d kr|}| jd k	rFtj |¡| jkrF|  dd| ¡ d S |  d|¡ |  ||¡}|d krz|  dd| ¡ d S |d k	r¦||ƒ}|d kr¦|  dd| ¡ d S | ¡ rÒt|dƒ}|  	||¡ W d Q R X nd| 
¡ r,|  	|¡ |r6xHtt |¡ƒD ]*}| jtj ||¡tj ||¡||d qüW n
|  	|¡ d S )	NrŠ  r$   ztarfile: Skipped %rr#   ztarfile: Unsupported type %rztarfile: Excluded %rr_  )r¨  )r†  r„   r|   r%   re  Ú_dbgr¦  r.  rd  Úaddfiler  rv  ÚlistdirÚaddr¸   )rƒ   r„   r¤  Ú	recursiver¨  r×   Úfr5   r5   r6   r¬  q  s4    



zTarFile.addc             C   s¾   |   d¡ t |¡}| | j| j| j¡}| j |¡ |  jt	|ƒ7  _| j
}|d k	r®t|| j|j|d t|jtƒ\}}|dkrœ| j tt|  ¡ |d7 }|  j|t 7  _| j |¡ d S )NrŠ  )r_   r   r#   )r†  rû   rí   rP   r3   r4   r“   r[   rÀ   r/   rj  rX   r'   rY   r»   r0   rk  r·   )rƒ   r×   r“   rU   r_   r`   ra   r5   r5   r6   rª  ¤  s    

zTarFile.addfileÚ.)Únumeric_ownerc            C   s   g }|d kr| }xF|D ]>}|  ¡ r<| |¡ t |¡}d|_| j|||  ¡  |d qW |jdd„ d | ¡  xŠ|D ]‚}tj 	||j
¡}y,| j|||d |  ||¡ |  ||¡ W qv tk
rö } z"| jdkrÖ‚ n|  dd| ¡ W d d }~X Y qvX qvW d S )	NiÀ  )Ú	set_attrsr°  c             S   s   | j S )N)r„   )ra  r5   r5   r6   Ú<lambda>Õ  rŠ   z$TarFile.extractall.<locals>.<lambda>)rs  )r°  r#   ztarfile: %s)r  r·   rû   rh   ÚextractÚsortÚreverser|   r%   r¸   r„   ÚchownÚutimeÚchmodr
   ri  r©  )rƒ   r%   rk  r°  Zdirectoriesr×   Zdirpathro  r5   r5   r6   Ú
extractall½  s,    




zTarFile.extractallr‰   c         
   C   s  |   d¡ t|tƒr |  |¡}n|}| ¡ r>tj ||j¡|_	y"| j
|tj ||j¡||d W n¦ tk
rÆ } zH| jdkr€‚ n6|jd krž|  dd|j ¡ n|  dd|j|jf ¡ W d d }~X Y nB tk
r } z"| jdkræ‚ n|  dd| ¡ W d d }~X Y nX d S )Nry   )r±  r°  r   r#   ztarfile: %sztarfile: %s %r)r†  rý   rÿ   r…  rQ  r|   r%   r¸   rÜ   rá   Ú_extract_memberr„   rŸ   ri  Úfilenamer©  Ústrerrorr
   )rƒ   Úmemberr%   r±  r°  r×   ro  r5   r5   r6   r³  å  s(    	



(
zTarFile.extractc             C   s‚   |   d¡ t|tƒr |  |¡}n|}| ¡ s6|jtkrB|  | |¡S | ¡ sR| 	¡ rzt| j
tƒrhtdƒ‚q~|  |  |¡¡S nd S d S )Nry   z'cannot extract (sym)link as file object)r†  rý   rÿ   r…  r.  rÛ   r/  Ú
fileobjectrQ  rO  r“   r‡   r	   ÚextractfileÚ_find_link_target)rƒ   r½  r×   r5   r5   r6   r¿    s    


zTarFile.extractfilec             C   sT  |  d¡}| dtj¡}tj |¡}|r>tj |¡s>t |¡ | ¡ sN| 	¡ rh|  
dd|j|jf ¡ n|  
d|j¡ | ¡ rŒ|  ||¡ nŽ| ¡ r¢|  ||¡ nx| ¡ r¸|  ||¡ nb| ¡ sÈ| ¡ rÖ|  ||¡ nD| ¡ sæ| 	¡ rô|  ||¡ n&|jtkr|  ||¡ n|  ||¡ |rP|  |||¡ | 	¡ sP|  ||¡ |  ||¡ d S )Nrå   r#   z%s -> %s)r  r¥   r|   r  r%   Údirnamerc  ÚmakedirsrQ  rO  r©  r„   rÜ   r.  Úmakefiler  ÚmakedirrW  ÚmakefiforS  rU  ÚmakedevÚmakelinkrÛ   r/  Úmakeunknownr¶  r¸  r·  )rƒ   r×   Ú
targetpathr±  r°  Z	upperdirsr5   r5   r6   rº  *  s4    


zTarFile._extract_memberc             C   s*   yt  |d¡ W n tk
r$   Y nX d S )NiÀ  )r|   ÚmkdirÚFileExistsError)rƒ   r×   rÉ  r5   r5   r6   rÄ  [  s    zTarFile.makedirc          	   C   s’   | j }| |j¡ | j}t|dƒf}|jd k	rrx,|jD ]"\}}| |¡ t|||t|ƒ q6W | |j¡ | 	¡  nt|||jt|ƒ W d Q R X d S )Nr`  )
r“   rµ   rÓ   rj  rd  rÔ   rX   r   r'   Útruncate)rƒ   r×   rÉ  Úsourcer_   ÚtargetrÀ   r'   r5   r5   r6   rÃ  e  s    


zTarFile.makefilec             C   s"   |   ||¡ |  dd|j ¡ d S )Nr#   z9tarfile: Unknown file type %r, extracted as regular file.)rÃ  r©  rÛ   )rƒ   r×   rÉ  r5   r5   r6   rÈ  u  s    zTarFile.makeunknownc             C   s"   t tdƒrt |¡ ntdƒ‚d S )NÚmkfifozfifo not supported by system)r   r|   rÏ  r
   )rƒ   r×   rÉ  r5   r5   r6   rÅ  }  s    
zTarFile.makefifoc             C   s^   t tdƒrt tdƒstdƒ‚|j}| ¡ r6|tjO }n
|tjO }t ||t 	|j
|j¡¡ d S )NÚmknodrÆ  z'special devices not supported by system)r   r|   r
   rh   rU  rf   ÚS_IFBLKÚS_IFCHRrÐ  rÆ  rÝ   rÞ   )rƒ   r×   rÉ  rh   r5   r5   r6   rÆ  …  s    
zTarFile.makedevc             C   sš   yL|  ¡ rt |j|¡ n0tj |j¡r8t |j|¡ n|  |  	|¡|¡ W nH t
k
r”   y|  |  	|¡|¡ W n tk
rŽ   tdƒ‚Y nX Y nX d S )Nz%unable to resolve link inside archive)rO  r|   ÚsymlinkrÜ   r%   rc  rá   Úlinkrº  rÀ  Úsymlink_exceptionr„  r
   )rƒ   r×   rÉ  r5   r5   r6   rÇ  ”  s    

zTarFile.makelinkc             C   sØ   t tdƒrÔt ¡ dkrÔ|j}|j}|s‚ytr<t |j¡d }W n tk
rR   Y nX yt	rjt	 
|j¡d }W n tk
r€   Y nX y4| ¡ r¦t tdƒr¦t |||¡ nt |||¡ W n tk
rÒ   tdƒ‚Y nX d S )NÚgeteuidr   r$   Úlchownzcould not change owner)r   r|   rÖ  r*   r)   r£  Zgetgrnamr,   r„  r¢  Zgetpwnamr+   rO  r×  r¶  rŸ   r
   )rƒ   r×   rÉ  r°  ÚgÚur5   r5   r6   r¶  «  s(    zTarFile.chownc             C   s>   t tdƒr:yt ||j¡ W n tk
r8   tdƒ‚Y nX d S )Nr¸  zcould not change mode)r   r|   r¸  rh   rŸ   r
   )rƒ   r×   rÉ  r5   r5   r6   r¸  È  s
    
zTarFile.chmodc             C   sH   t tdƒsd S yt ||j|jf¡ W n tk
rB   tdƒ‚Y nX d S )Nr·  z"could not change modification time)r   r|   r·  r(   rŸ   r
   )rƒ   r×   rÉ  r5   r5   r6   r·  Ñ  s    
zTarFile.utimec          
   C   sæ  |   d¡ | jd k	r$| j}d | _|S | j| j ¡ krZ| j | jd ¡ | j d¡sZtdƒ‚d }xby| j 	| ¡}W nH t
k
rÂ } z0| jr²|  dd| j|f ¡ |  jt7  _wbW d d }~X Y nü tk
r, } zL| jr|  dd| j|f ¡ |  jt7  _wbn| jdkrtt|ƒƒ‚W d d }~X Y n’ tk
rT   | jdkrPtdƒ‚Y nj tk
rŽ } z| jdkr~tt|ƒƒ‚W d d }~X Y n0 tk
r¼ } ztt|ƒƒ‚W d d }~X Y nX P qbW |d k	rÜ| j |¡ nd| _|S )	NZrar#   zunexpected end of datar$   z0x%X: %sr   z
empty fileT)r†  rn  rÀ   r“   r´   rµ   rZ   r   r×   r(  rv   rg  r©  r»   rH   rÿ   rt   ru   rw   rk  r·   rl  )rƒ   Úmr×   ro  r5   r5   r6   r2  Ü  sL    


zTarFile.nextc             C   sn   |   ¡ }|d k	r"|d | |¡… }|r2tj |¡}x6t|ƒD ]*}|rTtj |j¡}n|j}||kr<|S q<W d S )N)rˆ  Úindexr|   r%   ÚnormpathÚreversedr„   )rƒ   r„   r×   Ú	normalizerk  r½  Úmember_namer5   r5   r6   rƒ  	  s    zTarFile._getmemberc             C   s"   x|   ¡ }|d krP qW d| _d S )NT)r2  rl  )rƒ   r×   r5   r5   r6   r‡  )	  s
    zTarFile._loadc             C   s:   | j rtd| jj ƒ‚|d k	r6| j|kr6td| j ƒ‚d S )Nz%s is closedzbad operation for mode %r)r•   rŸ   rØ   rq   rh   )rƒ   rh   r5   r5   r6   r†  3	  s    zTarFile._checkc             C   s`   |  ¡ r.d td tj |j¡|jfƒ¡}d }n
|j}|}| j||dd}|d kr\t	d| ƒ‚|S )Nrå   T)r×   rÞ  zlinkname %r not found)
rO  r¸   r¨  r|   r%   rÁ  r„   rÜ   rƒ  r„  )rƒ   r×   rÜ   Úlimitr½  r5   r5   r6   rÀ  <	  s     zTarFile._find_link_targetc             c   sŽ   | j r| jE d H  d S d}| jd k	r:|  ¡ }|d7 }|V  xN|t| jƒk rV| j| }n"| j st|  ¡ }|sxd| _ d S nd S |d7 }|V  q<W d S )Nr   r#   T)rl  rk  rn  r2  r/   )rƒ   rÛ  r×   r5   r5   r6   Ú__iter__O	  s&    
zTarFile.__iter__c             C   s   || j krt|tjd d S )N)Úfile)rh  ro   rm   Ústderr)rƒ   ÚlevelÚmsgr5   r5   r6   r©  n	  s    
zTarFile._dbgc             C   s   |   ¡  | S )N)r†  )rƒ   r5   r5   r6   Ú	__enter__t	  s    zTarFile.__enter__c             C   s,   |d kr|   ¡  n| js"| j  ¡  d| _d S )NT)r†   r   r“   r•   )rƒ   rÛ   r  Ú	tracebackr5   r5   r6   Ú__exit__x	  s
    

zTarFile.__exit__)Nry   NNNNNNré   NNNN)ry   N)ry   Nr£   )ry   Nr£   )ry   NN)NNN)T)NT)N)r¯  N)r‰   T)TF)NF)N)7rq   rr   rs   rh  rf  rg  ri  r   rP   r   r3   r4   r   r×   rÒ   r¾  r…   r]  r‚  r   rp  r}  r  r  rq  r†   r…  rˆ  r‰  r¦  rB  r¬  rª  r¹  r³  r¿  rº  rÄ  rÃ  rÈ  rÅ  rÆ  rÇ  r¶  r¸  r·  r2  rƒ  r‡  r†  rÀ  rá  r©  ræ  rè  r5   r5   r5   r6   r   k  st      
lZ!

d 3
(& 
0
	6


	c             C   s.   yt | ƒ}| ¡  dS  tk
r(   dS X d S )NTF)r   r†   r   )r„   r¹   r5   r5   r6   r   …	  s    c           	   C   sÖ  dd l } d}| j|d}|jdddddd	 |jd
d}|jddddd |jdddddd |jdddddd |jddddd | ¡ }|jd k	r|j}t|ƒrìt|dƒ }| ¡  t	| ¡ t
jd W d Q R X |jrþt	d  |¡ƒ n| d!d" |¡¡ nÐ|jd k	r\|j}t|ƒrFt |d#¡}|j|jd$ W d Q R X n| d!d" |¡¡ nv|jd k	r,t|jƒd!krŠ|jd }tj}n,t|jƒd%kr¦|j\}}n| d!| ¡ ¡ t|ƒrt |d#¡}|j|d& W d Q R X |jr*|d'krd( |¡}	nd) ||¡}	t	|	ƒ n| d!d" |¡¡ n¦|jd k	rÒ|j d¡}
tj |
¡\}}d*d*d+d+d,d,d,d,d-œ}||kr€d.||  nd/}|j}t |
|¡ }x|D ]}| |¡ qžW W d Q R X |jrÒt	d0 |
¡ƒ d S )1Nr   z3A simple command-line interface for tarfile module.)Údescriptionz-vz	--verboseÚ
store_trueFzVerbose output)ÚactionÚdefaultÚhelpT)Úrequiredz-lz--listz	<tarfile>zShow listing of a tarfile)Úmetavarrí  z-ez	--extractú+)z	<tarfile>z<output_dir>zExtract tarfile into target dir)Únargsrï  rí  z-cz--create)z<name>z<file>zCreate tarfile from sourcesz-tz--testzTest if a tarfile is validry   )râ  z{!r} is a tar archive.r#   z{!r} is not a tar archive.
zr:*)r§  r$   )r%   r¯  z{!r} file is extracted.z+{!r} file is extracted into {!r} directory.r‹   r   rŒ   )z.gzz.tgzz.xzz.txzz.bz2z.tbzz.tbz2z.tb2zw:rz   z{!r} file created.)ÚargparseÚArgumentParserÚadd_argumentÚadd_mutually_exclusive_groupÚ
parse_argsZtestr   r   rˆ  ro   rm   rã  r§  rP   ÚexitrB  r   r³  r/   r|   ÚcurdirÚformat_helpr¹  ZcreateÚpopr%   Úsplitextr¬  )rò  ré  Úparserr8  Úargsr\   rŽ   Ztfrø  rå  Ztar_nameÚ_ZextZcompressionsZtar_modeZ	tar_filesÚ	file_namer5   r5   r6   Úmain“	  s†    









r   Ú__main__)^ÚversionÚ
__author__Ú__credits__Úbuiltinsr   rd  rm   r|   rÇ   rW   rf   r¨   rS   rû   r6  r¢  r—   r£  r{  ÚNotImplementedErrorrÕ  rŸ   Ú	NameErrorÚ__all__r0   r»   r‚  rõ   rð   rò   rñ   r  râ   r  rP  rN  rR  rT  ræ   rV  ZCONTTYPErø   r÷   r  r  r  r+  r   r   r   r   r/  rL  r   rI  r=  rþ   rE   rJ  r„   r   Úgetfilesystemencodingr7   r<   rK   rQ   rV   rX   rg   rp   Ú	Exceptionr   r
   r   r   r	   r   rt   ru   rv   rH   rw   rx   r‡   Úobjectr   r¿   ÚBufferedReaderrÒ   r   r   r   r   rq   r5   r5   r5   r6   Ú<module>    sò   


 wh             "W
