o
     JAfv                    @   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yB   dZY nw zddlZW n eyT   dZY nw eefZzeef7 ZW n	 eyi   Y nw g 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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Z6h dZ7e8e8e8e9e9e9d Z:ej;d!krd"Z<ne= Z<d#d$ Z>d%d& Z?d'd( Z@d)e2fd*d+ZAd,d- ZBdedfd.d/ZCd0d1 ZDG d2d3 d3eEZFG d4d5 d5eFZGG d6d7 d7eFZHG d8d9 d9eFZIG d:d; d;eFZJG d<d= d=eFZKG d>d? d?eKZLG d@dA dAeKZMG dBdC dCeKZNG dDdE dEeKZOG dFdG dGeKZPG dHdI dIZQG dJdK dKZRG dLdM dMeSZTG dNdO dOeSZUG dPdQ dQejVZWG dRdS dSeSZXG dTdU dUeSZYdVdW ZZeYjZdXdY Z[e\dZkre[  dS dS )[z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 00d         0   1   2   3   4   5   6   7   L   K   S   x   g   X      )pathlinkpathsizemtimeuidgidunamegname>   r+   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   /usr/lib/python3.10/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v r3d}t t| d D ]}|dK }|| |d  7 }q| d dkr1dt| d  |  }|S zt| dd} t|  p@d	d}W |S  tyP   td
w )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 r&n ntd|d | f dt }|S |tkrnd|d   |   kr=d|d  k rnn td	| dkrLtdg}ntdg}d| |  } t|d D ]}|d| d@  | dL } q]|S td	)
Nr   rB   r#   z%0*orD   rC   r@   rA   zoverflow in number field)rI   bytesr3   r   	bytearrayrH   insertrK   )rM   digitsformatZ
original_nr4   rN   r8   r8   r9   itn   s"   
 0

rU   c                 C   s2   	 dt td|  }dt td|  }||fS )NrC   Z
148B8x356BZ
148b8x356b)sumstructunpack_from)bufZunsigned_chksumZsigned_chksumr8   r8   r9   calc_chksums   s   rZ   c           	      C   s   	 |pd}|dkrd S |d u rt | || d S t||\}}t|D ]}| |}t||k r4|d|| q#|dkrR| |}t||k rM|d|| d S )Ni @  r   unexpected end of data)shutilcopyfileobjdivmodrH   readr2   write)	srcdstr5   	exceptionbufsizeblocks	remainderbrY   r8   r8   r9   r]      s&   


r]   c                 C   s8   t tjdd }|d ur| |d|} t| dd d S )Nr6   backslashreplace )end)getattrsysstdoutr1   r=   print)r4   r6   r8   r8   r9   _safe_print  s   ro   c                   @      e Zd Z	 dS )r   N__name__
__module____qualname__r8   r8   r8   r9   r         r   c                   @   rp   )r
   Nrq   r8   r8   r8   r9   r
     ru   r
   c                   @   rp   )r   Nrq   r8   r8   r8   r9   r     ru   r   c                   @   rp   )r   Nrq   r8   r8   r8   r9   r     ru   r   c                   @   rp   )r	   Nrq   r8   r8   r8   r9   r	     ru   r	   c                   @   rp   )r   Nrq   r8   r8   r8   r9   r     ru   r   c                   @   rp   )EmptyHeaderErrorNrq   r8   r8   r8   r9   rv     ru   rv   c                   @   rp   )TruncatedHeaderErrorNrq   r8   r8   r8   r9   rw      ru   rw   c                   @   rp   )EOFHeaderErrorNrq   r8   r8   r8   r9   rx   #  ru   rx   c                   @   rp   )rL   Nrq   r8   r8   r8   r9   rL   &  ru   rL   c                   @   rp   )SubsequentHeaderErrorNrq   r8   r8   r8   r9   ry   )  ru   ry   c                   @   .   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r|t jO }t ||d| _d S )NrwO_BINARYi  )	osO_RDONLYO_WRONLYO_CREATO_TRUNChasattrr   r   fd)selfnamemoder8   r8   r9   __init__6  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_   B     z_LowLevelFile.readc                 C   s   t | j| d S r0   )r   r`   r   r   r4   r8   r8   r9   r`   E  s   z_LowLevelFile.writeN)rr   rs   rt   r   r   r_   r`   r8   r8   r8   r9   r{   0  s    	r{   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 Zdd Zdd ZdS )_Streamc           	      C   s  	 d| _ |d u rt||}d| _ |dkrt|}| }|pd| _|| _|| _|| _|| _d| _	d| _
d| _z|dkrmzdd l}W n tyM   tdd w || _|d| _|d	krf|   |j| _W d S |   W d S |d
krzdd l}W n ty   tdd w |d	krd| _| | _t| _W d S | | _W d S |dkrzdd l}W n ty   tdd w |d	krd| _| | _|j| _W d S | | _W d S |dkrtd| W d S    | j s| j  d| _ )NTF*     r   gzzzlib module is not availabler}   bz2bz2 module is not availablexzlzma module is not availabletarunknown compression type %r) _extfileobjr{   _StreamProxygetcomptyper   r   comptypefileobjrd   rY   posclosedzlibImportErrorr   crc32crc_init_read_gzerrorrc   _init_write_gzr   dbufBZ2DecompressorcmpOSErrorBZ2CompressorlzmaLZMADecompressor	LZMAErrorLZMACompressorr   )	r   r   r   r   r   rd   r   r   r   r8   r8   r9   r   S  sv   







