
Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­
<!DOCTYPE html>
<html>
3
ct„j ´ ã            '   @   s>  d Z dZ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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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*Z0d+Z1d,Z2d-Z3dZ4d.Z5d/Z6e5Z7e%e&e'e(e+e,e-e)e*e.e/e0fZ8e%e&e-e0fZ9e.e/e0fZ:d„Z;d0d1d6d7hZ<e=e=e=e>e>e>d8œZ?e	j@d9k�rèd:ZAnejBƒ ZAd;d<„ ZCd=d>„ ZDd?d@„ ZEdAe7fdBdC„ZFdDdE„ ZGdedfdFdG„ZHdHdI„ ZIdJdK„ ZJG dLd„ deKƒZLG dMd„ deLƒZMG dNd„ deLƒZNG dOd„ deLƒZOG dPd„ deLƒZPG dQd„ deLƒZQG dRdS„ dSeQƒZRG dTdU„ dUeQƒZSG dVdW„ dWeQƒZTG dXdY„ dYeQƒZUG dZd[„ d[eQƒZVG d\d]„ d]ƒZWG d^d_„ d_ƒZXG d`da„ daeYƒZZG dbdc„ dceYƒZ[G ddde„ dee
j\ƒZ]G dfdg„ dgeLƒZ^G dhdi„ die^ƒZ_G djdk„ dke^ƒZ`G dldm„ dme^ƒZaG dndo„ doe^ƒZbG dpdq„ dqe^ƒZcG drds„ dse^ƒZde^eeMfZed…dtdu„Zfdvdw„ Zgdxdy„ Zhdzd{„ Ziegeheid|œZjeYƒ Zkejld}ƒZmG d~d	„ d	eYƒZnG dd„ deYƒZod€d
„ ZpeojZd�d‚„ Zqerdƒk�r:eqƒ  dS )†z0.9.0u"   Lars GustÃ¤bel (lars@gustaebel.de)z5$Date: 2011-02-25 17:42:01 +0200 (Fri, 25 Feb 2011) $z?$Id: tarfile.py 88586 2011-02-25 15:42:01Z marc-andre.lemburg $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   Tz/etc/python/tarfile.cfgó    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Úgname)ZatimeZctimer(   r)   r*   r'   Úntzutf-8c             C   s8   | d krt dƒ‚| j||ƒ} | d |… |t| ƒ t  S )Nzmetadata cannot contain None)Ú
ValueErrorÚencodeÚlenÚNUL)ÚsÚlengthÚencodingÚerrors© r6   ú/usr/lib64/python3.6/tarfile.pyÚstn©   s    r8   c             C   s*   | j dƒ}|dkr| d |… } | j||ƒS )Nr   r#   éÿÿÿÿ)ÚfindÚdecode)r2   r4   r5   Úpr6   r6   r7   Ú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| jƒ p€d	dƒ}W n tk
r¤   td
ƒ‚Y nX |S )Nr   é€   éÿ   r#   é   é   ÚasciiÚstrictÚ0zinvalid header)r>   r?   )Úranger0   r=   ÚintÚstripr.   ÚInvalidHeaderError)r2   ÚnÚir6   r6   r7   Únti¹   s    rK   r@   c             C   sÜ   t | ƒ} d|   ko"d|d  k n  rDtd|d | f dƒt }n”|tkrÐd|d   |   kopd|d  k n  rÐ| dkrŠtdgƒ}ntdgƒ}d| |  } x6t|d ƒD ]}|jd| d@ ƒ | dL } q®W ntd	ƒ‚|S )
Nr   r@   r#   z%0*orB   rA   r>   r?   zoverflow in number field)rF   Úbytesr1   r   Ú	bytearrayrE   Úinsertr.   )rI   ÚdigitsÚformatr2   rJ   r6   r6   r7   ÚitnÍ   s     2
rQ   c             C   s0   dt tjd| ƒƒ }dt tjd| ƒƒ }||fS )NrA   Z
148B8x356BZ
148b8x356b)ÚsumÚstructZunpack_from)ÚbufZunsigned_chksumZsigned_chksumr6   r6   r7   Úcalc_chksumsê   s    	rU   c       	      C   sª   |pd}|dkrd S |d kr.t j| ||ƒ d S t||ƒ\}}x8t|ƒD ],}| j|ƒ}t|ƒ|k rh|dƒ‚|j|ƒ qFW |dkr¦| j|ƒ}t|ƒ|k rœ|dƒ‚|j|ƒ d S )Né   i   r   zunexpected end of datai @  )ÚshutilÚcopyfileobjÚdivmodrE   Úreadr0   Úwrite)	ÚsrcÚdstr3   Ú	exceptionÚbufsizeÚblocksÚ	remainderÚbrT   r6   r6   r7   rX   ÷   s$    


rX   c             C   s    dd l }|jdtdƒ tj| ƒS )Nr   z$deprecated in favor of stat.filemoder$   )ÚwarningsÚwarnÚDeprecationWarningÚstatÚfilemode)Úmoderc   r6   r6   r7   rg     s    rg   c             C   s8   t tjdd ƒ}|d k	r(| j|dƒj|ƒ} t| dd� d S )Nr4   Úbackslashreplaceú )Úend)ÚgetattrÚsysÚstdoutr/   r;   Úprint)r2   r4   r6   r6   r7   Ú_safe_print  s    rp   c               @   s   e Zd ZdS )r   N)Ú__name__Ú
__module__Ú__qualname__r6   r6   r6   r7   r     s   c               @   s   e Zd ZdS )r
   N)rq   rr   rs   r6   r6   r6   r7   r
   !  s   c               @   s   e Zd ZdS )r   N)rq   rr   rs   r6   r6   r6   r7   r   $  s   c               @   s   e Zd ZdS )r   N)rq   rr   rs   r6   r6   r6   r7   r   '  s   c               @   s   e Zd ZdS )r	   N)rq   rr   rs   r6   r6   r6   r7   r	   *  s   c               @   s   e Zd ZdS )r   N)rq   rr   rs   r6   r6   r6   r7   r   -  s   c               @   s   e Zd ZdS )ÚEmptyHeaderErrorN)rq   rr   rs   r6   r6   r6   r7   rt   0  s   rt   c               @   s   e Zd ZdS )ÚTruncatedHeaderErrorN)rq   rr   rs   r6   r6   r6   r7   ru   3  s   ru   c               @   s   e Zd ZdS )ÚEOFHeaderErrorN)rq   rr   rs   r6   r6   r6   r7   rv   6  s   rv   c               @   s   e Zd ZdS )rH   N)rq   rr   rs   r6   r6   r6   r7   rH   9  s   rH   c               @   s   e Zd ZdS )ÚSubsequentHeaderErrorN)rq   rr   rs   r6   r6   r6   r7   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 j||dƒ| _d S )N)ÚrÚwÚO_BINARYi¶  )	ÚosÚO_RDONLYÚO_WRONLYÚO_CREATÚO_TRUNCÚhasattrr{   r   Úfd)ÚselfÚnamerh   r6   r6   r7   Ú__init__I  s    

z_LowLevelFile.__init__c             C   s   t j| jƒ d S )N)r|   Úcloser‚   )rƒ   r6   r6   r7   r†   R  s    z_LowLevelFile.closec             C   s   t j| j|ƒS )N)r|   rZ   r‚   )rƒ   r'   r6   r6   r7   rZ   U  s    z_LowLevelFile.readc             C   s   t j| j|ƒ d S )N)r|   r[   r‚   )rƒ   r2   r6   r6   r7   r[   X  s    z_LowLevelFile.writeN)rq   rr   rs   r…   r†   rZ   r[   r6   r6   r6   r7   rx   C  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|ƒ}|jƒ }|p<d| _|| _|| _|| _|| _d| _	d| _
d| _�yL|dkrÖydd l}W n tk
rž   tdƒ‚Y nX || _|jdƒ| _|d	krÌ| jƒ  |j| _n| jƒ  nà|d
k�r:ydd l}W n tk
�r
   tdƒ‚Y nX |d	k�r.d| _|jƒ | _t| _n
|jƒ | _n||dk�r ydd l}W n tk
�rn   tdƒ‚Y nX |d	k�r”d| _|jƒ | _|j| _n
|jƒ | _n|dk�r¶td| ƒ‚W n&   | j �sÒ| j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_   rT   Ú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    r6   r6   r7   r…   f  sl    












