
Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­
<!DOCTYPE html>
<html>
U
    ¡ê,aõn ã                   @   sf  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zddlZW n ek
r„   dZY nX zddlZW n ek
rª   dZY nX eefZz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+Z1e1Z2e 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„ ZDG dCd	„ d	eEƒZFG dDd„ deFƒZGG dEd
„ d
eFƒZHG dFd„ deFƒZIG dGd„ deFƒZJG dHd„ deFƒZKG dIdJ„ dJeKƒZLG dKdL„ dLeKƒZMG dMdN„ dNeKƒZNG dOdP„ dPeKƒZOG dQdR„ dReKƒZPG dSdT„ dTƒZQG dUdV„ dVƒZRG dWdX„ dXeSƒZTG dYdZ„ dZeSƒZUG d[d\„ d\ejVƒZWG d]d„ deSƒZXG d^d„ deSƒZYd_d„ ZZeYjZd`da„ Z[e\dbk�rbe[ƒ  dS )cz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atimeÚctimer(   r)   r*   r'   Úntúutf-8c                 C   s(   |   ||¡} | d |… |t| ƒ t  S ©N)ÚencodeÚlenÚNUL)ÚsÚlengthÚencodingÚerrors© r8   ú,/opt/alt/python38/lib64/python3.8/tarfile.pyÚstnž   s    r:   c                 C   s*   |   d¡}|dkr| d |… } |  ||¡S )Nr   éÿÿÿÿ)ÚfindÚdecode)r4   r6   r7   Úpr8   r8   r9   Únts¤   s    
r?   c                 C   s¦   | d dkrbd}t t| ƒd ƒD ]}|dK }|| |d  7 }q | d dkr¢dt| ƒd  |  }n@z"t| ddƒ} t|  ¡ p|d	dƒ}W n tk
r    td
ƒ‚Y nX |S )Nr   )é€   éÿ   r#   é   rA   é   ÚasciiÚstrictÚ0úinvalid header)Úranger2   r?   ÚintÚstripÚ
ValueErrorÚInvalidHeaderError)r4   ÚnÚir8   r8   r9   Únti¬   s    rO   rB   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 nV| dkrŠtdgƒ}ntdgƒ}d| |  } t|d ƒD ]}| d| d@ ¡ | dL } q¬ntd	ƒ‚|S )
Nr   rB   r#   z%0*orD   rC   r@   rA   zoverflow in number field)rI   Úbytesr3   r   Ú	bytearrayrH   ÚinsertrK   )rM   ÚdigitsÚformatr4   rN   r8   r8   r9   ÚitnÀ   s     2
rU   c                 C   s0   dt t d| ¡ƒ }dt t d| ¡ƒ }||fS )NrC   Z
148B8x356BZ
148b8x356b)ÚsumÚstructZunpack_from)ÚbufZunsigned_chksumZsigned_chksumr8   r8   r9   Úcalc_chksumsÝ   s    	rY   c           	      C   s¦   |pd}|dkrd S |d kr.t  | ||¡ d S t||ƒ\}}t|ƒD ],}|  |¡}t|ƒ|k rf|dƒ‚| |¡ qD|dkr¢|  |¡}t|ƒ|k r˜|dƒ‚| |¡ d S )Ni @  r   úunexpected end of data)ÚshutilÚcopyfileobjÚdivmodrH   Úreadr2   Úwrite)	ÚsrcZdstr5   Ú	exceptionÚbufsizeÚblocksÚ	remainderÚbrX   r8   r8   r9   r\   ê   s$    


r\   c                 C   s8   t tjdd ƒ}|d k	r(|  |d¡ |¡} t| dd� d S )Nr6   Úbackslashreplaceú )Úend)ÚgetattrÚsysÚstdoutr1   r=   Úprint)r4   r6   r8   r8   r9   Ú_safe_print  s    rm   c                   @   s   e Zd ZdS )r   N©Ú__name__Ú
__module__Ú__qualname__r8   r8   r8   r9   r   
  s   c                   @   s   e Zd ZdS )r
   Nrn   r8   r8   r8   r9   r
     s   c                   @   s   e Zd ZdS )r   Nrn   r8   r8   r8   r9   r     s   c                   @   s   e Zd ZdS )r   Nrn   r8   r8   r8   r9   r     s   c                   @   s   e Zd ZdS )r	   Nrn   r8   r8   r8   r9   r	     s   c                   @   s   e Zd ZdS )r   Nrn   r8   r8   r8   r9   r     s   c                   @   s   e Zd ZdS )ÚEmptyHeaderErrorNrn   r8   r8   r8   r9   rr     s   rr   c                   @   s   e Zd ZdS )ÚTruncatedHeaderErrorNrn   r8   r8   r8   r9   rs     s   rs   c                   @   s   e Zd ZdS )ÚEOFHeaderErrorNrn   r8   r8   r8   r9   rt   "  s   rt   c                   @   s   e Zd ZdS )rL   Nrn   r8   r8   r8   r9   rL   %  s   rL   c                   @   s   e Zd ZdS )ÚSubsequentHeaderErrorNrn   r8   r8   r8   r9   ru   (  s   ru   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Úhasattrrz   r   Úfd)ÚselfÚnameÚmoder8   r8   r9   Ú__init__5  s    þý

z_LowLevelFile.__init__c                 C   s   t  | j¡ d S r0   )r{   Úcloser�   ©r‚   r8   r8   r9   r†   >  s    z_LowLevelFile.closec                 C   s   t  | j|¡S r0   )r{   r^   r�   ©r‚   r'   r8   r8   r9   r^   A  s    z_LowLevelFile.readc                 C   s   t  | j|¡ d S r0   )r{   r_   r�   ©r‚   r4   r8   r8   r9   r_   D  s    z_LowLevelFile.writeN)ro   rp   rq   r…   r†   r^   r_   r8   r8   r8   r9   rv   /  s   	rv   c                   @   sn   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„ 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| _�zL|dkrÖzdd l}W n tk
rž   tdƒ‚Y nX || _| d¡| _|d	krÌ|  ¡  |j| _n|  ¡  nà|d
k�r:zdd l}W n tk
�r
   tdƒ‚Y nX |d	k�r.d| _| ¡ | _t| _n
| ¡ | _n||dk�r z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 availablerx   Úbz2úbz2 module is not availableÚxzúlzma module is not availableÚtarúunknown compression type %r) Ú_extfileobjrv   Ú_StreamProxyÚgetcomptyperƒ   r„   ÚcomptypeÚfileobjrb   rX   ÚposÚclosedÚzlibÚImportErrorr   Úcrc32ÚcrcÚ_init_read_gzÚerrorra   Ú_init_write_gzr�   ÚdbufZBZ2DecompressorÚcmpÚOSErrorZBZ2CompressorÚlzmaZLZMADecompressorÚ	LZMAErrorZLZMACompressorr†   )	r‚   rƒ   r„   r˜   r™   rb   rœ   r�   r¦   r8   r8   r9   r…   R  sl    












z_Stream.__init__c                 C   s   t | dƒr| js|  ¡  d S )Nr›   )r€   r›   r†   r‡   r8   r8   r9   Ú__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… | _tj | j¡| _|  
| j dd	¡t ¡ d S )
Né	   r   ú<Ls   ‹s   ÿú.gzéýÿÿÿz
iso-8859-1Úreplace)rœ   ZcompressobjZDEFLATEDÚ	MAX_WBITSZDEF_MEM_LEVELr¤   rW   ÚpackrI   ÚtimeÚ_Stream__writerƒ   Úendswithr{   r%   Úbasenamer1   r3   )r‚   Z	timestampr8   r8   r9   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š   r2   r¤   Úcompressr±   r‰   r8   r8   r9   r_   ¬  s    

z_Stream.writec                 C   sN   |  j |7  _ t| j ƒ| jkrJ| j | j d | j… ¡ | j | jd … | _ qd S r0   )rX   r2   rb   r™   r_   r‰   r8   r8   r9   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 5 | js¬| j ¡  X d S )NTry   r“   r�   rŽ   rª   l   ÿÿ )r›   r•   r™   r†   r„   r˜   rX   r¤   Úflushr_   rW   r¯   rŸ   rš   r‡   r8   r8   r9   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	@ r�t|  d¡ƒd
t|  d¡ƒ  }|  	|¡ |d@ r²|  d¡}|r²|t
kr˜q²q˜|d@ rÔ|  d¡}|rÔ|t
krºqÔqº|d@ ræ|  d¡ d S )Nr�   r$   s   ‹únot a gzip filer#   ó   zunsupported compression methodé   é   rC   rB   é   )rœ   Zdecompressobjr®   r¤   r£   Ú_Stream__readr   r   Úordr^   r3   )r‚   ÚflagZxlenr4   r8   r8   r9   r    Õ  s*    
 


z_Stream._init_read_gzc                 C   s   | j S r0   )rš   r‡   r8   r8   r9   Útellô  s    z_Stream.tellr   c                 C   sX   || j  dkrJt|| j  | jƒ\}}t|ƒD ]}|  | j¡ q,|  |¡ ntdƒ‚| j S )Nr   z seeking backwards is not allowed)rš   r]   rb   rH   r^   r	   )r‚   rš   rc   rd   rN   r8   r8   r9   Úseekù  s    z_Stream.seekc                 C   s    |   |¡}|  jt|ƒ7  _|S r0   )Ú_readrš   r2   )r‚   r'   rX   r8   r8   r9   r^     s    
z_Stream.readc                 C   sÂ   | j dkr|  |¡S t| jƒ}| jg}||k rž| jrB| j}d| _n| j | j¡}|sVqžz| j 	|¡}W n | j
k
r„   tdƒ‚Y nX | |¡ |t|ƒ7 }q&d |¡}||d … | _|d |… S )Nr“   r�   zinvalid compressed data)r˜   r»   r2   r£   rX   r™   r^   rb   r¤   Ú
decompressra   r   ÚappendÚjoin©r‚   r'   ÚcÚtrX   r8   r8   r9   rÀ     s(    




z_Stream._readc                 C   sj   t | jƒ}| jg}||k rF| j | j¡}|s.qF| |¡ |t |ƒ7 }qd |¡}||d … | _|d |… S )Nr�   )r2   rX   r™   r^   rb   rÂ   rÃ   rÄ   r8   r8   r9   Z__read(  s    


z_Stream.__readN)r   )ro   rp   rq   r…   r¨   r¢   r_   r±   r†   r    r¾   r¿   r^   rÀ   r»   r8   r8   r8   r9   rŠ   G  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 r0   )r™   r^   Ú	BLOCKSIZErX   )r‚   r™   r8   r8   r9   r…   >  s    z_StreamProxy.__init__c                 C   s   | j j| _| jS r0   )r™   r^   rX   rˆ   r8   r8   r9   r^   B  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“   )rX   Ú
startswithr‡   r8   r8   r9   r—   F  s    $z_StreamProxy.getcomptypec                 C   s   | j  ¡  d S r0   )r™   r†   r‡   r8   r8   r9   r†   P  s    z_StreamProxy.closeN)ro   rp   rq   r…   r^   r—   r†   r8   r8   r8   r9   r–   9  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}|D ]L\}}||kr|| j 	d||d f¡ | j 	d||| |f¡ ||7 }|| }qX|| jk rÆ| j 	d|| jd f¡ d S )Nr   rƒ   FT)
r™   Úoffsetr'   Úpositionri   rƒ   r›   Ú	map_indexÚmaprÂ   )r‚   r™   rÌ   r'   Z	blockinfoZlastposZrealposr8   r8   r9   r…   ]  s(    


z_FileInFile.__init__c                 C   s   d S r0   r8   r‡   r8   r8   r9   rµ   v  s    z_FileInFile.flushc                 C   s   dS ©NTr8   r‡   r8   r8   r9   Úreadabley  s    z_FileInFile.readablec                 C   s   dS )NFr8   r‡   r8   r8   r9   Úwritable|  s    z_FileInFile.writablec                 C   s
   | j  ¡ S r0   )r™   Úseekabler‡   r8   r8   r9   rÓ     s    z_FileInFile.seekablec                 C   s   | j S r0   )rÍ   r‡   r8   r8   r9   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_ENDrK   )r‚   rÍ   Úwhencer8   r8   r9   r¿   ‡  s    


z_FileInFile.seekc           	      C   s
  |d kr| j | j }nt|| j | j ƒ}d}|dk�r| j| j \}}}}|| j  kr`|k rhqŽ nqŽq6|  jd7  _| jt| jƒkr6d| _q6t||| j ƒ}|râ| j || j|  ¡ | j |¡}t|ƒ|krØt	dƒ‚||7 }n|t