z_Stream.__init__c                 C   s$   t | dr| js|   d S d 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r4| jd d | _tj| j| _| 
| jdd	t  d S )
N	   r   <Ls   s   .gzz
iso-8859-1replace)r   compressobjDEFLATED	MAX_WBITS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   sT   	 | j dkr| j|| j| _|  jt|7  _| j dkr#| j|}| | d S )Nr   r   )	r   r   r   r   r   r2   r   compressr   r   r8   r8   r9   r`     s   

z_Stream.writec                 C   sb   	 |  j |7  _ t| j | jkr/| j| j d | j  | j | jd  | _ t| j | jksd S d S r0   )rY   r2   rd   r   r`   r   r8   r8   r9   Z__write  s   z_Stream.__writec                 C   s   	 | j rd S d| _ zP| jdkr| jdkr|  j| j 7  _| jdkrM| jrM| j| j d| _| jdkrM| jt	d| j
 | jt	d| jd@  W | jsX| j  d S d S | jsc| j  w w )NTr~   r   r   r   r   l    )r   r   r   rY   r   flushr   r`   rW   r   r   r   r   r   r   r8   r8   r9   r     s&   

z_Stream.closec                 C   s   	 | j | j j | _d| _| ddkrtd| ddkr$tdt| d}| d |d	@ rIt| dd
t| d  }| 	| |d@ r[	 | d}|rY|t
krZnqN|d@ rm	 | d}|rk|t
krlnq`|d@ rx| d d S d S )Nr   r$   s   not a gzip filer#      zunsupported compression method      rC   rB   T   )r   decompressobjr   r   r   _Stream__readr   r   ordr_   r3   )r   flagZxlenr4   r8   r8   r9   r     s6   
 


z_Stream._init_read_gzc                 C      	 | j S r0   )r   r   r8   r8   r9   tell     z_Stream.tellr   c                 C   sX   	 || j  dkr(t|| j  | j\}}t|D ]}| | j q| | | j S td)Nr   z seeking backwards is not allowed)r   r^   rd   rH   r_   r	   )r   r   re   rf   rN   r8   r8   r9   seek  s   
z_Stream.seekc                 C   s"   	 |  |}|  jt|7  _|S r0   )_readr   r2   )r   r'   rY   r8   r8   r9   r_     s   
z_Stream.readc              
   C   s   	 | j dkr| |S t| j}| jg}||k rV| jr"| j}d| _n
| j| j}|s,n*z| j	|}W n | j
yF } ztd|d }~ww || |t|7 }||k sd|}||d  | _|d | S )Nr   r   zinvalid compressed data)r   r   r2   r   rY   r   r_   rd   r   
decompressrc   r   appendjoin)r   r'   ctrY   er8   r8   r9   r     s0   





z_Stream._readc                 C   sr   	 t | j}| jg}||k r'| j| j}|sn|| |t |7 }||k sd|}||d  | _|d | S )Nr   )r2   rY   r   r_   rd   r   r   )r   r'   r   r   rY   r8   r8   r9   Z__read)  s   


z_Stream.__readN)r   )rr   rs   rt   r   r   r   r`   r   r   r   r   r   r_   r   r   r8   r8   r8   r9   r   H  s    
F
	
r   c                   @   rz   )
r   c                 C   s   || _ | j t| _d S r0   )r   r_   	BLOCKSIZErY   )r   r   r8   r8   r9   r   ?  s   z_StreamProxy.__init__c                 C   s   | j j| _| jS r0   )r   r_   rY   r   r8   r8   r9   r_   C  s   
z_StreamProxy.readc                 C   sL   | j drdS | j dd dkr| j dd dkrd	S | j d
r$dS dS )Ns   r   r      s   BZhr   
   s   1AY&SYr   )s   ]  s   7zXZr   r   )rY   
startswithr   r8   r8   r9   r   G  s   $z_StreamProxy.getcomptypec                 C   s   | j   d S r0   )r   r   r   r8   r8   r9   r   Q  r   z_StreamProxy.closeN)rr   rs   rt   r   r_   r   r   r8   r8   r8   r9   r   :  s    
r   c                   @   sh   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 u rd|fg}d| _g | _d}| j}|D ]&\}}||kr>| j	d||d f | j	d||| |f ||7 }|| }q,|| jk re| j	d|| jd f d S d S )Nr   r   FT)
r   offsetr'   positionrk   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   w     z_FileInFile.flushc                 C      dS NTr8   r   r8   r8   r9   readablez  r   z_FileInFile.readablec                 C   r   NFr8   r   r8   r8   r9   writable}  r   z_FileInFile.writablec                 C   s
   | j  S r0   )r   seekabler   r8   r8   r9   r        