z_Stream.__init__c             C   s   t | dƒr| j r| jƒ  d S )Nr•   )r�   r•   r†   )rƒ   r6   r6   r7   Ú__del__¬  s    z_Stream.__del__c             C   s‚   | j jd| j j| j j | j jdƒ| _tjdtt	j	ƒ ƒƒ}| j
d| d ƒ | jjdƒrf| jd d
… | _| j
| j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   ÚpackrF   ÚtimeÚ_Stream__writer„   Úendswithr/   r1   )rƒ   Z	timestampr6   r6   r7   rœ   °  s    z_Stream._init_write_gzc             C   sR   | j dkr| jj|| jƒ| _|  jt|ƒ7  _| j dkrD| jj|ƒ}| j|ƒ d S )Nr‹   rŽ   )	r’   r–   r˜   r™   r”   r0   rž   Úcompressrª   )rƒ   r2   r6   r6   r7   r[   ¾  s    

z_Stream.writec             C   sR   |  j |7  _ x>t| j ƒ| jkrL| jj| j d | j… ƒ | j | jd … | _ qW d S )N)rT   r0   r_   r“   r[   )rƒ   r2   r6   r6   r7   Z__writeÈ  s    z_Stream.__writec             C   s²   | j r
d S d| _ zŠ| jdkr:| jdkr:|  j| jjƒ 7  _| jdkr˜| jr˜| jj| jƒ d| _| jdkr˜| jjtj	d| j
ƒƒ | jjtj	d| jd@ ƒƒ W d | js¬| jjƒ  X d S )NTrz   rŽ   rŠ   r‹   z<Ll   ÿÿ )r•   rh   r’   rT   rž   Úflushr“   r[   rS   r¨   r™   r”   r�   r†   )rƒ   r6   r6   r7   r†   Ñ  s    
z_Stream.closec             C   sö   | j j| j j ƒ| _d| _| jdƒdkr0tdƒ‚| jdƒdkrFtdƒ‚t| jdƒƒ}| jdƒ |d	@ r�t| jdƒƒd
t| jdƒƒ  }| j	|ƒ |d@ r¸x| jdƒ}| s²|t
kršP qšW |d@ ràx| jdƒ}| sÚ|t
krÂP qÂW |d@ rò| jdƒ d S )NrŠ   r$   s   ‹znot a gzip filer#   ó   zunsupported compression methodé   é   rA   r@   rV   )r–   Zdecompressobjr§   rž   r�   Ú_Stream__readr   r   ÚordrZ   r1   )rƒ   ÚflagZxlenr2   r6   r6   r7   rš   ç  s.    
 


z_Stream._init_read_gzc             C   s   | j S )N)r”   )rƒ   r6   r6   r7   Útell  s    z_Stream.tellr   c             C   s\   || j  dkrNt|| j  | jƒ\}}xt|ƒD ]}| j| jƒ q.W | j|ƒ ntdƒ‚| j S )Nr   z seeking backwards is not allowed)r”   rY   r_   rE   rZ   r	   )rƒ   r”   r`   ra   rJ   r6   r6   r7   Úseek  s    z_Stream.seekNc             C   sZ   |d kr:g }x | j | jƒ}|s P |j|ƒ qW dj|ƒ}n
| j |ƒ}|  jt|ƒ7  _|S )NrŠ   )Ú_readr_   ÚappendÚjoinr”   r0   )rƒ   r'   ÚtrT   r6   r6   r7   rZ     s    
z_Stream.readc             C   s°   | j dkr| j|ƒS t| jƒ}| jg}xd||k rŠ| j| jƒ}|sBP y| jj|ƒ}W n | jk
rp   tdƒ‚Y nX |j	|ƒ |t|ƒ7 }q(W dj
|ƒ}||d … | _|d |… S )NrŽ   zinvalid compressed datarŠ   )r’   r±   r0   r�   r_   rž   Z
decompressr^   r   r·   r¸   )rƒ   r'   Úcr¹   rT   r6   r6   r7   r¶   *  s"    





z_Stream._readc             C   sn   t | jƒ}| jg}x6||k rH| jj| jƒ}|s0P |j|ƒ |t |ƒ7 }qW dj|ƒ}||d … | _|d |… S )NrŠ   )r0   rT   r“   rZ   r_   r·   r¸   )rƒ   r'   rº   r¹   rT   r6   r6   r7   Z__read@  s    



z_Stream.__read)r   )N)rq   rr   rs   r…   r¢   rœ   r[   rª   r†   rš   r´   rµ   rZ   r¶   r±   r6   r6   r6   r7   r‡   [  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 jtƒ| _d S )N)r“   rZ   Ú	BLOCKSIZErT   )rƒ   r“   r6   r6   r7   r…   V  s    z_StreamProxy.__init__c             C   s   | j j| _| jS )N)r“   rZ   rT   )rƒ   r'   r6   r6   r7   rZ   Z  s    
z_StreamProxy.readc             C   sP   | j jdƒrdS | j dd… dkr8| j dd… dkr8d	S | j jdƒrHdS dS d S )Ns   ‹r‹   r   r¤   s   BZhr°   é
   s   1AY&SYrŒ   ó   ]  €ó   ý7zXZr�   rŽ   )r½   r¾   )rT   Ú
startswith)rƒ   r6   r6   r7   r‘   ^  s    $z_StreamProxy.getcomptypec             C   s   | j jƒ  d S )N)r“   r†   )rƒ   r6   r6   r7   r†   h  s    z_StreamProxy.closeN)rq   rr   rs   r…   rZ   r‘   r†   r6   r6   r6   r7   r�   Q  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j	d||d fƒ | jj	d||| |fƒ ||7 }|| }qZW || jk rÊ| j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realposr6   r6   r7   r…   u  s(    

z_FileInFile.__init__c             C   s   d S )Nr6   )rƒ   r6   r6   r7   r­   Ž  s    z_FileInFile.flushc             C   s   dS )NTr6   )rƒ   r6   r6   r7   Úreadable‘  s    z_FileInFile.readablec             C   s   dS )NFr6   )rƒ   r6   r6   r7   Úwritable”  s    z_FileInFile.writablec             C   s
   | j jƒ S )N)r“   Úseekable)rƒ   r6   r6   r7   rÇ   —  s    z_FileInFile.seekablec             C   s   | j S )N)rÂ   )rƒ   r6   r6   r7   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_ENDr.   )rƒ   rÂ   Úwhencer6   r6   r7   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ob|k n  rlP q:|  jd7  _| jt| jƒkr:d| _q:W t||| j ƒ}|rè| jj|| 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Ã   r0   r“   rµ   rZ   r   r1   )	rƒ   r'   rT   ÚdataÚstartÚstoprÁ   r3   rb   r6   r6   r7   rZ   ¯  s.    

z_FileInFile.readc             C   s&   | j t|ƒƒ}||d t|ƒ…< t|ƒS )N)rZ   r0   )rƒ   rb   rT   r6   r6   r7   ÚreadintoÎ  s    z_FileInFile.readintoc             C   s
   d| _ d S )NT)r•   )rƒ   r6   r6   r7   r†   Ó  s    z_FileInFile.close)N)N)rq   rr   rs   r…   r­   rÅ   rÆ   rÇ   r´   rÈ   rÉ   rµ   rZ   rÒ   r†   r6   r6   r6   r7   rÀ   o  s   

rÀ   c                   s   e Zd Z‡ fdd„Z‡  ZS )ÚExFileObjectc                s&   t |j|j|j|jƒ}tƒ j|ƒ d S )N)rÀ   r“   Úoffset_datar'   ÚsparseÚsuperr…   )rƒ   ÚtarfileÚtarinfor“   )Ú	__class__r6   r7   r…   Ù  s    
zExFileObject.__init__)rq   rr   rs   r…   Ú__classcell__r6   r6   )rÙ   r7   rÓ   ×  s   rÓ   c               @   s   e Zd ZdS )ÚFilterErrorN)rq   rr   rs   r6   r6   r6   r7   rÛ   ä  s   rÛ   c                   s   e Zd Z‡ fdd„Z‡  ZS )ÚAbsolutePathErrorc                s    || _ tƒ jd|j›d�ƒ d S )Nzmember z has an absolute path)rØ   rÖ   r…   r„   )rƒ   rØ   )rÙ   r6   r7   r…   è  s    zAbsolutePathError.__init__)rq   rr   rs   r…   rÚ   r6   r6   )rÙ   r7   rÜ   ç  s   rÜ   c                   s   e Zd Z‡ fdd„Z‡  ZS )ÚOutsideDestinationErrorc                s.   || _ || _tƒ j|j›d|›d�d ƒ d S )Nz would be extracted to z, z which is outside the destination)rØ   Ú_pathrÖ   r…   r„   )rƒ   rØ   r%   )rÙ   r6   r7   r…   í  s    z OutsideDestinationError.__init__)rq   rr   rs   r…   rÚ   r6   r6   )rÙ   r7   rÝ   ì  s   rÝ   c                   s   e Zd Z‡ fdd„Z‡  ZS )ÚSpecialFileErrorc                s   || _ tƒ j|j›d�ƒ d S )Nz is a special file)rØ   rÖ   r…   r„   )rƒ   rØ   )rÙ   r6   r7   r…   ô  s    zSpecialFileError.__init__)rq   rr   rs   r…   rÚ   r6   r6   )rÙ   r7   rß   ó  s   rß   c                   s   e Zd Z‡ fdd„Z‡  ZS )ÚAbsoluteLinkErrorc                s   || _ tƒ j|j›d�ƒ d S )Nz! is a symlink to an absolute path)rØ   rÖ   r…   r„   )rƒ   rØ   )rÙ   r6   r7   r…   ù  s    zAbsoluteLinkError.__init__)rq   rr   rs   r…   rÚ   r6   r6   )rÙ   r7   rà   ø  s   rà   c                   s   e Zd Z‡ fdd„Z‡  ZS )ÚLinkOutsideDestinationErrorc                s.   || _ || _tƒ j|j›d|›d�d ƒ d S )Nz would link to z, z which is outside the destination)rØ   rÞ   rÖ   r…   r„   )rƒ   rØ   r%   )rÙ   r6   r7   r…   þ  s    z$LinkOutsideDestinationError.__init__)rq   rr   rs   r…   rÚ   r6   r6   )rÙ   r7   rá   ý  s   rá   c                   s   e Zd Z‡ fdd„Z‡  ZS )ÚLinkFallbackErrorc                s2   || _ || _tƒ jd|j›d�d|›d� ƒ d S )Nzlink z would be extracted as a zcopy of z, which was rejected)rØ   rÞ   rÖ   r…   r„   )rƒ   rØ   r%   )rÙ   r6   r7   r…     s    zLinkFallbackError.__init__)rq   rr   rs   r…   rÚ   r6   r6   )rÙ   r7   râ     s   râ   c             C   s$  i }| j }tjj|tjjd�}|jdtjfƒrH| jjdtj ƒ }|d< tjj|ƒr\t	| ƒ‚tjjtjj
||ƒtjjd�}tjj||gƒ|kr˜t| |ƒ‚| j}|d k	�r|d@ }|� rþ| jƒ sÆ| jƒ rà|d@ sÖ|dM }|dO }n| jƒ sð| jƒ röd }nt| ƒ‚|| jk�r||d< |�r | jd k	�r,d |d	< | jd k	�r@d |d
< | jd k	�rTd |d< | jd k	�rhd |d< | jƒ �s|| jƒ �r tjj| jƒ�r”t| ƒ‚tjj| jƒ}|| jk�r¶||d< | jƒ �rÜtjj
|tjj|ƒ| jƒ}ntjj
|| jƒ}tjj|tjjd�}tjj||gƒ|k�r t| |ƒ‚|S )N)rC   ú/r„   ií  é@   éI   i€  rh   r)   r*   r+   r,   Úlinknamei¶ÿÿÿ)r„   r|   r%   ÚrealpathÚALLOW_MISSINGr¿   ÚsepÚlstripÚisabsrÜ   r¸   Ú
commonpathrÝ   rh   ÚisregÚislnkÚisdirÚissymrß   r)   r*   r+   r,   ræ   rà   ÚnormpathÚdirnamerá   )ÚmemberÚ	dest_pathZfor_dataÚ	new_attrsr„   Ztarget_pathrh   Z
normalizedr6   r6   r7   Ú_get_filtered_attrs  sd    






rö   c             C   s   | S )Nr6   )ró   rô   r6   r6   r7   Úfully_trusted_filterT  s    r÷   c             C   s(   t | |dƒ}|r$| jf |ddi—ŽS | S )NFÚdeep)rö   r¥   )ró   rô   rõ   r6   r6   r7   Ú
tar_filterW  s    rù   c             C   s(   t | |dƒ}|r$| jf |ddi—ŽS | S )NTrø   F)rö   r¥   )ró   rô   rõ   r6   r6   r7   Údata_filter]  s    rú   )Zfully_trustedrŽ   rÏ   s   ([0-9]{1,20}) c               @   sª  e Zd ZdlZdmdd„Zdd„ Zdd„ ZeeeƒZdd„ Z	dd„ Z
ee	e
ƒZd d!„ Zeeeeeeeed"ed#œ
d$d%„Zd&d'„ Zeed(fd)d*„Zd+d,„ Zd-d.„ Zd/d0„ Zed1d2„ ƒZd3d4„ Zed5d6„ ƒZed7d8„ ƒZed9d:„ ƒZed;d<„ ƒZed=d>„ ƒZed?d@„ ƒZdAdB„ Z dCdD„ Z!dEdF„ Z"dGdH„ Z#dIdJ„ Z$dKdL„ Z%dMdN„ Z&dOdP„ Z'dQdR„ Z(dSdT„ Z)dUdV„ Z*dWdX„ Z+dYdZ„ Z,d[d\„ Z-d]d^„ Z.d_d`„ Z/dadb„ Z0dcdd„ Z1dedf„ Z2dgdh„ Z3didj„ Z4dkS )nr   r„   rh   r)   r*   r'   r(   ÚchksumÚtyperæ   r+   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„   r6   r6   r7   r…   �  s"    zTarInfo.__init__c             C   s   | j S )N)r„   )rƒ   r6   r6   r7   Ú_getpath›  s    zTarInfo._getpathc             C   s
   || _ d S )N)r„   )rƒ   r„   r6   r6   r7   Ú_setpath�  s    zTarInfo._setpathc             C   s   | j S )N)ræ   )rƒ   r6   r6   r7   Ú_getlinkpath¡  s    zTarInfo._getlinkpathc             C   s
   || _ d S )N)ræ   )rƒ   ræ   r6   r6   r7   Ú_setlinkpath£  s    zTarInfo._setlinkpathc             C   s   d| j j| jt| ƒf S )Nz<%s %r at %#x>)rÙ   rq   r„   Úid)rƒ   r6   r6   r7   Ú__repr__§  s    zTarInfo.__repr__T)