| 7 }||8 }|  j|7  _q,|S )Nr�   r   r#   rZ   )r'   rÍ   rÖ   rÏ   rÎ   r2   r™   r¿   r^   r   r3   )	r‚   r'   rX   ÚdataÚstartÚstoprÌ   r5   re   r8   r8   r9   r^   —  s,    

z_FileInFile.readc                 C   s&   |   t|ƒ¡}||d t|ƒ…< t|ƒS r0   )r^   r2   )r‚   re   rX   r8   r8   r9   Úreadinto¶  s    z_FileInFile.readintoc                 C   s
   d| _ d S rÐ   )r›   r‡   r8   r8   r9   r†   »  s    z_FileInFile.close)N)N)ro   rp   rq   r…   rµ   rÑ   rÒ   rÓ   r¾   rÔ   rÕ   r¿   r^   rÞ   r†   r8   r8   r8   r9   rË   W  s   

rË   c                       s   e Zd Z‡ fdd„Z‡  ZS )ÚExFileObjectc                    s&   t |j|j|j|jƒ}tƒ  |¡ d S r0   )rË   r™   Úoffset_datar'   ÚsparseÚsuperr…   )r‚   ÚtarfileÚtarinfor™   ©Ú	__class__r8   r9   r…   Á  s
    
 ÿzExFileObject.__init__)ro   rp   rq   r…   Ú__classcell__r8   r8   rå   r9   rß   ¿  s   rß   c                   @   s¶  e Zd Zeddddddddd	d