z_FileInFile.seekablec                 C   r   r0   )r   r   r8   r8   r9   r     r   z_FileInFile.tellc                 C   s   	 |t jkrtt|d| j| _| jS |t jkr5|dk r(t| j| d| _| jS t| j| | j| _| jS |t jkrJtt| j| | jd| _| jS td)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 u r| j | j }n	t|| j | j }d}|dkr	 | j| j \}}}}|| j  kr1|k r4n nn|  jd7  _| jt| jkrFd| _qt||| j }|rq| j|| j|   | j|}t||krlt	d||7 }n|t
| 7 }||8 }|  j|7  _|dks|S )Nr   r   Tr#   r[   )r'   r   r   r   r   r2   r   r   r_   r   r3   )	r   r'   rY   datastartstopr   r5   rg   r8   r8   r9   r_     s4   
z_FileInFile.readc                 C   s&   |  t|}||d t|< t|S r0   )r_   r2   )r   rg   rY   r8   r8   r9   readinto  s   z_FileInFile.readintoc                 C   s
   d| _ d S r   )r   r   r8   r8   r9   r     r   z_FileInFile.closer0   )rr   rs   rt   r   r   r   r   r   r   r   r   r   r_   r   r   r8   r8   r8   r9   r   X  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__)rr   rs   rt   r   __classcell__r8   r8   r   r9   r     s    r   c                   @   s
  e Zd Z	 edwi ddddddddd	d
dddddddddddddddddddddd d!d"d#d$d%d$d&d$Zdxd(d)Zed*d+ Zejd,d+ Zed-d. Z	e	jd/d. Z	d0d1 Z
d2d3 Zeed4fd5d6Zd7d8 Zd9d: Zd;d< Zed=d> Zd?d@ ZedAdB ZedCdD ZedEdF ZedGdH ZedIdJ Ze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 Z&dcdd Z'dedf Z(dgdh Z)didj Z*dkdl Z+dmdn Z,dodp Z-dqdr Z.dsdt Z/dudv Z0d$S )yr   r   zName of the archive member.r   zPermission bits.r)   z6User ID of the user who originally stored this member.r*   z7Group ID of the user who originally stored this member.r'   zSize in bytes.r(   zTime of last modification.chksumzHeader checksum.typezFile type. type is usually one of these constants: REGTYPE, AREGTYPE, LNKTYPE, SYMTYPE, DIRTYPE, FIFOTYPE, CONTTYPE, CHRTYPE, BLKTYPE, GNUTYPE_SPARSE.linknamezcName of the target file name, which is only present in TarInfo objects of type LNKTYPE and SYMTYPE.r+   z
User name.r,   zGroup name.devmajorzDevice major number.devminorzDevice minor number.r   zThe tar header starts here.r   zThe file's data starts here.pax_headerszMA dictionary containing key-value pairs of an associated pax extended header.r   zSparse member information.r   N_sparse_structs_link_targetr   c                 C   sl   	 || _ 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   r   r0   r   r   r8   r8   r9   r%        zTarInfo.pathc                 C   
   || _ d S r0   r  r  r8   r8   r9   r%        
c                 C   r   r0   r   r   r8   r8   r9   r&     r  zTarInfo.linkpathc                 C   r  r0   r
  )r   r   r8   r8   r9   r&     r	  c                 C   s   d| j j| jt| f S )Nz<%s %r at %#x>)r   rr   r   idr   r8   r8   r9   __repr__  s   zTarInfo.__repr__c                 C   sn   	 | j | jd@ | j| j| j| j| j| j| j| j	| j