r„   r(   rh   ræ   r)   r*   r+   r,   rø   Ú_KEEPc   
         C   sŽ   |	rt j| ƒ}n
t j | ƒ}||
k	r(||_||
k	r6||_||
k	rD||_||
k	rR||_||
k	r`||_||
k	rn||_||
k	r|||_||
k	rŠ||_	|S )N)
ÚcopyÚdeepcopyr„   r(   rh   ræ   r)   r*   r+   r,   )rƒ   r„   r(   rh   ræ   r)   r*   r+   r,   rø   r	  Úresultr6   r6   r7   r¥   ª  s(    
zTarInfo.replacec             C   s‚   | j d krd }n
| j d@ }| j|| j| j| j| j| j| j| j| j	| j
| j| jdœ}|d tkr~|d jdƒ r~|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ý   rþ   ÚDIRTYPEr«   )rƒ   rh   Úinfor6   r6   r7   Úget_infoÆ  s&    


zTarInfo.get_infoÚsurrogateescapec             C   s~   | j ƒ }x(|jƒ D ]\}}|d krtd| ƒ‚qW |tkrH| j|||ƒS |tkr^| j|||ƒS |tkrr| j||ƒS tdƒ‚d S )Nz%s may not be Nonezinvalid format)	r  Úitemsr.   r   Úcreate_ustar_headerr   Úcreate_gnu_headerr   Úcreate_pax_header)rƒ   rP   r4   r5   r  r„   Úvaluer6   r6   r7   Útobufâ  s    zTarInfo.tobufc             C   sn   t |d< t|d j||ƒƒtkr(tdƒ‚t|d j||ƒƒtkr^| j|d ||ƒ\|d< |d< | j|t||ƒS )NÚmagicræ   zlinkname is too longr„   Úprefix)	ÚPOSIX_MAGICr0   r/   ÚLENGTH_LINKr.   ÚLENGTH_NAMEÚ_posix_split_nameÚ_create_headerr   )rƒ   r  r4   r5   r6   r6   r7   r  ó  s    zTarInfo.create_ustar_headerc             C   s€   t |d< d}t|d j||ƒƒtkr<|| j|d t||ƒ7 }t|d j||ƒƒtkrl|| j|d t||ƒ7 }|| j|t	||ƒ S )Nr  rŠ   ræ   r„   )
Ú	GNU_MAGICr0   r/   r  Ú_create_gnu_long_headerÚGNUTYPE_LONGLINKr  ÚGNUTYPE_LONGNAMEr  r   )rƒ   r  r4   r5   rT   r6   r6   r7   r     s    zTarInfo.create_gnu_headerc       
      C   s4  t |d< | jjƒ }x„ddtfddtfddfD ]h\}}}||kr@q,y|| jd	d
ƒ W n" tk
rv   || ||< w,Y nX t|| ƒ|kr,|| ||< q,W xldD ]d\}}||kr¸d||< qž|| }d|  koÚd|d  k n   � sît|t	ƒržt
|ƒ||< d||< qžW |�r| j|t|ƒ}	nd}	|	| j|td	dƒ S )Nr  r„   r%   ræ   r&   r+   é    r,   rB   rC   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  rÿ   r
  r  r  r/   ÚUnicodeEncodeErrorr0   Ú
isinstanceÚfloatÚstrÚ_create_pax_generic_headerÚXHDTYPEr  r   )
rƒ   r  r4   rÿ   r„   Zhnamer3   rO   ÚvalrT   r6   r6   r7   r    s4    
.zTarInfo.create_pax_headerc             C   s   | j |tdƒS )Nzutf-8)r,  ÚXGLTYPE)Úclsrÿ   r6   r6   r7   Úcreate_pax_global_header?  s    z TarInfo.create_pax_global_headerc             C   s€   |j dƒ}xltdt|ƒƒD ]R}dj|d |… ƒ}dj||d … ƒ}t|j||ƒƒtkrt|j||ƒƒtkrP qW tdƒ‚||fS )Nrã   r#   zname is too long)ÚsplitrE   r0   r¸   r/   ÚLENGTH_PREFIXr  r.   )rƒ   r„   r4   r5   Z
componentsrJ   r  r6   r6   r7   r  E  s    
zTarInfo._posix_split_namec             C   sÆ  | j dƒttfk}|r@t| j ddƒd|ƒ}t| j ddƒd|ƒ}ntdd||ƒ}tdd||ƒ}| j dtƒ}|d krxtdƒ‚t| j ddƒd	||ƒt| j d
dƒd@ d|ƒt| j ddƒd|ƒt| j ddƒd|ƒt| j ddƒd|ƒt| j ddƒd|ƒd|t| j ddƒd	||ƒ| j dtƒt| j ddƒd||ƒt| j ddƒd||ƒt| j ddƒd|ƒt| j ddƒd|ƒt| j ddƒd||ƒg}tj	dt
 dj|ƒƒ}	t|	t
 d … ƒd }
|	d d… td|
 dƒ |	d d …  }	|	S )!Nrü   rý   r   r@   rþ   r‰   zTarInfo.type must not be Noner„   r   rh   iÿ  r)   r*   r'   r#  r(   s           ræ   r  r+   r"  r,   r  r   z%dsrŠ   il  z%06o rB   ie  i”þÿÿi›þÿÿ)ÚgetÚCHRTYPEÚBLKTYPErQ   r8   r  r.   r  rS   r¨   r»   r¸   rU   rL   )r  rP   r4   r5   Zhas_device_fieldsrý   rþ   ZfiletypeÚpartsrT   rû   r6   r6   r7   r  U  s8    
&zTarInfo._create_headerc             C   s.   t t| ƒtƒ\}}|dkr*| t| t 7 } | S )Nr   )rY   r0   r»   r1   )Zpayloadr`   ra   r6   r6   r7   Ú_create_payload  s    zTarInfo._create_payloadc             C   sR   |j ||ƒt }i }d|d< ||d< t|ƒ|d< t|d< | j|t||ƒ| j|ƒ S )Nz././@LongLinkr„   rü   r'   r  )r/   r1   r0   r  r  r   r8  )r0  r„   rü   r4   r5   r  r6   r6   r7   r  ‰  s    zTarInfo._create_gnu_long_headerc             C   s:  d}x@|j ƒ D ]4\}}y|jddƒ W q tk
r@   d}P Y qX qW d}|rV|d7 }x |j ƒ D ]”\}}|jdƒ}|r„|j|dƒ}n
|j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< | j|td
dƒ| j	|ƒ S )NFzutf-8rC   TrŠ   s   21 hdrcharset=BINARY
r  r¤   r   rB   ó    ó   =ó   
z././@PaxHeaderr„   rü   r'   r  r¥   )
r  r/   r(  r0   r+  rL   r  r  r   r8  )r0  rÿ   rü   r4   ZbinaryÚkeywordr  ZrecordsÚlrI   r<   r  r6   r6   r7   r,  š  s<    