ddddddddddd�Zddd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d0d1„ ƒZed2d3„ ƒZed4d5„ ƒZed6d7„ ƒZe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'dRdS„ Z(dTdU„ Z)dVdW„ Z*dXdY„ Z+dZd[„ Z,d\d]„ Z-d^d_„ Z.d`da„ Z/dbdc„ Z0dS )er   zName of the archive member.zPermission bits.z6User ID of the user who originally stored this member.z7Group ID of the user who originally stored this member.zSize in bytes.zTime of last modification.zHeader checksum.z–File type. type is usually one of these constants: REGTYPE, AREGTYPE, LNKTYPE, SYMTYPE, DIRTYPE, FIFOTYPE, CONTTYPE, CHRTYPE, BLKTYPE, GNUTYPE_SPARSE.zcName of the target file name, which is only present in TarInfo objects of type LNKTYPE and SYMTYPE.z
User name.zGroup name.zDevice major number.zDevice minor number.zThe tar header starts here.zThe file's data starts here.zMA dictionary containing key-value pairs of an associated pax extended header.zSparse member information.N)rƒ   r„   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ƒ   r„   r)   r*   r'   r(   rè   ÚREGTYPEré   rê   r+   r,   rë   rì   rÌ   rà   rá   rí   ©r‚   rƒ   r8   r8   r9   r…   í  s"    zTarInfo.__init__c                 C   s   | j S r0   ©rƒ   r‡   r8   r8   r9   r%     s    zTarInfo.pathc                 C   s
   || _ d S r0   rò   rñ   r8   r8   r9   r%   
  s    c                 C   s   | j S r0   ©rê   r‡   r8   r8   r9   r&     s    zTarInfo.linkpathc                 C   s
   || _ d S r0   ró   )r‚   rê   r8   r8   r9   r&     s    c                 C   s   d| j j| jt| ƒf S )Nz<%s %r at %#x>)ræ   ro   rƒ   Úidr‡   r8   r8   r9   Ú__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 )Néÿ  )rƒ   r„   r)   r*   r'   r(   rè   ré   rê   r+   r,   rë   rì   ré   rƒ   ú/)rƒ   r„   r)   r*   r'   r(   rè   ré   rê   r+   r,   rë   rì   ÚDIRTYPEr²   )r‚   Úinfor8   r8   r9   Ú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_headerrK   )r‚   rT   r6   r7   rù   r8   r8   r9   Útobuf2  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_MAGICr2   r1   ÚLENGTH_LINKrK   ÚLENGTH_NAMEÚ_posix_split_nameÚ_create_headerr   )r‚   rù   r6   r7   r8   r8   r9   rü   @  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_MAGICr2   r1   r  Ú_create_gnu_long_headerÚGNUTYPE_LONGLINKr  ÚGNUTYPE_LONGNAMEr  r   )r‚   rù   r6   r7   rX   r8   r8   r9   rý   M  s    zTarInfo.create_gnu_headerc           
   	   C   s*  t |d< | j ¡ }ddtfddtfddfD ]j\}}}||kr>q*z||  dd	¡ W n$ tk