| j| jd}|d tkr5|d ds5|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   sR   	 |   }|tkr| |||S |tkr| |||S |tkr%| ||S td)Nzinvalid format)r  r   create_ustar_headerr   create_gnu_headerr   create_pax_headerrK   )r   rT   r6   r7   r  r8   r8   r9   tobuf3  s   zTarInfo.tobufc                 C   sp   	 t |d< t|d ||tkrtdt|d ||tkr0| |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  A  s   zTarInfo.create_ustar_headerc                 C   s   	 t |d< d}t|d ||tkr|| |d t||7 }t|d ||tkr7|| |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   rY   r8   r8   r9   r  N  s   zTarInfo.create_gnu_headerc              	   C   sF  	 t |d< | j }ddtfddtfddfD ]2\}}}||v r qz
|| dd	 W n ty9   || ||< Y qw t|| |krH|| ||< qd
D ]A\}}d}|| }	t|	t	}
|
r`t
|	n|	}d|  krpd|d  k sxn d||< d}n|
r|||< d}|r||vrt|	||< qK|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#  Fr   rB   r#   Tr   r   )r  r  copyr  r  r1   UnicodeEncodeErrorr2   
isinstancefloatroundstr_create_pax_generic_headerXHDTYPEr  r   )r   r  r6   r  r   Zhnamer5   rS   Z	needs_paxvalZval_is_floatZval_intrY   r8   r8   r9   r  \  sF   

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 ]-}d|d | }d||d  }t|||tkr:t|||tkr: ||fS qtd)Nr  r#   zname is too long)splitrH   r2   r   r1   LENGTH_PREFIXr  rK   )r   r   r6   r7   
componentsrN   r  r8   r8   r9   r    s   
zTarInfo._posix_split_namec           
      C   s  	 |  dttfv }|r!t|  ddd|}t|  ddd|}ntdd||}tdd||}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||g}tdt	 d
|}t|t	 d  d }	|d d td|	 d |dd   }|S )Nr   r   r   rB   r   r   r   r   r   r  r)   r*   r'   r#  r(   s           r   r  r+   r"  r,   r  r   z%dsr   iz%06o rD   i)getCHRTYPEBLKTYPErU   r:   r  r  rW   r   r   r   rZ   rP   )
r  rT   r6   r7   Zhas_device_fieldsr   r   partsrY   r   r8   r8   r9   r    s6   

&zTarInfo._create_headerc                 C   s0   	 t t| t\}}|dkr| t| t 7 } | S )Nr   )r^   r2   r   r3   )payloadre   rf   r8   r8   r9   _create_payload  s
   zTarInfo._create_payloadc                 C   sT   	 | ||t }i }d|d< ||d< t||d< t|d< | |t||| | S )Nz././@LongLinkr   r   r'   r  )r1   r3   r2   r  r  r   r8  )r.  r   r   r6   r7   r  r8   r8   r9   r    s   zTarInfo._create_gnu_long_headerc              	   C   s.  	 d}|  D ]\}}z|dd W q ty   d}Y  nw d}|r(|d7 }|  D ]I\}}|d}|r>||d}n|d}t|t| d }d	 }	}
	 |tt|
 }	|	|
kr_n|	}
qR|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   r8  )r.  r  r   r6   binarykeywordvaluerecordslrM   r>   r  r8   r8   r9   r*    sD   

(z"TarInfo._create_pax_generic_headerc              	   C   sh  	 t |dkrtdt |tkrtd|ttkr tdt|dd }|t|vr2t	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rt|_|jtkrd}g }tdD ]0}	zt|||d  }
t||d |d  }W n
 ty   Y  nw ||
|f |d7 }qt|d }t|dd }|||f|_ |! r!|j"d|_|r2|jt#vr2|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   rv   r   rw   countr3   rx   rO   rZ   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.  rY   r6   r7   r   objr  r   structsrN   r   numbytes
isextendedorigsizer8   r8   r9   frombuf  s^   

zTarInfo.frombufc                 C   s:   	 |j t}| ||j|j}|j  t |_||S r0   )	r   r_   r   rV  r6   r7   r   r   _proc_member)r.  r   rY   rQ  r8   r8   r9   fromtarfile]  s
   
zTarInfo.fromtarfilec                 C   sR   	 | j ttfv r| |S | j tkr| |S | j tttfv r$| 	|S | 
|S r0   )r   r!  r   _proc_gnulongrL  _proc_sparser+  r-  SOLARIS_XHDTYPE	_proc_pax_proc_builtin)r   r   r8   r8   r9   rW  r  s   




zTarInfo._proc_memberc                 C   sj   	 |j  | _| j}|  s| jtvr|| | j7 }||_| 	|j
|j|j |  r3| jd| _| S Nr  )r   r   r   isregr   SUPPORTED_TYPES_blockr'   r   _apply_pax_infor  r6   r7   rN  r   rO  )r   r   r   r8   r8   r9   r]    s   zTarInfo._proc_builtinc              
   C   s   	 |j | | j}z| |}W n ty% } ztt|d d }~ww | j|_| j	t
kr9t||j|j|_n| j	tkrGt||j|j|_| rR|jd|_|S r^  )r   r_   ra  r'   rX  r   ry   r)  r   r   r!  r?   r6   r7   r   r   r   rN  removesuffix)r   r   rY   nextr   r8   r8   r9   rY    s    

zTarInfo._proc_gnulongc           
   	   C   s   	 | j \}}}| ` |rT|jt}d}tdD ]4}zt|||d  }t||d |d  }	W n
 ty;   Y  nw |rG|	rG|||	f |d7 }qt|d }|s|| _	|j
 | _| j| | j |_|| _| S )Nr      r#  rI  i  )r  r   r_   r   rH   rO   rK   r   rM  r   r   r   ra  r'   r   )
r   r   rR  rT  rU  rY   r   rN   r   rS  r8   r8   r9   rZ    s.   
zTarInfo._proc_sparsec              
   C   s.  	 |j | | j}| jtkr|j}n|j }t	d|}|d ur-|