*z"TarInfo._create_pax_generic_headerc             C   st  t |ƒdkrtdƒ‚t |ƒtkr(tdƒ‚|j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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 |j|
|fƒ |d7 }�q¤W t|d ƒ}t|dd… ƒ}|||f|_ |j!ƒ �rN|j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ï  )$r0   rt   r»   ru   Úcountr1   rv   rK   rU   rH   r=   r„   rh   r)   r*   r'   r(   rû   rü   ræ   r+   r,   rý   rþ   ÚAREGTYPEr«   r  ÚGNUTYPE_SPARSErE   r.   r·   Úboolr   rï   ÚrstripÚ	GNU_TYPES)r0  rT   r4   r5   rû   Úobjr  r”   ÚstructsrJ   rÁ   ÚnumbytesÚ
isextendedÚorigsizer6   r6   r7   ÚfrombufÍ  sZ    
zTarInfo.frombufc             C   s8   |j jtƒ}| j||j|jƒ}|j jƒ t |_|j|ƒS )N)	r“   rZ   r»   rQ  r4   r5   r´   rÁ   Ú_proc_member)r0  r×   rT   rL  r6   r6   r7   Úfromtarfile  s    zTarInfo.fromtarfilec             C   sT   | j ttfkr| j|ƒS | j tkr,| j|ƒS | j tttfkrF| j	|ƒS | j
|ƒS d S )N)rü   r!  r   Ú_proc_gnulongrH  Ú_proc_sparser-  r/  ÚSOLARIS_XHDTYPEÚ	_proc_paxÚ_proc_builtin)rƒ   r×   r6   r6   r7   rR  !  s    



zTarInfo._proc_memberc             C   sR   |j jƒ | _| j}| jƒ s$| jtkr4|| j| jƒ7 }||_| j	|j
|j|jƒ | S )N)r“   r´   rÔ   rí   rü   ÚSUPPORTED_TYPESÚ_blockr'   rÁ   Ú_apply_pax_inforÿ   r4   r5   )rƒ   r×   rÁ   r6   r6   r7   rX  .  s    zTarInfo._proc_builtinc             C   s†   |j j| j| jƒƒ}y| j|ƒ}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   rZ  r'   rS  r   rw   rÁ   rü   r!  r=   r4   r5   r„   r   ræ   )rƒ   r×   rT   Únextr6   r6   r7   rT  ?  s    

zTarInfo._proc_gnulongc       
      C   sÞ   | j \}}}| ` xœ|r¬|jjtƒ}d}xvtdƒD ]j}y0t|||d … ƒ}t||d |d … ƒ}	W n tk
rz   P Y nX |r’|	r’|j||	fƒ |d7 }q0W t|d ƒ}qW || _	|jj
ƒ | _| j| j| jƒ |_|| _| S )Nr   é   r#  rE  iø  )r   r“   rZ   r»   rE   rK   r.   r·   rI  rÕ   r´   rÔ   rZ  r'   rÁ   )
rƒ   r×   rM  rO  rP  rT   r”   rJ   rÁ   rN  r6   r6   r7   rU  U  s(    zTarInfo._proc_sparsec             C   sÖ  |j j| j| jƒƒ}| jtkr&|j}n
|jjƒ }d}d }g }�x0t|ƒ|koV|| dk�rnt	j
||ƒ}|srtdƒ‚yt|jdƒƒ}W n tk
r    tdƒ‚Y nX |dk r²tdƒ‚|| t|ƒkrÊtdƒ‚|jdƒ| d }	||jdƒd |	… }
|
jdƒ\}}}| �s"|dk�s"||	 dk�r*tdƒ‚|j|||fƒ |dk�rd|d k�rd|dk�r`|j}nd	}||7 }q@W |d k�r~d	}x`|D ]X\}}}| j|d	d	|jƒ}|tk�rÀ| j|||j|jƒ}n| j|d	d	|jƒ}|||< �q„W y| j|ƒ}W n tk
�r   td
ƒ‚Y nX d|k�r&| j||ƒ nFd|k�r>| j||ƒ n.|jdƒdk�rl|jdƒdk�rl| j|||ƒ | jttfk�rÒ|j ||j|jƒ | j!|_!d|k�rÒ|j"}|j#ƒ �s¼|jt$k�rÌ||j|jƒ7 }||_!|S )Nr   zinvalid headerr#   é   r:  r¼   s
   hdrcharsets   BINARYzutf-8z missing or bad subsequent headerzGNU.sparse.mapzGNU.sparse.sizezGNU.sparse.majorÚ1zGNU.sparse.minorrD   r'   )%r“   rZ   rZ  r'   rü   r/  rÿ   r
  r0   Ú_header_length_prefix_reÚmatchrH   rF   Úgroupr.   rÐ   rk   Ú	partitionr·   r4   Ú_decode_pax_fieldr5   ÚPAX_NAME_FIELDSrS  r   rw   Ú_proc_gnusparse_01Ú_proc_gnusparse_00r4  Ú_proc_gnusparse_10r-  rV  r[  rÁ   rÔ   rí   rY  )rƒ   r×   rT   rÿ   r”   r4   Úraw_headersra  r3   Zheader_value_end_offsetZkeyword_and_valueZraw_keywordZequalsZ	raw_valuer<  r  r\  rÁ   r6   r6   r7   rW  q  sx    

 







 
zTarInfo._proc_paxc             C   sª   g }g }xŒ|D ]„\}}}|dkrVy|j t|jƒ ƒƒ W q’ tk
rR   tdƒ‚Y q’X q|dkry|j t|jƒ ƒƒ W q tk
r�   tdƒ‚Y qX qW tt||ƒƒ|_d S )Ns   GNU.sparse.offsetzinvalid headers   GNU.sparse.numbytes)r·   rF   r;   r.   rH   ÚlistÚziprÕ   )rƒ   r\  ri  ZoffsetsrN  Ú_r<  r  r6   r6   r7   rg  ë  s    zTarInfo._proc_gnusparse_00c             C   s@   dd„ |d j dƒD ƒ}tt|d d d… |dd d… ƒƒ|_d S )Nc             S   s   g | ]}t |ƒ‘qS r6   )rF   )Ú.0Úxr6   r6   r7   ú
<listcomp>  s    z.TarInfo._proc_gnusparse_01.<locals>.<listcomp>zGNU.sparse.mapú,r$   r#   )r2  rj  rk  rÕ   )rƒ   r\  rÿ   rÕ   r6   r6   r7   rf  ÿ  s    zTarInfo._proc_gnusparse_01c             C   s¬   d }g }|j jtƒ}|jddƒ\}}t|ƒ}xJt|ƒ|d k rvd|krV||j jtƒ7 }|jddƒ\}}|jt|ƒƒ q.W |j jƒ |_t	t
|d d d… |dd d… ƒƒ|_d S )Nr;  r#   r$   )r“   rZ   r»   r2  rF   r0   r·   r´   rÔ   rj  rk  rÕ   )rƒ   r\  rÿ   r×   ZfieldsrÕ   rT   Znumberr6   r6   r7   rh    s    zTarInfo._proc_gnusparse_10c             C   sÆ   x¶|j ƒ 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¨|jdƒ}t| ||ƒ q
W |jƒ | _d S )NzGNU.sparse.namer%   zGNU.sparse.sizer'   zGNU.sparse.realsizer   rã   )	r  ÚsetattrrF   Ú
PAX_FIELDSÚPAX_NUMBER_FIELDSr.   rJ  r
  rÿ   )rƒ   rÿ   r4   r5   r<  r  r6   r6   r7   r[    s"    

zTarInfo._apply_pax_infoc             C   s.   y|j |dƒS  tk
r(   |j ||ƒS X d S )NrC   )r;   ÚUnicodeDecodeError)rƒ   r  r4   Zfallback_encodingZfallback_errorsr6   r6   r7   rd  ,  s    zTarInfo._decode_pax_fieldc             C   s2   |dk rt dƒ‚t|tƒ\}}|r*|d7 }|t S )Nr   zinvalid offsetr#   )rH   rY   r»   )rƒ   rF  r`   ra   r6   r6   r7   rZ  4  s    zTarInfo._blockc             C   s
   | j tkS )N)rü   ÚREGULAR_TYPES)rƒ   r6   r6   r7   rí   @  s    zTarInfo.isregc             C   s   | j ƒ S )N)rí   )rƒ   r6   r6   r7   ÚisfileB  s    zTarInfo.isfilec             C   s
   | j tkS )N)rü   r  )rƒ   r6   r6   r7   rï   D  s    zTarInfo.isdirc             C   s
   | j tkS )N)rü   ÚSYMTYPE)rƒ   r6   r6   r7   rð   F  s    zTarInfo.issymc             C   s
   | j tkS )N)rü   ÚLNKTYPE)rƒ   r6   r6   r7   rî   H  s    zTarInfo.islnkc             C   s
   | j tkS )N)rü   r5  )rƒ   r6   r6   r7   ÚischrJ  s    zTarInfo.ischrc             C   s
   | j tkS )N)rü   r6  )rƒ   r6   r6   r7   ÚisblkL  s    zTarInfo.isblkc             C   s
   | j tkS )N)rü   ÚFIFOTYPE)rƒ   r6   r6   r7   ÚisfifoN  s    zTarInfo.isfifoc             C   s
   | j d k	S )N)rÕ   )rƒ   r6   r6   r7   ÚissparseP  s    zTarInfo.issparsec             C   s   | j tttfkS )N)rü   r5  r6  r{  )rƒ   r6   r6   r7   ÚisdevR  s    zTarInfo.isdevN)r„   rh   r)   r*   r'   r(   rû   rü   ræ   r+   r,   rý   rþ   rÁ   rÔ   rÿ   rÕ   r×   r   r  )r‰   )5rq   rr   rs   Ú	__slots__r…   r  r  Úpropertyr%   r  r  r&   r  r	  r¥   r  r   r   r  r  r  r  Úclassmethodr1  r  Ústaticmethodr  r8  r  r,  rQ  rS  rR  rX  rT  rU  rW  rg  rf  rh  r[  rd  rZ  rí   rv  rï   rð   rî   ry  rz  r|  r}  r~  r6   r6   r6   r7   r   s  sd       