rv   || ||< Y q*Y nX t|| ƒ|kr*|| ||< q*d
D ]`\}}||kr´d||< qš|| }d|  krØd|d  k ræn n
t|t	ƒršt
|ƒ||< d||< qš|�r|  |t|¡}	nd}	|	|  |tdd¡ S )Nr   rƒ   r%   rê   r&   )r+   r+   é    )r,   r,   r  rD   rE   ))r)   rB   )r*   rB   )r'   é   )r(   r  r   rB   r#   r�   r­   )r  rí   Úcopyr  r  r1   ÚUnicodeEncodeErrorr2   Ú
isinstanceÚfloatÚstrÚ_create_pax_generic_headerÚXHDTYPEr  r   )
r‚   rù   r6   rí   rƒ   Zhnamer5   rS   ÚvalrX   r8   r8   r9   rþ   [  s8    
  þ
*
zTarInfo.create_pax_headerc                 C   s   |   |td¡S )Nr/   )r  ÚXGLTYPE)Úclsrí   r8   r8   r9   Úcreate_pax_global_headerŒ  s    z TarInfo.create_pax_global_headerc                 C   s~   |  d¡}tdt|ƒƒD ]T}d |d |… ¡}d ||d … ¡}t| ||¡ƒtkrt| ||¡ƒtkr qvqtdƒ‚||fS )Nr÷   r#   zname is too long)ÚsplitrH   r2   rÃ   r1   ÚLENGTH_PREFIXr  rK   )r‚   rƒ   r6   r7   Z
componentsrN   r  r8   r8   r9   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   r„   r   rö   rB   r)   r*   r'   r  r(   s           ré   rê   r   r+   r  r,   rë   rì   r  r   z%dsr�   i”þÿÿz%06o rD   i›þÿÿ)r:   ÚgetrU   rð   r  rW   r¯   rÇ   rÃ   rY   rP   )rù   rT   r6   r7   ÚpartsrX   rè   r8   r8   r9   r  ¢  s(    

ñ&zTarInfo._create_headerc                 C   s.   t t| ƒtƒ\}}|dkr*| t| t 7 } | S )Nr   )r]   r2   rÇ   r3   )Zpayloadrc   rd   r8   r8   r9   Ú_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   )r1   r3   r2   r  r  r   r  )r  rƒ   ré   r6   r7   rù   r8   r8   r9   r  È  s    ÿzTarInfo._create_gnu_long_headerc              	   C   s2  d}|  ¡ D ]8\}}z| dd¡ W q tk
rB   d}Y  qFY qX qd}|rV|d7 }|  ¡ D ]�\}}| d¡}|r‚| |d¡}n
| d¡}t|ƒt|ƒ d }d	 }	}
|tt|
ƒƒ }	|	|
krÂqÈ|	}
q¨|tt|
ƒd
ƒd | d | d 7 }q^i }d|d< ||d< t|ƒ|d< t|d< |  |td
d¡|  	|¡ S )NFr/   rE   Tr�   s   21 hdrcharset=BINARY
rû   rÈ   r   rD   ó    ó   =ó   
z././@PaxHeaderrƒ   ré   r'   r   r­   )
Úitemsr1   r  r2   r  rP   r  r  r   r  )r  rí   ré   r6   ZbinaryÚkeywordÚvalueZrecordsÚlrM   r>   rù   r8   r8   r9   r  Ù  s<    

(ÿz"TarInfo._create_pax_generic_headerc              	   C   sv  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�r8d}g }tdƒD ]l}	z0t|||d … ƒ}
t||d |d … ƒ}W n tk
�rô   Y  �qY nX | |
|f¡ |d7 }�q¢t|d ƒ}t|dd… ƒ}|||f|_ | !¡ �rP|j "d¡|_|�rr|jt#k�rr|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ï  )$r2   rr   rÇ   rs   Úcountr3   rt   rO   rY   rL   r?   rƒ   r„   r)   r*   r'   r(   rè   ré   rê   r+   r,   rë   rì   ÚAREGTYPEr²   rø   ÚGNUTYPE_SPARSErH   rK   rÂ   Úboolrî   ÚisdirÚrstripÚ	GNU_TYPES)r  rX   r6   r7   rè   Úobjr  rš   ÚstructsrN   rÌ   ÚnumbytesÚ
isextendedÚorigsizer8   r8   r9   Úfrombuf  sZ    
zTarInfo.frombufc                 C   s8   |j  t¡}|  ||j|j¡}|j  ¡ t |_| |¡S r0   )	r™   r^   rÇ   r8  r6   r7   r¾   rÌ   Ú_proc_member)r  rã   rX   r3  r8   r8   r9   ÚfromtarfileK  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 r0   )ré   r
  r	  Ú_proc_gnulongr.  Ú_proc_sparser  r  ÚSOLARIS_XHDTYPEÚ	_proc_paxÚ_proc_builtin)r‚   rã   r8   r8   r9   r9  `  s    



zTarInfo._proc_memberc                 C   sR   |j  ¡ | _| j}|  ¡ s$| jtkr4||  | j¡7 }||_|  	|j
|j|j¡ | S r0   )r™   r¾   rà   Úisregré   ÚSUPPORTED_TYPESÚ_blockr'   rÌ   Ú_apply_pax_inforí   r6   r7   )r‚   rã   rÌ   r8   r8   r9   r?  m  s    zTarInfo._proc_builtinc                 C   s†   |j  |  | j¡¡}z|  |¡}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 )Nú missing or bad subsequent header)r™   r^   rB  r'   r:  r   ru   rÌ   ré   r
  r?   r6   r7   rƒ   r	  rê   )r‚   rã   rX   Únextr8   r8   r9   r;  ~  s    