dd|d< |d}|dkr:|j}nd}td}d}	 |||}|sMnN| \}	}
t|	}	|	dkr_td	||d
d |d|	 d  }| |
dd|j}
|
tv r| |||j|j}n	| |dd|j}|||
< ||	7 }qDz| |}W n ty } ztt|d d }~ww d|v r| || n!d|v r| ||| n|ddkr|ddkr| ||| | jtt fv r|!||j|j | j"|_"d|v r|j#}|$ s
|jt%vr|||j7 }||_"|S )Ns   \d+ hdrcharset=([^\n]+)\nr#   r/   
hdrcharsetZBINARYs   (\d+) ([^=]+)=r   TrG   r$   GNU.sparse.mapGNU.sparse.sizezGNU.sparse.major1zGNU.sparse.minorrF   r'   )&r   r_   ra  r'   r   r-  r  r$  researchgroupr=   r3  r6   compilematchgroupsrI   rL   rj   r   _decode_pax_fieldr7   PAX_NAME_FIELDSrX  r   ry   r)  _proc_gnusparse_01_proc_gnusparse_00_proc_gnusparse_10r+  r[  rb  r   r   r_  r`  )r   r   rY   r  rn  rf  r6   Zregexr   r5   r>  r?  rd  r   r   r8   r8   r9   r\    sr   



$
	

zTarInfo._proc_paxc                 C   sj   	 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)rj  finditerr   rI   rl  listzipr   )r   rd  r  rY   Zoffsetsrn  rS  r8   r8   r9   rs  4  s   zTarInfo._proc_gnusparse_00c                 C   sB   	 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>B  s    z.TarInfo._proc_gnusparse_01.<locals>.<listcomp>rg  ,r$   r#   )r0  rv  rw  r   )r   rd  r  r   r8   r8   r9   rr  ?  s   (zTarInfo._proc_gnusparse_01c                 C   s   	 d }g }|j t}|dd\}}t|}t||d k rBd|vr+||j t7 }|dd\}}|t| t||d k s|j  |_t	t
|d d d |dd d |_d S )Nr;  r#   r$   )r   r_   r   r0  rI   r2   r   r   r   rv  rw  r   )r   rd  r  r   fieldsr   rY   Znumberr8   r8   r9   rt  E  s   (zTarInfo._proc_gnusparse_10c              	   C   s   	 |  D ]T\}}|dkrt| d| q|dkr!t| dt| q|dkr.t| dt| q|tv rY|tv rJzt| |}W n tyI   d}Y nw |dkrS|d}t| || q| | _d S )NzGNU.sparse.namer%   rh  r'   zGNU.sparse.realsizer   r  )	r<  setattrrI   
PAX_FIELDSPAX_NUMBER_FIELDSrK   rO  r$  r  )r   r  r6   r7   r>  r?  r8   r8   r9   rb  U  s(   
zTarInfo._apply_pax_infoc                 C   s0   	 z| |dW S  ty   | || Y S w )NrE   )r=   UnicodeDecodeError)r   r?  r6   Zfallback_encodingZfallback_errorsr8   r8   r9   rp  l  s   zTarInfo._decode_pax_fieldc                 C   s$   	 t |t\}}|r|d7 }|t S )Nr#   )r^   r   )r   rJ  re   rf   r8   r8   r9   ra  t  s
   zTarInfo._blockc                 C   s   	 | j tv S r0   )r   REGULAR_TYPESr   r8   r8   r9   r_  }     
zTarInfo.isregc                 C   s
   	 |   S r0   )r_  r   r8   r8   r9   isfile  s   zTarInfo.isfilec                 C      	 | j tkS r0   )r   r  r   r8   r8   r9   rN    r  zTarInfo.isdirc                 C   r  r0   )r   SYMTYPEr   r8   r8   r9   issym  r  zTarInfo.issymc                 C   r  r0   )r   LNKTYPEr   r8   r8   r9   islnk  r  zTarInfo.islnkc                 C   r  r0   )r   r4  r   r8   r8   r9   ischr  r  zTarInfo.ischrc                 C   r  r0   )r   r5  r   r8   r8   r9   isblk  r  zTarInfo.isblkc                 C   r  r0   )r   FIFOTYPEr   r8   r8   r9   isfifo  r  zTarInfo.isfifoc                 C   s
   | j d uS r0   )r   r   r8   r8   r9   issparse  r   zTarInfo.issparsec                 C   s   	 | j tttfv S r0   )r   r4  r5  r  r   r8   r8   r9   isdev  s   zTarInfo.isdevr8   )r   )1rr   rs   rt   dict	__slots__r   propertyr%   setterr&   r  r  r   r   r  r  r  r  classmethodr/  r  staticmethodr  r8  r  r*  rV  rX  rW  r]  rY  rZ  r\  rs  rr  rt  rb  rp  ra  r_  r  rN  r  r  r  r  r  r  r  r8   r8   r8   r9   r     s    




:

#
	

2
>
h	r   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d`dd$d%d&Zdadd'd(d)Zdbd*d+Z dcdd-d.d/Z!dddd-d1d2Z"d3d4 Z#	#	ded5d6Z$d7d8 Z%d9d: Z&d;d< Z'd=d> Z(d?d@ Z)dAdB Z*dCdD Z+dEdF Z,dGdH Z-dIdJ Z.dfdKdLZ/dMdN Z0dbdOdPZ1dQdR Z2dSdT Z3dUdV Z4dWdX Z5dYdZ Z6dS )gr   r   Fr#   Nr}   r  c              
   C   s  	 ddddd}||vrt d|| _|| | _|s5| jdkr+tj|s+d| _d| _t|| j}d	| _n |d u rIt|d
rIt	|j
ttfrI|j
}t|drR|j| _d| _|r]tj|nd | _
|| _|d urj|| _|d urq|| _|d urx|| _|d ur|| _|d ur|| _|	| _|
d ur| jtkr|
| _ni | _|d ur|| _|d ur|| _|| _d	| _g | _d	| _| j | _i | _z|| jdkrd | _ | ! | _ | jdkr	 | j"| j z| j#| }| j$| W n# t%y   | j"| j Y n t&y	 } zt't|d d }~ww q| jdv r3d| _| jr6| j(| j) }| j*| |  jt+|7  _W d S W d S W d S    | jsE| j,  d| _ )Nrbzr+bwbxbr}   ar~   ry  !mode must be 'r', 'a', 'w' or 'x'r  r~   Fr   r   Tr}   r  r~   ry  )-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firstmemberrd  r   rX  r   rx   r   r   r/  r$  r`   r2   r   )r   r   r   r   rT   r   r  r  r6   r7   r  r  r  r  Zmodesr   rY   r8   r8   r9   r     s   