1*
3?z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Zdjdd„Zedddefd	d
„ƒZedkdd„ƒZedldd„ƒZedmdd„ƒZedndd„ƒZdddddœZdd„ Zdd„ Zdd„ Zdd „ Zdod!d"„Zdpdd$œd%d&„Zdqdd'œd(d)„Z drd*d+„Z!d,d-„ Z"dsddd/œd0d1„Z#d2d3„ Z$dtddd/œd5d6„Z%d7d8„ Z&dud9d:„Z'd;d<„ Z(d=d>„ Z)d?d@„ Z*dvdddAœdBdC„Z+dDdE„ Z,dFdG„ Z-dHdI„ Z.dJdK„ Z/dLdM„ Z0dNdO„ Z1dPdQ„ Z2dRdS„ Z3dTdU„ Z4dVdW„ Z5dXdY„ Z6dwdZd[„Z7d\d]„ Z8dxd^d_„Z9d`da„ Z:dbdc„ Z;ddde„ Z<dfdg„ Z=dhdi„ Z>dS )yr   r   Fr#   Nry   r  c             C   s°  dddddœ}||krt dƒ‚|| _|| | _|sj| jdkrVtjj|ƒ rVd| _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j|ƒnd | _
|| _|d k	rÔ|| _|d k	râ|| _|d k	rð|| _|d k	�r || _|d k	�r|| _|	| _|
d k	�r4| jtk�r4|
| _ni | _|d k	�rJ|| _|d k	�rZ|| _|| _d	| _g | _d	| _| jjƒ | _i | _� yþ| jdk�r¤d | _ | j!ƒ | _ | jdk�r8x†| jj"| jƒ y| jj#| ƒ}| jj$|ƒ W nT t%k
�r   | jj"| jƒ P Y n0 t&k
�r0 } zt't|ƒƒ‚W Y d d }~X nX �q²W | jdk�r‚d| _| j�r‚| jj(| jj)ƒ ƒ}| jj*|ƒ |  jt+|ƒ7  _W n&   | j�sž| jj,ƒ  d| _‚ Y nX d S )NÚrbzr+bÚwbZxb)ry   Úarz   rn  z!mode must be 'r', 'a', 'w' or 'x'r…  rz   Fr„   rh   Try   rn  )r…  rz   rn  )-r.   rh   Ú_moder|   r%   ÚexistsÚ	bltn_openr�   r�   r)  r„   r+  rL   Úabspathr“   rP   rØ   ÚdereferenceÚignore_zerosr4   r5   r   rÿ   ÚdebugÚ
errorlevelÚcopybufsizer•   ÚmembersÚ_loadedr´   rÁ   ÚinodesÚfirstmemberr\  rµ   rS  r·   rv   r   r   r1  r
  r[   r0   r†   )rƒ   r„   rh   r“   rP   rØ   rŠ  r‹  r4   r5   rÿ   rŒ  r�  rŽ  ZmodesÚerT   r6   r6   r7   r…   r  sŠ    






$
zTarFile.__init__c                sº  | r| rt dƒ‚|dkrª‡ fdd„}xttˆ j|d�D ]b}tˆ ˆ j| ƒ}|d k	r\|jƒ }	y||d|f|ŽS  ttfk
r˜   |d k	r’|j|	ƒ w8Y q8X q8W tdƒ‚�nd|k�r|jdd	ƒ\}
}|
pÊd}
|pÒd
}|ˆ jkrðtˆ ˆ j| ƒ}ntd| ƒ‚|||
|f|ŽS d|k�r’|jdd	ƒ\}
}|
�p.d}
|�p8d
}|
dk�rLt dƒ‚t	||
|||ƒ}yˆ ||
|f|Ž}W n   |j
ƒ  ‚ Y nX d|_|S |dk�r®ˆ j|||f|ŽS t dƒ‚d S )Nznothing to openry   úr:*c                s   ˆ j |  dkS )NÚtaropen)Ú	OPEN_METH)r’   )r0  r6   r7   Únot_compressed  s    z$TarFile.open.<locals>.not_compressed)Úkeyz%file could not be opened successfullyú:r#   rŽ   zunknown compression type %rú|rz   zmode must be 'r' or 'w'Fr…  rn  zundiscernible mode)ry   r”  )ry   rz   )r…  rz   rn  )r.   Úsortedr–  rl   r´   r   r   rµ   r2  r‡   r†   r�   r•  )r0  r„   rh   r“   r_   Úkwargsr—  r’   ÚfuncZ	saved_posrg   Ústreamr¹   r6   )r0  r7   r   á  sP    %