zTarInfo._proc_gnulongc           
   	   C   sÚ   | j \}}}| ` |rª|j t¡}d}tdƒD ]n}z0t|||d … ƒ}t||d |d … ƒ}	W n tk
rz   Y  qœY nX |r’|	r’| ||	f¡ |d7 }q,t|d ƒ}q|| _	|j 
¡ | _| j|  | j¡ |_|| _| S )Nr   é   r  r+  iø  )rî   r™   r^   rÇ   rH   rO   rK   rÂ   r/  rá   r¾   rà   rB  r'   rÌ   )
r‚   rã   r4  r6  r7  rX   rš   rN   rÌ   r5  r8   r8   r9   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}| ||¡}|s˜�q6| ¡ \}	}
t|	ƒ}	|	dkr¼tdƒ‚|| d	¡d | d¡|	 d … }|  |
dd|j¡}
|
tk�r|  |||j|j¡}n|  |dd|j¡}|||
< ||	7 }q„z|  |¡}W n tk
�rb   td
ƒ‚Y nX d|k�r||  ||¡ 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#   r/   Ú
hdrcharsetZBINARYs   (\d+) ([^=]+)=r   rG   r$   rD  úGNU.sparse.mapúGNU.sparse.sizezGNU.sparse.majorÚ1zGNU.sparse.minorrF   r'   )%r™   r^   rB  r'   ré   r  rí   r  ÚreÚsearchÚgroupr=   r  r6   ÚcompileÚmatchÚgroupsrI   rL   rh   rÜ   Ú_decode_pax_fieldr7   ÚPAX_NAME_FIELDSr:  r   ru   Ú_proc_gnusparse_01Ú_proc_gnusparse_00Ú_proc_gnusparse_10r  r=  rC  rÌ   rà   r@  rA  )r‚   rã   rX   rí   rO  rG  r6   Zregexrš   r5   r!  r"  rE  rÌ   r8   r8   r9   r>  °  sh    



$	
ÿ
ÿ
ÿ


 
zTarInfo._proc_paxc                 C   sh   g }t  d|¡D ]}| t| d¡ƒ¡ qg }t  d|¡D ]}| t| d¡ƒ¡ q:tt||ƒƒ|_d S )Ns   \d+ GNU.sparse.offset=(\d+)\nr#   s   \d+ GNU.sparse.numbytes=(\d+)\n)rK  ÚfinditerrÂ   rI   rM  ÚlistÚziprá   )r‚   rE  rí   rX   ZoffsetsrO  r5  r8   r8   r9   rT    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 r8   )rI   )Ú.0Úxr8   r8   r9   Ú
<listcomp>&  s     z.TarInfo._proc_gnusparse_01.<locals>.<listcomp>rH  ú,r$   r#   )r  rW  rX  rá   )r‚   rE  rí   rá   r8   r8   r9   rS  #  s    zTarInfo._proc_gnusparse_01c                 C   s¨   d }g }|j  t¡}| dd¡\}}t|ƒ}t|ƒ|d k rtd|krT||j  t¡7 }| dd¡\}}| t|ƒ¡ q,|j  ¡ |_t	t
|d d d… |dd d… ƒƒ|_d S )Nr  r#   r$   )r™   r^   rÇ   r  rI   r2   rÂ   r¾   rà   rW  rX  rá   )r‚   rE  rí   rã   Zfieldsrá   rX   Znumberr8   r8   r9   rU  )  s    zTarInfo._proc_gnusparse_10c              	   C   sÂ   |  ¡ D ]ª\}}|dkr&t| d|ƒ q|dkr@t| dt|ƒƒ q|dkrZt| dt|ƒƒ q|tkr|tkr”zt| |ƒ}W n tk
r’   d}Y nX |dkr¦| d¡}t| ||ƒ q| ¡ | _d S )NzGNU.sparse.namer%   rI  r'   zGNU.sparse.realsizer   r÷   )	r   ÚsetattrrI   Ú
PAX_FIELDSÚPAX_NUMBER_FIELDSrK   r1  r  rí   )r‚   rí   r6   r7   r!  r"  r8   r8   r9   rC  9  s"    

zTarInfo._apply_pax_infoc                 C   s4   z|  |d¡W S  tk
r.   |  ||¡ Y S X d S )NrE   )r=   ÚUnicodeDecodeError)r‚   r"  r6   Zfallback_encodingZfallback_errorsr8   r8   r9   rQ  P  s    zTarInfo._decode_pax_fieldc                 C   s"   t |tƒ\}}|r|d7 }|t S )Nr#   )r]   rÇ   )r‚   r,  rc   rd   r8   r8   r9   rB  X  s    zTarInfo._blockc                 C   s
   | j tkS r0   )ré   ÚREGULAR_TYPESr‡   r8   r8   r9   r@  a  s    zTarInfo.isregc                 C   s   |   ¡ S r0   )r@  r‡   r8   r8   r9   Úisfilee  s    zTarInfo.isfilec                 C   s
   | j tkS r0   )ré   rø   r‡   r8   r8   r9   r0  i  s    zTarInfo.isdirc                 C   s
   | j tkS r0   )ré   ÚSYMTYPEr‡   r8   r8   r9   Úissymm  s    zTarInfo.issymc                 C   s
   | j tkS r0   )ré   ÚLNKTYPEr‡   r8   r8   r9   Úislnkq  s    zTarInfo.islnkc                 C   s
   | j tkS r0   )ré   ÚCHRTYPEr‡   r8   r8   r9   Úischru  s    zTarInfo.ischrc                 C   s
   | j tkS r0   )ré   ÚBLKTYPEr‡   r8   r8   r9   Úisblky  s    zTarInfo.isblkc                 C   s
   | j tkS r0   )ré   ÚFIFOTYPEr‡   r8   r8   r9   Úisfifo}  s    zTarInfo.isfifoc                 C   s
   | j d k	S r0   )rá   r‡   r8   r8   r9   Úissparse�  s    zTarInfo.issparsec                 C   s   | j tttfkS r0   )ré   rg  ri  rk  r‡   r8   r8   r9   Úisdev„  s    zTarInfo.isdev)rŒ   )1ro   rp   rq   ÚdictÚ	__slots__r…   Úpropertyr%   Úsetterr&   rõ   rú   r   r   rÿ   rü   rý   rþ   Úclassmethodr  r  Ústaticmethodr  r  r  r  r8  r:  r9  r?  r;  r<  r>  rT  rS  rU  rC  rQ  rB  r@  rb  r0  rd  rf  rh  rj  rl  rm  rn  r8   r8   r8   r9   r   Ê  s’   è




1


	

2
>
h	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#   Nrx   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r�t|d
ƒr�t	|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 | _zþ| jdk�ržd | _ |  !¡ | _ | jdk�r2| j "| j¡ z| j #| ¡}| j $|¡ W nX t%k
�rþ   | j "| j¡ Y �q2Y n0 t&k
�r, } zt't|ƒƒ‚W 5 d }~X Y nX �qª| 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©rx   Úary   rZ  ú!mode must be 'r', 'a', 'w' or 'x'rx  ry   Frƒ   r„   Trx   ©rx  ry   rZ  )-rK   r„   Ú_moder{   r%   ÚexistsÚ	bltn_openr•   r€   r  rƒ   r  rP   Úabspathr™   rT   rä   ÚdereferenceÚignore_zerosr6   r7   r   rí   ÚdebugÚ
errorlevelÚcopybufsizer›   ÚmembersÚ_loadedr¾   rÌ   ÚinodesÚfirstmemberrE  r¿   r:  rÂ   rt   r   r   r  r  r_   r2   r†   )r‚   rƒ   r„   r™   rT   rä   r  r€  r6   r7   rí   r�  r‚  rƒ  ZmodesÚerX   r8   r8   r9   r…   £  sŠ    
ÿ





"
zTarFile.__init__c              
      sº  |s|st dƒ‚|dkrª‡ fdd„}tˆ j|d�D ]j}tˆ ˆ j| ƒ}|d k	rV| ¡ }	z||d|f|ŽW   S  ttfk
rš   |d k	r’| |	¡ Y q2Y q2X q2t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}
|�p8d
}|
dk�rLt dƒ‚t	||
|||ƒ}zˆ ||
|f|Ž}W n   | 
¡  ‚ Y nX d|_|S |dk�r®ˆ j|||f|ŽS t dƒ‚d S )Nznothing to open)rx   úr:*c                    s   ˆ j |  dkS )NÚtaropen)Ú	OPEN_METH)r˜   ©r  r8   r9   Únot_compressed<  s    z$TarFile.open.<locals>.not_compressed©Úkeyrx   z%file could not be opened successfullyú:r#   r“   r”   ú|rw   zmode must be 'r' or 'w'Frz  zundiscernible mode)rK   Úsortedr‹  ri   r¾   r   r   r¿   r  rŠ   r†   r•   rŠ  )r  rƒ   r„   r™   rb   Úkwargsr�  r˜   ÚfuncZ	saved_posÚfilemodeÚstreamrÆ   r8   rŒ  r9   r     sP    %







zTarFile.openc                 K   s    |dkrt dƒ‚| |||f|ŽS )Nrw  ry  )rK   )r  rƒ   r„   r™   r“  r8   r8   r9   rŠ  m  s    zTarFile.taropenr©   c                 K   sè   |dkrt dƒ‚zddlm} W n tk
r<   tdƒ‚Y nX z|||d ||ƒ}W n. tk
r‚   |d k	r||dkr|tdƒ‚‚ Y nX z| j|||f|Ž}W nB tk
rÈ   | ¡  |dkrÂtdƒ‚‚ Y n   | ¡  ‚ Y nX d	|_	|S )
N©rx   ry   rZ  úmode must be 'r', 'w' or 'x'r   )ÚGzipFilezgzip module is not availablere   rx   r¶   F)
rK   Zgzipr™  r�   r   r¥   r   rŠ  r†   r•   )r  rƒ   r„   r™   Úcompresslevelr“  r™  rÆ   r8   r8   r9   Úgzopenu  s0    zTarFile.gzopenc              	   K   s¸   |dkrt dƒ‚zddlm} W n tk
r<   tdƒ‚Y nX ||pF|||d�}z| j|||f|Ž}W nF ttfk
r˜   | ¡  |dkr’t	dƒ‚‚ Y n   | ¡  ‚ Y nX d	|_
|S )
Nr—  r˜  r   )ÚBZ2Filer�   )rš  rx   znot a bzip2 fileF)rK   r�   rœ  r�   r   rŠ  r¥   ÚEOFErrorr†   r   r•   )r  rƒ   r„   r™   rš  r“  rœ  rÆ   r8   r8   r9   Úbz2open–  s&    zTarFile.bz2openc           	   	   K   s¼   |dkrt dƒ‚zddlm}m} W n tk
r@   tdƒ‚Y nX ||pJ|||d�}z| j|||f|Ž}W nF |tfk
rœ   | ¡  |dkr–t	dƒ‚‚ Y n   | ¡  ‚ Y nX d	|_
|S )
Nr—  r˜  r   )ÚLZMAFiler§   r’   )Úpresetrx   znot an lzma fileF)rK   r¦   rŸ  r§   r�   r   rŠ  r�  r†   r   r•   )	r  rƒ   r„   r™   r   r“  rŸ  r§   rÆ   r8   r8   r9   Úxzopen²  s&    zTarFile.xzopenrŠ  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 5 | js‚| j ¡  X d S )NTrz  r$   r   )r›   r•   r™   r†   r„   r_   r3   rÇ   rÌ   r]   Ú
RECORDSIZE)r‚   rc   rd   r8   r8   r9   r†   Ù  s    
zTarFile.closec                 C   s"   |   |¡}|d krtd| ƒ‚|S )Nzfilename %r not found)Ú
_getmemberÚKeyError)r‚   rƒ   rä   r8   r8   r9   Ú	getmemberî  s    
zTarFile.getmemberc                 C   s   |   ¡  | js|  ¡  | jS r0   )Ú_checkr…  Ú_loadr„  r‡   r8   r8   r9   Ú
getmembersù  s    zTarFile.getmembersc                 C   s   dd„ |   ¡ D ƒS )Nc                 S   s   g | ]
}|j ‘qS r8   rò   )rY  rä   r8   r8   r9   r[    s     z$TarFile.getnames.<locals>.<listcomp>)r¨  r‡   r8   r8   r9   Úgetnames  s    zTarFile.getnamesc                 C   s^  |   d¡ |d k	r|j}|d kr$|}tj |¡\}}| tjd¡}| d¡}|  ¡ }| |_	|d kr€| j
stt |¡}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 rü|| j|	< nht |¡�rt}
nVt |¡�r"t}
nDt |¡�r>t}
t |¡}n(t |¡�rPt}
nt  |¡�rbt!}
nd S ||_||_"|j#|_$|j%|_&|
tk�r–|j'|_(nd|_(|j)|_*|
|_+||_,t-�räzt- .|j$¡d |_/W n t0k
�râ   Y nX t1�rzt1 2|j&¡d |_3W n t0k
�r   Y nX |
tt!fk�rZt4tdƒ�rZt4tdƒ�rZt 5|j6¡|_7t 8|j6¡|_9|S )NÚawxr÷   rŒ   r#   r   ÚmajorÚminor):r¦  rƒ   r{   r%   Ú
splitdriver­   ÚsepÚlstriprä   rã   r  ÚlstatÚstatÚfstatÚfilenoÚst_modeÚS_ISREGÚst_inoÚst_devÚst_nlinkr†  re  rð   ÚS_ISDIRrø   ÚS_ISFIFOrk  ÚS_ISLNKrc  ÚreadlinkÚS_ISCHRrg  ÚS_ISBLKri  r„   Úst_uidr)   Úst_gidr*   Úst_sizer'   Úst_mtimer(   ré   rê   ÚpwdÚgetpwuidr+   r¤  ÚgrpZgetgrgidr,   r€   r«  Úst_rdevrë   r¬  rì   )r‚   rƒ   Úarcnamer™   Zdrvrä   Zstatresrê   ZstmdÚinoderé   r8   r8   r9   Ú
gettarinfo	  s„    	


ÿÿ

zTarFile.gettarinfoT)r„  c                C   sú   |   ¡  |d kr| }|D ]Ü}|r¤tt |j¡ƒ td|jp>|j|jpH|jf ƒ | 	¡ s`| 
¡ rzt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d S )Nz%s/%sz%10sz%d,%dz%10dz%d-%02d-%02d %02d:%02d:%02dr¸   r÷   rŒ   z-> zlink to )r¦  rm   r±  r•  r„   r+   r)   r,   r*   rh  rj  rë   rì   r'   r°   Ú	localtimer(   rƒ   r0  rd  rê   rf  rl   )r‚   Úverboser„  rä   r8   r8   r9   rW  l  s0    
ÿÿÿzTarFile.list©Úfilterc             	   C   s6  |   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 5 Q R X n`| 
¡ �r(|  	|¡ |�r2tt |¡ƒD ]*}| jtj ||¡tj ||¡||d� qún
|  	|¡ d S )	Nrª  r$   ztarfile: Skipped %rr#   ztarfile: Unsupported type %rztarfile: Excluded %rru  rÌ  )r¦  rƒ   r{   r%   r~  Ú_dbgrÉ  r@  r}  Úaddfiler0  r’  ÚlistdirÚaddrÃ   )r‚   rƒ   rÇ  Ú	recursiverÍ  rä   Úfr8   r8   r9   rÑ  Œ  s8    



 ÿ
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ª  )rb   r   r#   )r¦  r  rÿ   rT   r6   r7   r™   r_   rÌ   r2   rƒ  r\   r'   r]   rÇ   r3   r„  rÂ   )r‚   rä   r™   rX   rb   rc   rd   r8   r8   r9   rÏ  ¿  s    

zTarFile.addfileÚ.©Únumeric_ownerc                C   sø   g }|d kr| }|D ]>}|  ¡ r:| |¡ t |¡}d|_| j|||  ¡  |d� q|jdd„ d� | ¡  |D ]‚}tj 	||j
¡}z,| j|||d� |  ||¡ |  ||¡ W qp tk
rð } z"| jdkrÐ‚ n|  dd| ¡ W 5 d }~X Y qpX qpd S )	NéÀ  ©Ú	set_attrsrÖ  c                 S   s   | j S r0   rò   )rx  r8   r8   r9   Ú<lambda>ð  r�   z$TarFile.extractall.<locals>.<lambda>rŽ  rÕ  r#   útarfile: %s)r0  rÂ   r  r„   ÚextractÚsortÚreverser{   r%   rÃ   rƒ   ÚchownÚutimeÚchmodr
   r‚  rÎ  )r‚   r%   r„  rÖ  Zdirectoriesrä   Údirpathrˆ  r8   r8   r9   Ú
extractallØ  s.    

ÿ
zTarFile.extractallrŒ   c             
   C   s  |   d¡ t|tƒr |  |¡}n|}| ¡ r>tj ||j¡|_	z"| 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 5 d }~X Y nB tk
�r } z"| jdkræ‚ n|  dd| ¡ W 5 d }~X Y nX d S )Nrx   rØ  r   r#   rÛ  ztarfile: %s %r)r¦  r  r  r¥  rf  r{   r%   rÃ   rê   rï   Ú_extract_memberrƒ   r¥   r‚  ÚfilenamerÎ  Ústrerrorr
   )r‚   Úmemberr%   rÙ  rÖ  rä   rˆ  r8   r8   r9   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 )Nrx   z'cannot extract (sym)link as file object)r¦  r  r  r¥  r@  ré   rA  Ú
fileobjectrf  rd  r™   rŠ   r	   ÚextractfileÚ_find_link_target)r‚   rç  rä   r8   r8   r9   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)r1  r­   r{   r®  r%   Údirnamer|  Úmakedirsrf  rd  rÎ  rƒ   rê   r@  Úmakefiler0  Úmakedirrl  Úmakefiforh  rj  ÚmakedevÚmakelinkré   rA  Úmakeunknownrß  rá  rà  )r‚   rä   Ú
targetpathrÙ  rÖ  Z	upperdirsr8   r8   r9   rä  E  s4    


zTarFile._extract_memberc                 C   s*   zt  |d¡ W n tk
r$   Y nX d S )Nr×  )r{   ÚmkdirÚFileExistsError©r‚   rä   ró  r8   r8   r9   rî  v  s    zTarFile.makedirc              	   C   sŽ   | j }| |j¡ | j}t|dƒ�b}|jd k	rn|jD ]"\}}| |¡ t|||t|ƒ q4| |j¡ | 	¡  nt|||jt|ƒ W 5 Q R X d S )Nrv  )
r™   r¿   rà   rƒ  r}  rá   r\   r   r'   Útruncate)r‚   rä   ró  Úsourcerb   ÚtargetrÌ   r'   r8   r8   r9   rí  €  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ö  r8   r8   r9   rò  �  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ö  r8   r8   r9   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
   r„   rj  r±  ÚS_IFBLKÚS_IFCHRrû  rð  rë   rì   )r‚   rä   ró  r„   r8   r8   r9   rð     s    
ÿzTarFile.makedevc                 C   s°   zb|  ¡ r0tj |¡r t |¡ t |j|¡ n0tj |j¡rNt 	|j|¡ n|  
|  |¡|¡ W nH tk
rª   z|  
|  |¡|¡ W n tk
r¤   tdƒ‚Y nX Y nX d S )Nz%unable to resolve link inside archive)rd  r{   r%   ÚlexistsÚunlinkÚsymlinkrê   r|  rï   Úlinkrä  rê  Úsymlink_exceptionr¤  r
   rö  r8   r8   r9   rñ  ¯  s"    
ÿÿzTarFile.makelinkc                 C   sØ   t tdƒrÔt ¡ dkrÔ|j}|j}|s‚ztr<t |j¡d }W n tk
rR   Y nX zt	rjt	 
|j¡d }W n tk
r€   Y nX z4| ¡ 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Ã  Úgetpwnamr+   rd  r  rß  r¥   r
   )r‚   rä   ró  rÖ  ÚgÚur8   r8   r9   rß  É  s(    zTarFile.chownc                 C   s4   zt  ||j¡ W n tk
r.   tdƒ‚Y nX d S )Nzcould not change mode)r{   rá  r„   r¥   r
   rö  r8   r8   r9   rá  æ  s    zTarFile.chmodc                 C   sH   t tdƒsd S z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ö  r8   r8   r9   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 }z| j 	| ¡}W �qÎ t
k
rÆ } z6| jr´|  dd| j|f ¡ |  jt7  _W Y ¢q^W 5 d }~X Y �qÎ tk
�r6 } zR| j�r|  dd| j|f ¡ |  jt7  _W Y ¢ q^n| jdk�r&tt|ƒƒ‚W 5 d }~X Y n’ tk
�r^   | jdk�rZtdƒ‚Y nj tk
�r˜ } z| jdk�rˆtt|ƒƒ‚W 5 d }~X Y n0 tk
�rÆ } ztt|ƒƒ‚W 5 d }~X Y nX �qÎq^|d k	�ræ| j |¡ nd| _|S )	NZrar#   rZ   r$   z0x%X: %sr   z
empty fileT)r¦  r‡  rÌ   r™   r¾   r¿   r^   r   rä   r:  rt   r€  rÎ  rÇ   rL   r  rr   rs   ru   r„  rÂ   r…  )r‚   Úmrä   rˆ  r8   r8   r9   rE  ù  sJ    



zTarFile.nextc                 C   sn   |   ¡ }|d k	r"|d | |¡… }|r2tj |¡}t|ƒD ].}|rRtj |j¡}n|j}||kr:|  S q:d S r0   )r¨  Úindexr{   r%   ÚnormpathÚreversedrƒ   )r‚   rƒ   rä   Ú	normalizer„  rç  Úmember_namer8   r8   r9   r£  /	  s    zTarFile._getmemberc                 C   s   |   ¡ }|d kr qq d| _d S rÐ   )rE  r…  )r‚   rä   r8   r8   r9   r§  F	  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æ   ro   r„   )r‚   r„   r8   r8   r9   r¦  P	  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)
rd  rÃ   rÍ  r{   r%   rë  rƒ   rê   r£  r¤  )r‚   rä   rê   Úlimitrç  r8   r8   r9   rê  Y	  s     zTarFile._find_link_targetc                 c   sŠ   | j r| jE d H  d S d}| jd k	r:|  ¡ }|d7 }|V  |t| jƒk rT| j| }n"| j sr|  ¡ }|svd| _ d S nd S |d7 }|V  q:d S )Nr   r#   T)r…  r„  r‡  rE  r2   )r‚   r	  rä   r8   r8   r9   Ú__iter__l	  s$    
zTarFile.__iter__c                 C   s   || j krt|tjd� d S )N©Úfile)r�  rl   rj   Ústderr)r‚   ÚlevelÚmsgr8   r8   r9   rÎ  ‹	  s    
zTarFile._dbgc                 C   s   |   ¡  | S r0   )r¦  r‡   r8   r8   r9   Ú	__enter__‘	  s    zTarFile.__enter__c                 C   s,   |d kr|   ¡  n| js"| j  ¡  d| _d S rÐ   )r†   r•   r™   r›   )r‚   ré   r"  Ú	tracebackr8   r8   r9   Ú__exit__•	  s
    

zTarFile.__exit__)Nrx   NNNNNNrû   NNNN)rx   N)rx   Nr©   )rx   Nr©   )rx   NN)NNN)T)NT)N)rÔ  N)rŒ   T)TF)NF)N)7ro   rp   rq   r�  r  r€  r‚  r   rT   r   r6   r7   r   rä   rß   rè  r…   rs  r¢  r   rŠ  r›  rž  r¡  r‹  r†   r¥  r¨  r©  rÉ  rW  rÑ  rÏ  rã  rÜ  ré  rä  rî  rí  rò  rï  rð  rñ  rß  rá  rà  rE  r£  r§  r¦  rê  r  rÎ  r  r  r8   r8   r8   r9   r   ‰  s†                   ý
oZ ü


c 3
(&  ÿ
1
6


	c                 C   s2   zt | ƒ}| ¡  W dS  tk
r,   Y dS X d S )NTF)r   r†   r   )rƒ   rÆ   r8   r8   r9   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 5 Q R X |jrþt	d  |¡ƒ n| d!d" |¡¡ �nÌ|jd k	�r\|j}t|ƒ�rFt |d#¡�}|j|jd$� W 5 Q R X n| d!d" |¡¡ �nr|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 5 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 |
|¡�}|D ]}| |¡ �qœW 5 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)Zrequiredz-lz--listú	<tarfile>zShow listing of a tarfile)Úmetavarr  z-ez	--extractú+)r  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 validrx   r  z{!r} is a tar archive.r#   z{!r} is not a tar archive.
r‰  )rË  r$   )r%   rÔ  z{!r} file is extracted.z+{!r} file is extracted into {!r} directory.rŽ   r‘   r�   )r«   z.tgzz.xzz.txzz.bz2z.tbzz.tbz2z.tb2zw:ry   z{!r} file created.)ÚargparseÚArgumentParserÚadd_argumentZadd_mutually_exclusive_groupÚ
parse_argsZtestr   r   r¨  rl   rj   r  rË  rT   ÚexitrW  r   rÜ  r2   r{   ÚcurdirZformat_helprã  ZcreateÚpopr%   ÚsplitextrÑ  )r!  r  ÚparserrM  Úargsr`   r“   Ztfr&  r  Ztar_nameÚ_ZextZcompressionsZtar_modeZ	tar_filesÚ	file_namer8   r8   r9   Úmain°	  s–    ÿ
ÿ
þ
þ
ÿ



 ÿ
õr-  Ú__main__)]ÚversionÚ
__author__Ú__credits__Úbuiltinsr   r}  rj   r{   rÔ   r[   r±  r°   rW   r  rK  rÃ  r�   rÅ  ÚAttributeErrorÚNotImplementedErrorr  r¥   Ú	NameErrorÚ__all__r3   rÇ   r¢  r  r  r  r  r  rð   r-  re  rc  rg  ri  rø   rk  ZCONTTYPEr
  r	  r.  r  r  r=  r   r   r   r   rA  ra  r2  r^  rR  r  rI   r_  rƒ   r   Úgetfilesystemencodingr:   r?   rO   rU   rY   r\   rm   Ú	Exceptionr   r
   r   r   r	   r   rr   rs   rt   rL   ru   rv   rŠ   Úobjectr–   rË   ÚBufferedReaderrß   r   r   r   r-  ro   r8   r8   r8   r9   Ú<module>    s  


       ý     ü ÿÿú sh     D        !W