zTarFile.__init__c                    s  	 |s	|s	t d|dv rp fdd}g }t j|dD ]G}t  j| }	|d ur.| }
z|	|d|fi |W   S  ttfyc } z|d| d| |d urY||
 W Y d }~qd }~ww d		|}td
| d|v r|
dd\}}|pd}|pd}| jv rt  j| }	ntd| |	|||fi |S d|v r|
dd\}}|pd}|pd}|dvrt dt|||||}z |||fi |}W n   |   d|_|S |dv r j|||fi |S t d)Nznothing to open)r}   r:*c                    s    j |  dkS )Ntaropen)	OPEN_METH)r   r.  r8   r9   not_compressedX  r   z$TarFile.open.<locals>.not_compressedkeyr}   z	- method z: 
z'file could not be opened successfully:
:r#   r   r   |r|   zmode must be 'r' or 'w'Fr  zundiscernible mode)rK   sortedr  rk   r   r   r   r   r   r   r0  r   r   r   r  )r.  r   r   r   rd   kwargsr  Z
error_msgsr   funcZ	saved_posr   Zerror_msgs_summaryfilemodestreamr   r8   r  r9   r   .  s\   #


zTarFile.openc                 K   s&   	 |dvr	t d| |||fi |S )Nr  r  )rK   )r.  r   r   r   r  r8   r8   r9   r    s   zTarFile.taropenr   c           	   
   K   s   	 |dvr	t dzddlm} W n ty   tdd w z|||d ||}W n tyC } z|d ur>|dkr>td| d }~ww z| j|||fi |}W n! tyk } z|  |dkrftd| d }~w   |   d	|_	|S )
Nr}   r~   ry  mode must be 'r', 'w' or 'x'r   )GzipFilezgzip module is not availablerg   r}   r   F)
rK   gzipr  r   r   r   r   r  r   r   )	r.  r   r   r   compresslevelr  r  r   r   r8   r8   r9   gzopen  s:   


zTarFile.gzopenc           	   
   K   s   	 |dvr	t dzddlm} W n ty   tdd w ||p"|||d}z| j|||fi |}W n# ttfyP } z|  |dkrKt	d| d }~w   |   d	|_
|S )
Nr  r  r   )BZ2Filer   )r  r}   znot a bzip2 fileF)rK   r   r  r   r   r  r   EOFErrorr   r   r   )	r.  r   r   r   r  r  r  r   r   r8   r8   r9   bz2open  s,   

zTarFile.bz2openc           
   
   K   s   	 |dvr	t dz
ddlm}m} W n ty   tdd w ||p$|||d}z| j|||fi |}W n# |tfyR }	 z|  |dkrMt	d|	 d }	~	w   |   d	|_
|S )
Nr  r  r   )LZMAFiler   r   )presetr}   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   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v r8| jttd   |  jtd 7  _t| jt\}}|dkr8| jtt|   W | j	sC| j
  d S d S | j	sN| j
  w w )NTr  r$   r   )r   r   r   r`   r3   r   r   r^   
RECORDSIZEr   r   )r   re   rf   r8   r8   r9   r     s"   

zTarFile.closec                 C   s*   	 |  |d}|d u rtd| |S )Nr  zfilename %r not found)
_getmemberrO  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  )rx  r   r8   r8   r9   rz  &  s    z$TarFile.getnames.<locals>.<listcomp>)r  r   r8   r8   r9   getnames"  s   zTarFile.getnamesc                 C   sL  	 |  d |d ur|j}|d u r|}tj|\}}|tjd}|d}|  }| |_	|d u rA| j
s;t|}nt|}nt| }d}|j}t|r|j|jf}	| j
st|jdkrt|	| jv rt|| j|	 krtt}
| j|	 }n;t}
|	d r|| j|	< n/t|rt}
n't|rt}
nt|rt}
t|}nt|rt}
n
t |rt!}
nd S ||_||_"|j#|_$|j%|_&|
tkr|j'|_(nd|_(|j)|_*|
|_+||_,t-rzt-.|j$d |_/W n	 t0y   Y nw t1rzt12|j&d |_3W n
 t0y   Y nw |
tt!fv r$t4tdr$t4tdr$t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  r  r  S_ISDIRr  S_ISFIFOr  S_ISLNKr  readlinkS_ISCHRr4  S_ISBLKr5  r   st_uidr)   st_gidr*   st_sizer'   st_mtimer(   r   r   pwdgetpwuidr+   r  grpgetgrgidr,   r   r  st_rdevr   r  r   )r   r   arcnamer   drvr   Zstatresr   Zstmdinoder   r8   r8   r9   
gettarinfo(  s   









zTarFile.gettarinfoT)r  c                C   s   	 |    |d u r| }|D ]n}|rStt|j td|jp |j|jp%|jf  |	 s1|
 r>tdd|j|jf   ntd|j  tdt|jd d   t|j| r\dnd  |rx| rmtd	|j  | rxt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  ro   r  r  r   r+   r)   r,   r*   r  r  r   r   r'   r   	localtimer(   r   rN  r  r   r  rn   )r   verboser  r   r8   r8   r9   rv    s4   
zTarFile.listfilterc                C   sR  	 |  d |d u r|}| jd ur$tj|| jkr$| dd|  d S | d| | ||}|d u r>| dd|  d S |d urT||}|d u rT| dd|  d S | rvt|d}| 	|| W d    d S 1 sow   Y  d S |
 r| 	| |rtt|D ]}| jtj||tj||||d qd S d S | 	| d S )	Nr  r$   ztarfile: Skipped %rr#   ztarfile: Unsupported type %rztarfile: Excluded %rr  r  )r  r   r   r%   r  _dbgr  r_  r  addfilerN  r  listdiraddr   )r   r   r  	recursiver  r   fr8   r8   r9   r    s>   
	"
zTarFile.addc                 C   s   	 |  d t|}|| j| j| j}| j| |  jt	|7  _| j
}|d urXt|| j|j|d t|jt\}}|dkrO| jtt|   |d7 }|  j|t 7  _| j| d S )Nr  )rd   r   r#   )r  r$  r  rT   r6   r7   r   r`   r   r2   r  r]   r'   r^   r   r3   r  r   )r   r   r   rY   rd   re   rf   r8   r8   r9   r    s   