zTarFile.openc             K   s    |dkrt dƒ‚| |||f|ŽS )Nry   r…  rz   rn  z!mode must be 'r', 'a', 'w' or 'x')ry   r…  rz   rn  )r.   )r0  r„   rh   r“   rœ  r6   r6   r7   r•  <  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|j||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Ð   |j	ƒ  |dkrÊtdƒ‚‚ Y n   |j	ƒ  ‚ Y nX d	|_
|S )Nry   rz   rn  zmode must be 'r', 'w' or 'x'r   zgzip module is not availablerb   znot a gzip fileF)ry   rz   rn  )r.   ÚgzipZGzipFiler—   ÚAttributeErrorr   rŸ   r   r•  r†   r�   )r0  r„   rh   r“   Úcompresslevelrœ  rŸ  r¹   r6   r6   r7   ÚgzopenD  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–   |jƒ  |dkr�t	dƒ‚‚ Y n   |jƒ  ‚ Y nX d	|_
|S )Nry   rz   rn  zmode must be 'r', 'w' or 'x'r   zbz2 module is not available)r¡  znot a bzip2 fileF)ry   rz   rn  )r.   rŒ   r—   r   ZBZ2Filer•  rŸ   ÚEOFErrorr†   r   r�   )r0  r„   rh   r“   r¡  rœ  rŒ   r¹   r6   r6   r7   Úbz2openf  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˜   |jƒ  |dkr’t	dƒ‚‚ Y n   |jƒ  ‚ Y nX d	|_
|S )Nry   rz   rn  zmode must be 'r', 'w' or 'x'r   zlzma module is not available)Úpresetznot an lzma fileF)ry   rz   rn  )r.   r    r—   r   ZLZMAFiler•  r¡   r£  r†   r   r�   )r0  r„   rh   r“   r¥  rœ  r    r¹   r6   r6   r7   Ú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jttd  ƒ |  jtd 7  _t| jtƒ\}}|dkrn| jjtt|  ƒ W d | j	s‚| jj
ƒ  X d S )NTr…  rz   rn  r$   r   )r…  rz   rn  )r•   rh   r“   r[   r1   r»   rÁ   rY   Ú
RECORDSIZEr�   r†   )rƒ   r`   ra   r6   r6   r7   r†   ª  s    
zTarFile.closec             C   s"   | j |ƒ}|d krtd| ƒ‚|S )Nzfilename %r not found)Ú
_getmemberÚKeyError)rƒ   r„   rØ   r6   r6   r7   Ú	getmember¿  s    
zTarFile.getmemberc             C   s   | j ƒ  | js| jƒ  | jS )N)Ú_checkr�  Ú_loadr�  )rƒ   r6   r6   r7   Ú
getmembersÊ  s    zTarFile.getmembersc             C   s   dd„ | j ƒ D ƒS )Nc             S   s   g | ]
}|j ‘qS r6   )r„   )rm  rØ   r6   r6   r7   ro  Ø  s    z$TarFile.getnames.<locals>.<listcomp>)r­  )rƒ   r6   r6   r7   ÚgetnamesÔ  s    zTarFile.getnamesc             C   sp  | j dƒ |d k	r|j}|d kr$|}tjj|ƒ\}}|jtjdƒ}|jdƒ}| jƒ }| |_	|d krŒt
tdƒr€| j r€tj|ƒ}qštj|ƒ}ntj|jƒ ƒ}d}|j}tj|ƒ�r|j|jf}	| j rö|jdkrö|	| jkrö|| j|	 kröt}
| j|	 }nt}
|	d �rx|| j|	< nhtj|ƒ�r"t}
nVtj|ƒ�r4t}
nDtj|ƒ�rPt}
tj|ƒ}n(tj|ƒ�rbt }
ntj!|ƒ�rtt"}
nd S ||_||_#|j$|_%|j&|_'|
tk�r¨|j(|_)nd|_)|j*|_+|
|_,||_-t.�röyt.j/|j%ƒd |_0W n t1k
�rô   Y nX t2�r*yt2j3|j'ƒd |_4W n t1k
�r(   Y nX |
t t"fk�rlt
tdƒ�rlt
tdƒ�rltj5|j6ƒ|_7tj8|j6ƒ|_9|S )	NÚawxrã   Úlstatr‰   r#   r   ÚmajorÚminor):r«  r„   r|   r%   Ú
splitdriver¥   ré   rê   rØ   r×   r�   rŠ  r°  rf   ÚfstatÚfilenoÚst_modeÚS_ISREGÚst_inoÚst_devÚst_nlinkr‘  rx  r  ÚS_ISDIRr  ÚS_ISFIFOr{  ÚS_ISLNKrw  ÚreadlinkÚS_ISCHRr5  ÚS_ISBLKr6  rh   Úst_uidr)   Úst_gidr*   Úst_sizer'   Úst_mtimer(   rü   ræ   ÚpwdÚgetpwuidr+   r©  ÚgrpZgetgrgidr,   r±  Úst_rdevrý   r²  rþ   )rƒ   r„   Úarcnamer“   ZdrvrØ   Zstatresræ   ZstmdÚinoderü   r6   r6   r7   Ú
gettarinfoÚ  s~    	




zTarFile.gettarinfoT)r�  c            C   s0  | j ƒ  |d kr| }�x|D �]
}|rÒ|jd kr:tdƒ nttj|jƒƒ td|jpX|j|jpb|jf ƒ |j	ƒ sz|j
ƒ r”tdd|j|jf  ƒ ntd|j ƒ |jd kr¶tdƒ ntdtj|jƒd d…  ƒ t|j|jƒ räd	nd
 ƒ |�r"|jƒ �r
td|j ƒ |jƒ �r"td|j ƒ tƒ  qW d S )Nz
??????????z%s/%sz%10sz%d,%dz%10dz????-??-?? ??:??:??z%d-%02d-%02d %02d:%02d:%02dr¯   rã   r‰   z-> zlink to )r«  rh   rp   rf   rg   r+   r)   r,   r*   ry  rz  rý   rþ   r'   r(   r©   Z	localtimer„   rï   rð   ræ   rî   ro   )rƒ   Úverboser�  rØ   r6   r6   r7   rj  >  s2    





zTarFile.list)Úfilterc      	   
   C   sv  | j dƒ |d kr|}|d k	rPdd l}|jdtdƒ ||ƒrP| jdd| ƒ d S | jd k	r€tjj|ƒ| jkr€| jdd| ƒ d S | jd|ƒ | j	||ƒ}|d kr´| jdd| ƒ d S |d k	rà||ƒ}|d krà| jdd| ƒ d S |j
ƒ �rt|d	ƒ�}| j||ƒ W d Q R X nd|jƒ �rh| j|ƒ |�rrxHtj|ƒD ].}| jtjj||ƒtjj||ƒ|||d
� �q4W n
| j|ƒ d S )Nr¯  r   zuse the filter argument insteadr$   ztarfile: Excluded %rztarfile: Skipped %rr#   ztarfile: Unsupported type %rrƒ  )rÍ  )r«  rc   rd   re   Ú_dbgr„   r|   r%   r‰  rË  rí   rˆ  Úaddfilerï   ÚlistdirÚaddr¸   )	rƒ   r„   rÉ  Ú	recursiveZexcluderÍ  rc   rØ   Úfr6   r6   r7   rÑ  d  sB    



zTarFile.addc             C   s¾   | j dƒ tj|ƒ}|j| j| j| jƒ}| jj|ƒ |  jt	|ƒ7  _| j
}|d k	r®t|| j|j|d� t|jtƒ\}}|dkrœ| jjtt|  ƒ |d7 }|  j|t 7  _| jj|ƒ d S )Nr¯  )r_   r   r#   )r«  r
  r  rP   r4   r5   r“   r[   rÁ   r0   rŽ  rX   r'   rY   r»   r1   r�  r·   )rƒ   rØ   r“   rT   r_   r`   ra   r6   r6   r7   rÏ  ¡  s    

zTarFile.addfilec          "   C   sH  |d k�r| j }|d k� rìtjjdƒ}|d kr�yttƒ}W n tk
rN   Y nBX dd l}|jd dd�}|� |j	|ƒ W d Q R X |jdddd�}|rÒyt
| }W n& tk
rÆ   td|›d	�ƒd ‚Y nX || _ |S t� rètjdtƒ tS tS t|tƒ�r tdƒ‚|S t|ƒ�r|S yt
| S  tk
�rB   td|›d	�ƒd ‚Y nX d S )NZ PYTHON_TARFILE_EXTRACTION_FILTERr   ú#)ZinterpolationZcomment_prefixesr×   r‰   )Zfallbackzfilter z
 not foundz4The default behavior of tarfile extraction has been z$changed to disallow common exploits z(including CVE-2007-4559). z1By default, absolute/parent paths are disallowed z and some mode bits are cleared. z/See https://access.redhat.com/articles/7004769 zfor more details.z#String names are not supported for z2TarFile.extraction_filter. Use a function such as ztarfile.data_filter directly.)rÔ  zXThe default behavior of tarfile extraction has been changed to disallow common exploits zsThe default behavior of tarfile extraction has been changed to disallow common exploits (including CVE-2007-4559). z¤The default behavior of tarfile extraction has been changed to disallow common exploits (including CVE-2007-4559). By default, absolute/parent paths are disallowed zÄThe default behavior of tarfile extraction has been changed to disallow common exploits (including CVE-2007-4559). By default, absolute/parent paths are disallowed and some mode bits are cleared. zóThe default behavior of tarfile extraction has been changed to disallow common exploits (including CVE-2007-4559). By default, absolute/parent paths are disallowed and some mode bits are cleared. See https://access.redhat.com/articles/7004769 a  The default behavior of tarfile extraction has been changed to disallow common exploits (including CVE-2007-4559). By default, absolute/parent paths are disallowed and some mode bits are cleared. See https://access.redhat.com/articles/7004769 for more details.zUString names are not supported for TarFile.extraction_filter. Use a function such as zrString names are not supported for TarFile.extraction_filter. Use a function such as tarfile.data_filter directly.)Úextraction_filterr|   Úenvironr4  rˆ  Ú_CONFIG_FILENAMEÚFileNotFoundErrorÚconfigparserZConfigParserZ	read_fileÚ_NAMED_FILTERSr©  r.   Ú_RH_SAFER_DEFAULTrc   rd   ÚRuntimeWarningrù   r÷   r)  r+  Ú	TypeErrorÚcallable)rƒ   rÍ  r„   ÚfilerÙ  Zconfr6   r6   r7   Ú_get_filter_functionº  sR    


zTarFile._get_filter_functionÚ.)Únumeric_ownerrÍ  c         "   C   s®  g }| j |ƒ}|d kr| }xT|D ]L}| j|||ƒ\}}	|d kr@q |jƒ rR|j|	ƒ | j|||jƒ  ||d� q W |jdd„ dd� �x$|D �]}	yæy||	|ƒ}W n4 tk
rÔ }
 z| j|	t|
ƒƒ wŠW Y d d }
~
X nX |d krì| j|	dƒ wŠt	j
j||jƒ}yt	j|ƒ}W n$ tk
�r.   | j|dƒ wŠY nX tj|jƒ�sL| j|dƒ wŠ| j|||d	� | j||ƒ | j||ƒ W qŠ tk
�r¤ } z| j|ƒ W Y d d }~X qŠX qŠW d S )
N)Ú	set_attrsrâ  Úfilter_functionc             S   s   | j S )N)r„   )r…  r6   r6   r7   Ú<lambda>	  s    z$TarFile.extractall.<locals>.<lambda>T)r˜  Úreversezexcluded by filterZmissingznot a directory)râ  )rà  Ú_get_extract_tarinforï   r·   Ú_extract_oneÚsortÚ_FILTER_ERRORSÚ_log_no_directory_fixupÚreprr|   r%   r¸   r„   r°  rØ  rf   r»  r¶  ÚchownÚutimeÚchmodr
   Ú_handle_nonfatal_error)rƒ   r%   r�  râ  rÍ  Zdirectoriesrä  ró   rØ   Ú
unfilteredÚexcÚdirpathr°  r“  r6   r6   r7   Ú
extractallï  sP    


zTarFile.extractallc             C   s   | j dd|j|f ƒ d S )Nr$   z(tarfile: Not fixing up directory %r (%s))rÎ  r„   )rƒ   ró   Úreasonr6   r6   r7   rë  4	  s    zTarFile._log_no_directory_fixupr‰   c      	      C   s8   | j |ƒ}| j|||ƒ\}}|d k	r4| j||||ƒ d S )N)rà  rç  rè  )	rƒ   ró   r%   rã  râ  rÍ  rä  rØ   rñ  r6   r6   r7   Úextract8	  s
    
zTarFile.extractc             C   sÒ   t |tƒr| j|ƒ}n|}d }y|||ƒ}W nZ ttfk
r\ } z| j|ƒ W Y d d }~X n, tk
r† } z| j|ƒ W Y d d }~X nX |d kr¦| jdd|j	 ƒ dS |j
ƒ rÊtj|ƒ}tjj||jƒ|_||fS )Nr$   ztarfile: Excluded %r)NN)r)  r+  rª  rŸ   rÛ   Ú_handle_fatal_errorr
   rð  rÎ  r„   rî   r
  r|   r%   r¸   ræ   r  )rƒ   ró   rä  r%   rñ  Úfilteredr“  r6   r6   r7   rç  L	  s"    

zTarFile._get_extract_tarinfoc             C   sŒ   | j dƒ y&| j|tjj||jƒ||||d� W nV tk
r\ } z| j|ƒ W Y d d }~X n, tk
r† } z| j	|ƒ W Y d d }~X nX d S )Nry   )rã  râ  rä  Úextraction_root)
r«  Ú_extract_memberr|   r%   r¸   r„   rŸ   r÷  r
   rð  )rƒ   rØ   r%   rã  râ  rä  r“  r6   r6   r7   rè  j	  s    
zTarFile._extract_onec             C   s"   | j dkr‚ n| jdd| ƒ d S )Nr#   ztarfile: %s)r�  rÎ  )rƒ   r“  r6   r6   r7   rð  ~	  s    
zTarFile._handle_nonfatal_errorc             C   sn   | j dkr‚ n\t|tƒrP|jd kr6| jdd|j ƒ qj| jdd|j|jf ƒ n| jddt|ƒj|f ƒ d S )Nr   r#   ztarfile: %sztarfile: %s %rztarfile: %s %s)r�  r)  rŸ   ÚfilenamerÎ  Ústrerrorrü   rq   )rƒ   r“  r6   r6   r7   r÷  …	  s    


zTarFile._handle_fatal_errorc             C   s‚   | j dƒ t|tƒr | j|ƒ}n|}|jƒ s6|jtkrB| j| |ƒS |jƒ sR|j	ƒ rzt| j
tƒrhtdƒ‚q~| j| j|ƒƒS nd S d S )Nry   z'cannot extract (sym)link as file object)r«  r)  r+  rª  rí   rü   rY  Ú
fileobjectrî   rð   r“   r‡   r	   ÚextractfileÚ_find_link_target)rƒ   ró   rØ   r6   r6   r7   rþ  ‘	  s    


zTarFile.extractfile)rä  rù  c            C   s\  |j dƒ}|jdtjƒ}tjj|ƒ}|r@tjj|ƒ r@tj|ƒ |jƒ sP|j	ƒ rj| j
dd|j|jf ƒ n| j
d|jƒ |jƒ rŽ| j||ƒ n”|jƒ r¤| j||ƒ n~|jƒ rº| j||ƒ nh|jƒ sÊ|jƒ rØ| j||ƒ nJ|jƒ sè|j	ƒ rü| j||||d� n&|jtk�r| j||ƒ n| j||ƒ |�rX| j|||ƒ |j	ƒ �sX| j||ƒ | j||ƒ d S )Nrã   r#   z%s -> %s)rä  rù  )rJ  r¥   r|   ré   r%   rò   r‡  Úmakedirsrî   rð   rÎ  r„   ræ   rí   Úmakefilerï   Úmakedirr|  Úmakefifory  rz  ÚmakedevÚmakelink_with_filterrü   rY  Úmakeunknownrí  rï  rî  )rƒ   rØ   Ú
targetpathrã  râ  rä  rù  Z	upperdirsr6   r6   r7   rú  °	  s:    



zTarFile._extract_memberc             C   s@   y&|j d krtj|ƒ ntj|dƒ W n tk
r:   Y nX d S )NiÀ  )rh   r|   ÚmkdirÚFileExistsError)rƒ   rØ   r  r6   r6   r7   r  è	  s    
zTarFile.makedirc             C   s’   | j }|j|jƒ | j}t|dƒ�f}|jd k	rrx,|jD ]"\}}|j|ƒ t|||t|ƒ q6W |j|jƒ |j	ƒ  nt|||jt|ƒ W d Q R X d S )Nr„  )
r“   rµ   rÔ   rŽ  rˆ  rÕ   rX   r   r'   Útruncate)rƒ   rØ   r  Úsourcer_   ÚtargetrÁ   r'   r6   r6   r7   r  ö	  s    


zTarFile.makefilec             C   s"   | j ||ƒ | jdd|j ƒ d S )Nr#   z9tarfile: Unknown file type %r, extracted as regular file.)r  rÎ  rü   )rƒ   rØ   r  r6   r6   r7   r  
  s    zTarFile.makeunknownc             C   s"   t tdƒrtj|ƒ ntdƒ‚d S )NÚmkfifozfifo not supported by system)r�   r|   r  r
   )rƒ   rØ   r  r6   r6   r7   r  
  s    
zTarFile.makefifoc             C   sn   t tdƒ st tdƒ r tdƒ‚|j}|d kr2d}|jƒ rF|tjO }n
|tjO }tj||tj	|j
|jƒƒ d S )NÚmknodr  z'special devices not supported by systemi€  )r�   r|   r
   rh   rz  rf   ÚS_IFBLKÚS_IFCHRr  r  rý   rþ   )rƒ   rØ   r  rh   r6   r6   r7   r  
  s    
zTarFile.makedevc             C   s   | j ||d d ƒS )N)r  )rƒ   rØ   r  r6   r6   r7   Úmakelink(
  s    zTarFile.makelinkc       	   $   C   s<  d}yT|j ƒ r6tjj|ƒr$tj|ƒ tj|j|ƒ d S tjj|jƒrVtj	|j|ƒ d S W n t
k
rp   d}Y nX y| j|ƒ}W n$ tk
r¤   |ržtdƒ‚n‚ Y nX |d kr´|}nh|d krÄtdƒ‚y$||j|jdd�|ƒ |||ƒ}W n2 tk
�r } zt||jƒ|‚W Y d d }~X nX |d k	�r8| j||||d� d S )	NFTz%unable to resolve link inside archivez6makelink_with_filter: if filter_function is not None, z%extraction_root must also not be None)r„   rø   )rä  rù  z[makelink_with_filter: if filter_function is not None, extraction_root must also not be None)rð   r|   r%   ÚlexistsÚunlinkÚsymlinkræ   r‡  r  ÚlinkÚsymlink_exceptionrÿ  r©  r
   r¥   r„   rê  râ   rú  )	rƒ   rØ   r  rä  rù  Zkeyerror_to_extracterrorrñ  rø  Úcauser6   r6   r7   r  +
  sH    	

  