zTarFile.addfile.numeric_ownerc                C   s   	 g }|d u r	| }|D ]}|  r|| t|}d|_| j|||   |d q|jdd d |  |D ]@}tj	||j
}z| j|||d | || | || W q9 tyy } z| jdkrg | dd|  W Y d }~q9d }~ww d S )	N  	set_attrsr  c                 S   s   | j S r0   r  )r  r8   r8   r9   <lambda>  s    z$TarFile.extractall.<locals>.<lambda>r  r  r#   tarfile: %s)rN  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  s6   


zTarFile.extractallr   c             
   C   s  	 |  d t|tr| |}n|}| r tj||j|_	z| j
|tj||j||d W d S  tym } z/| jdkr@ |jd u rO| dd|j  n| dd|j|jf  W Y d }~d S W Y d }~d S d }~w ty } z| jdkrz | dd|  W Y d }~d S d }~ww )Nr}   r  r   r#   r  ztarfile: %s %r)r  r&  r)  r  r  r   r%   r   r   r  _extract_memberr   r   r  filenamer  strerrorr
   )r   memberr%   r  r  r   r   r8   r8   r9   r     s4   



&
zTarFile.extractc                 C   s|   	 |  d t|tr| |}n|}| s|jtvr"| | |S | s*|	 r<t| j
tr4td| | |S d S )Nr}   z'cannot extract (sym)link as file object)r  r&  r)  r  r_  r   r`  
fileobjectr  r  r   r   r	   extractfile_find_link_target)r   r  r   r8   r8   r9   r  E  s   

zTarFile.extractfilec                 C   sX  	 | d}|dtj}tj|}|r tj|s t| | s(|	 r5| 
dd|j|jf  n| 
d|j | rG| || nF| rR| || n;| r]| || n0| se| rl| || n!| st|	 r{| || n|jtvr| || n| || |r| ||| |	 s| || | || d S d S d S )Nr  r#   z%s -> %s)rO  r   r   r  r%   dirnamer  makedirsr  r  r  r   r   r_  makefilerN  makedirr  makefifor  r  makedevmakelinkr   r`  makeunknownr  r  r  )r   r   
targetpathr  r  Z	upperdirsr8   r8   r9   r  e  s:   


zTarFile._extract_memberc                 C   s*   	 z	t |d W d S  ty   Y d S w )Nr  )r   mkdirFileExistsErrorr   r   r  r8   r8   r9   r    s   zTarFile.makedirc                 C   s   	 | j }||j | j}t|d?}|jd ur8|jD ]\}}|| t|||t| q||j |	  nt|||jt| W d    d S W d    d S 1 sTw   Y  d S )Nr  )
r   r   r   r  r  r   r]   r   r'   truncate)r   r   r  sourcerd   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| d S td)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}| r|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   r  r  S_IFBLKS_IFCHRr  r  r   r   )r   r   r  r   r8   r8   r9   r    s   
zTarFile.makedevc                 C   s   	 z6|  rtj|rt| t|j| W d S tj|jr,t	|j| W d S | 
| || W d S  tyX   z| 
| || W Y d S  tyW   tdd w w )Nz%unable to resolve link inside archive)r  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rot dkrq|j}|j}|s@ztrt|jd }W n	 ty)   Y nw zt	r5t	
|jd }W n	 ty?   Y nw z| rTt tdrTt||| W d S t||| W d S  tyn } ztd|d }~ww d S d S )Ngeteuidr   r$   lchownzcould not change owner)r   r   r'  r*   r)   r  getgrnamr,   r  r  getpwnamr+   r  r(  r  r   r
   )r   r   r  r  gur   r8   r8   r9   r    s8   
zTarFile.chownc              
   C   s:   	 z
t ||j W d S  ty } ztd|d }~ww )Nzcould not change mode)r   r  r   r   r
   r   r   r  r   r8   r8   r9   r  	  s   
zTarFile.chmodc              
   C   sN   	 t tdsd S zt||j|jf W d S  ty& } ztd|d }~ww )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 ur| j}d | _|S | j| j kr.| j| jd  | jds.tdd }	 z| j	| }W n t
yf } z!| jr\| dd| j|f  |  jt7  _W Y d }~q0W Y d }~nd }~w ty } z-| jr| dd| j|f  |  jt7  _W Y d }~q0| jdkrtt|d W Y d }~nqd }~w ty   | jdkrtdd Y n[ ty } z| jdkrtt|d W Y d }~nBd }~w ty } ztt|d d }~w ty
 } zzdd l}t||jrtd	| d | ty   |w d }~ww 	 |d ur| j| |S d| _|S )
NZrar#   r[   Tr$   z0x%X: %sr   z
empty filezzlib error: )r  r  r   r   r   r   r_   r   r   rX  rx   r  r  r   rL   r)  rv   rw   ry   	Exceptionr   r&  r   r   r  r   r  )r   mr   r   r   r8   r8   r9   rd  	  sv   





	
zTarFile.nextc                 C   sp   	 |   }|d ur|d || }|rtj|}t|D ]}|r*tj|j}n|j}||kr5|  S qd S r0   )r  indexr   r%   normpathreversedr   )r   r   r   	normalizer  r  member_namer8   r8   r9   r  X	  s   zTarFile._getmemberc                 C   s"   	 	 |   }|d u rnqd| _d S r   )rd  r  )r   r   r8   r8   r9   r  o	  s   
zTarFile._loadc                 C   s@   	 | j rtd| jj |d ur| j|vrtd| j d S d S )Nz%s is closedzbad operation for mode %r)r   r   r   rr   r   )r   r   r8   r8   r9   r  y	  s   zTarFile._checkc                 C   sb   	 |  rdtd tj|j|jf}d }n|j}|}| j||dd}|d u r/t	d| |S )Nr  T)r   r3  zlinkname %r not found)
r  r   r  r   r%   r  r   r   r  r  )r   r   r   limitr  r8   r8   r9   r  	  s    zTarFile._find_link_targetc                 c   s    	 | j r| jE d H  d S d}| jd ur|  }|d7 }|V  	 |t| jk r-| j| }n| j s<|  }|s;d| _ d S nd S |d7 }|V  q )Nr   r#   T)r  r  r  rd  r2   )r   r0  r   r8   r8   r9   __iter__	  s.   
zTarFile.__iter__c                 C   s"   	 || j krt|tjd d S d S )Nfile)r  rn   rl   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 u r
|    d S | js| j   d| _d S r   )r   r   r   r   )r   r   r?  	tracebackr8   r8   r9   __exit__	  s
   

zTarFile.__exit__)Nr}   NNNNNNr  NNNN)r}   N)r}   Nr   )r}   NN)NNN)Tr   r0   )r  N)r   T)TFr   )7rr   rs   rt   r  r  r  r  r   rT   r   r6   r7   r   r   r   r  r   r  r  r   r  r  r  r  r  r   r  r  r  r  rv  r  r  r  r   r  r  r  r  r  r  r  r  r  r  r  rd  r  r  r  r  r6  r  r<  r>  r8   r8   r8   r9   r     s~    
o] 


c 
3(& 
1

?

	r   c                 C   sD   	 zt | drt| d}nt| }|  W dS  ty!   Y dS w )Nr_   )r   TF)r   r   r   r   )r   r   r8   r8   r9   r   	  s   
r   c               	   C   s6  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 ur|j}t|rt|d}|  t	| t
jd W d    n1 sow   Y  |jrt	d | d S d S |d!d"| d S |jd ur|j}t|rt|d#}|j|jd$ W d    d S 1 sw   Y  d S |d!d"| d S |jd ur9t|jd!kr|jd }tj}nt|jd%kr|j\}}n|d!|  t|r.t|d#}|j|d& W d    n	1 sw   Y  |jr,|d'kr d(|}	nd)||}	t	|	 d S d S |d!d"| d S |jd ur|jd}
tj|
\}}d*d*d+d+d,d,d,d,d-}||v rcd.||  nd/}|j}t|
|}|D ]}|| qqW d    n	1 sw   Y  |jrt	d0|
 d S d S d S )1Nr   z3A simple command-line interface for tarfile module.)descriptionz-vz	--verbose
store_trueFzVerbose output)actiondefaulthelpT)requiredz-lz--list	<tarfile>zShow listing of a tarfile)metavarrC  z-ez	--extract+)rE  z<output_dir>zExtract tarfile into target dir)nargsrF  rC  z-cz--create)z<name>z<file>zCreate tarfile from sourcesz-tz--testzTest if a tarfile is validr}   r7  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:r~   z{!r} file created.)argparseArgumentParseradd_argumentadd_mutually_exclusive_group
parse_argstestr   r   r  rn   rl   r9  r  rT   exitrv  r   r   r2   r   curdirformat_helpr  Zcreatepopr%   splitextr  )rI  r?  parserrl  argsra   r   ZtfrP  r;  Ztar_name_extZcompressionsZtar_modeZ	tar_files	file_namer8   r8   r9   main	  s   





"


rY  __main__)]version
__author____credits__builtinsr   r  rl   r   r   r\   r  r   rW   r$  rj  r  r   r  AttributeErrorNotImplementedErrorr&  r   	NameError__all__r3   r   r  r  r  r  r  r1  r  rK  r  r  r4  r5  r  r  ZCONTTYPEr!  r   rL  r+  r-  r[  r   r   r   r   r`  r  rP  r~  rq  r'  rI   r  r   r   getfilesystemencodingr:   r?   rO   rU   rZ   r]   ro   r.  r   r
   r   r   r	   r   rv   rw   rx   rL   ry   r{   r   objectr   r   BufferedReaderr   r   r   r   rY  rr   r8   r8   r8   r9   <module>   s   
 sh     _        .
W