zTarFile.makelink_with_filterc             C   sü   t tdƒrøtjƒ dkrø|j}|j}|sŽytrB|jrBtj|jƒd }W n tk
rX   Y nX yt	rv|j
rvt	j|j
ƒd }W n tk
rŒ   Y nX |d kršd}|d kr¦d}y4|jƒ rÊt tdƒrÊtj|||ƒ ntj|||ƒ W n tk
rö   tdƒ‚Y nX d S )	NÚgeteuidr   r$   r#   Úlchownzcould not change ownerr9   r9   )r�   r|   r  r*   r)   rÇ  r,   Zgetgrnamr©  rÅ  r+   Úgetpwnamrð   r  rí  rŸ   r
   )rƒ   rØ   r  râ  ÚgÚur6   r6   r7   rí  `
  s0    

zTarFile.chownc             C   sL   |j d krd S ttdƒrHytj||j ƒ W n tk
rF   tdƒ‚Y nX d S )Nrï  zcould not change mode)rh   r�   r|   rï  rŸ   r
   )rƒ   rØ   r  r6   r6   r7   rï  �
  s    

zTarFile.chmodc             C   sV   |j }|d krd S ttdƒs d S ytj|||fƒ W n tk
rP   tdƒ‚Y nX d S )Nrî  z"could not change modification time)r(   r�   r|   rî  rŸ   r
   )rƒ   rØ   r  r(   r6   r6   r7   rî  Œ
  s    
zTarFile.utimec             C   sæ  | j dƒ | jd k	r$| j}d | _|S | j| jjƒ krZ| jj| jd ƒ | jjdƒsZtdƒ‚d }�xby| jj	| ƒ}W �nH t
k
rÂ } z2| jr²| jdd| j|f ƒ |  jt7  _wbW Y d d }~X nü tk
�r, } zN| j�r| jdd| j|f ƒ |  jt7  _wbn| jdk�rtt|ƒƒ‚W Y d d }~X n’ tk
�rT   | jdk�rPtdƒ‚Y nj tk
�rŽ } z| jdk�r~tt|ƒƒ‚W Y d d }~X n0 tk
�r¼ } ztt|ƒƒ‚W Y d d }~X nX P qbW |d k	�rÜ| jj|ƒ nd| _|S )	NZrar#   zunexpected end of datar$   z0x%X: %sr   z
empty fileT)r«  r’  rÁ   r“   r´   rµ   rZ   r   rØ   rS  rv   r‹  rÎ  r»   rH   r+  rt   ru   rw   r�  r·   r�  )rƒ   ÚmrØ   r“  r6   r6   r7   r\  š
  sL    


zTarFile.nextc       	      C   s¶   | j ƒ }d}|d k	rHy|j|ƒ}W n tk
r:   d}Y nX |d |… }|rXtjj|ƒ}xLt|ƒD ]@}|r||j|jkrbd}qb|r�tjj|jƒ}n|j}||krb|S qbW |r²t|ƒ‚d S )NFT)	r­  Úindexr.   r|   r%   rñ   ÚreversedrÁ   r„   )	rƒ   r„   rØ   Ú	normalizer�  Zskippingr  ró   Úmember_namer6   r6   r7   r¨  Ð
  s,    
zTarFile._getmemberc             C   s"   x| j ƒ }|d krP qW d| _d S )NT)r\  r�  )rƒ   rØ   r6   r6   r7   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   r6   r6   r7   r«    s    zTarFile._checkc             C   s`   |j ƒ r.djtd tj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)
rð   r¸   rÍ  r|   r%   rò   r„   ræ   r¨  r©  )rƒ   rØ   ræ   Úlimitró   r6   r6   r7   rÿ    s     zTarFile._find_link_targetc             c   sŽ   | j r| jE d H  d S d}| jd k	r:| jƒ }|d7 }|V  xN|t| jƒk rV| j| }n"| j st| jƒ }|sxd| _ d S nd S |d7 }|V  q<W d S )Nr   r#   T)r�  r�  r’  r\  r0   )rƒ   r  rØ   r6   r6   r7   Ú__iter__  s&    
zTarFile.__iter__c             C   s   || j krt|tjd� d S )N)rß  )rŒ  ro   rm   Ústderr)rƒ   ÚlevelÚmsgr6   r6   r7   rÎ  =  s    
zTarFile._dbgc             C   s   | j ƒ  | S )N)r«  )rƒ   r6   r6   r7   Ú	__enter__C  s    zTarFile.__enter__c             C   s,   |d kr| j ƒ  n| js"| jj ƒ  d| _d S )NT)r†   r�   r“   r•   )rƒ   rü   r  Ú	tracebackr6   r6   r7   Ú__exit__G  s
    

zTarFile.__exit__)Nry   NNNNNNr  NNNN)ry   N)ry   Nr£   )ry   Nr£   )ry   NN)NNN)T)NTN)N)rá  N)r‰   T)N)TF)NF)N)?rq   rr   rs   rŒ  rŠ  r‹  r�  r   rP   r   r4   r5   r   rØ   rÓ   rý  rÕ  r…   r�  r§  r   r•  r¢  r¤  r¦  r–  r†   rª  r­  r®  rË  rj  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#  rÎ  r'  r)  r6   r6   r6   r7   r   V  sŠ      
lZ!

d&=
5D
 65!6
(

	c             C   s.   yt | ƒ}|jƒ  dS  tk
r(   dS X d S )NTF)r   r†   r   )r„   r¹   r6   r6   r7   r   U  s    c              C   s  dd l } d}| j|d�}|jdddddd	� |jd
dtdd� |jƒ }|jddddd� |jdddd5dd� |jdddd6dd� |jdddd d� |jƒ }|jr´|j r´|jd!d"ƒ |j	�r*|j	}t
|ƒ�rt|d#ƒ� }|jƒ  t|jƒ tjd$� W d Q R X |j�r&td%j|ƒƒ n|jd!d&j|ƒƒ �nÚ|j�r€|j}t
|ƒ�rjtj|d'ƒ�}|j|jd(� W d Q R X n|jd!d&j|ƒƒ �n„|j�rPt|jƒd!k�rª|jd }tj}n,t|jƒd)k�rÆ|j\}}n|jd!|jƒ ƒ t
|ƒ�r<tj|d'ƒ�}|j||jd*� W d Q R X |j�rN|d+k�r&d,j|ƒ}	nd-j||ƒ}	t|	ƒ n|jd!d&j|ƒƒ n´|j�rô|jjdƒ}
tjj|
ƒ\}}d.d.d/d/d0d0d0d0d1œ}||k�r d2||  nd3}|j}tj|
|ƒ� }x|D ]}|j|ƒ �q¾W W d Q R X |j�rtd4j|
ƒƒ n|jd!|jƒ ƒ d S )7Nr   z3A simple command line interface for tarfile module.)Údescriptionz-vz	--verboseÚ
store_trueFzVerbose output)ÚactionÚdefaultÚhelpz--filterz<filtername>zFilter for extraction)ÚmetavarÚchoicesr.  z-lz--listú	<tarfile>zShow listing of a tarfile)r/  r.  z-ez	--extractú+ú<output_dir>zExtract tarfile into target dir)Únargsr/  r.  z-cz--createú<name>ú<file>zCreate tarfile from sourcesz-tz--testzTest if a tarfile is validr#   z&--filter is only valid for extraction
ry   )rß  z{!r} is a tar archive.z{!r} is not a tar archive.
zr:*)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.)r1  r3  )r5  r6  )ÚargparseÚArgumentParserÚadd_argumentrÚ  Zadd_mutually_exclusive_groupÚ
parse_argsrÍ  rö  ÚexitZtestr   r   r­  ro   rm   r$  rÌ  rP   rj  r   r0   r|   ÚcurdirZformat_helprô  ZcreateÚpopr%   ÚsplitextrÑ  )r7  r*  Úparserrb  Úargsr\   rŽ   Ztfr<  r&  Ztar_namerl  ZextZcompressionsZtar_modeZ	tar_filesÚ	file_namer6   r6   r7   Úmainc  s’    










rB  Ú__main__)r%   r&   r'   r(   r)   r*   r+   r,   )T)sÚversionÚ
__author__Z__date__Z	__cvsid__Ú__credits__Úbuiltinsr   rˆ  rm   r|   rÈ   rW   rf   r©   rS   r
  Úrerc   rÅ  r—   rÇ  r   ÚNotImplementedErrorr  rŸ   Ú	NameErrorÚ__all__rÛ  r×  r1   r»   r§  r  r  r  r  r3  r  rG  rx  rw  r5  r6  r  r{  ZCONTTYPEr!  r   rH  r-  r/  rV  r   r   r   r   rY  ru  rK  rr  re  r*  rF   rs  r„   r   Úgetfilesystemencodingr8   r=   rK   rQ   rU   rX   rg   rp   Ú	Exceptionr   r
   r   r   r	   r   rt   ru   rv   rH   rw   rx   r‡   Úobjectr�   rÀ   ÚBufferedReaderrÓ   rÛ   rÜ   rÝ   rß   rà   rá   râ   rê  rö   r÷   rù   rú   rÚ  r	  Úcompiler`  r   r   r   rB  rq   r6   r6   r6   r7   Ú<module>    s$  


  wh


D
     h          	b
