add-determinism 0.7.3

RPM buildroot helper to strip nondeterministic bits in files
Documentation
a

Z��^3oc@sBdZdZdZddlmZddlZddlZddlZddl	Z	ddl
Z
ddlZddlZddl
Z
ddlZzddlZWney�dZYn0zddlZWney�dZYn0eefZzeef7ZWney�Yn0gd�ZdZdZed	Zd
ZdZdZdZd
ZdZ dZ!dZ"dZ#dZ$dZ%dZ&dZ'dZ(dZ)dZ*dZ+dZ,dZ-dZ.dZ/dZ0dZ1e1Z2e e!e"e#e&e'e(e$e%e)e*e+fZ3e e!e(e+fZ4e)e*e+fZ5dZ6hd�Z7e8e8e8e9e9e9d �Z:ej;d!k�r�d"Z<ne�=�Z<d#d$�Z>d%d&�Z?d'd(�Z@d)e2fd*d+�ZAd,d-�ZBdedfd.d/�ZCd0d1�ZDGd2d3�d3eE�ZFGd4d5�d5eF�ZGGd6d7�d7eF�ZHGd8d9�d9eF�ZIGd:d;�d;eF�ZJGd<d=�d=eF�ZKGd>d?�d?eK�ZLGd@dA�dAeK�ZMGdBdC�dCeK�ZNGdDdE�dEeK�ZOGdFdG�dGeK�ZPGdHdI�dI�ZQGdJdK�dK�ZRGdLdM�dMeS�ZTGdNdO�dOeS�ZUGdPdQ�dQejV�ZWGdRdS�dSeS�ZXGdTdU�dUeS�ZYdVdW�ZZeYjZdXdY�Z[e\dZk�r>e[�dS)[z0.9.0u"Lars Gustäbel (lars@gustaebel.de)u4Gustavo 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�iisustar  sustar00�d�s0s1s2s3s4s5s6s7sLsKsSsxsgsX��)�path�linkpath�size�mtime�uid�gid�uname�gname>rrrr)ZatimeZctimerrrrZnt�utf-8cCs(|�||�}|d|�|t|�tS�N)�encode�len�NUL)�s�length�encoding�errors�r&�/usr/lib64/python3.9/tarfile.py�stn�sr(cCs*|�d�}|dkr|d|�}|�||�S)Nri����)Zfind�decode)r"r$r%�pr&r&r'�nts�s
r+cCs�|ddvrbd}tt|�d�D]}|dK}|||d7}q |ddkr�dt|�d|}n>z"t|dd�}t|��p|d	d�}Wnty�td
��Yn0|S)Nr)���r�r-��ascii�strict�0zinvalid header)�ranger r+�intZstrip�
ValueError�InvalidHeaderError)r"�n�ir&r&r'�nti�sr9r.cCs�t|�}d|kr$d|dkrDnntd|d|fd�t}n�|tkr�d|d|krrd|dkr�nnV|dkr�tdg�}ntdg�}d||}t|d�D]}|�d|d@�|dL}q�ntd	��|S)
Nrr.rz%0*or0r/r,r-zoverflow in number field)r4�bytesr!r
Z	bytearrayr3Zinsertr5)r7�digits�formatr"r8r&r&r'�itn�s 2
r=cCs0dtt�d|��}dtt�d|��}||fS)Nr/Z
148B8x356BZ
148b8x356b)Zsum�structZunpack_from)�bufZunsigned_chksumZ
signed_chksumr&r&r'�calc_chksums�s	r@c	Cs�|pd}|dkrdS|dur.t�|||�dSt||�\}}t|�D],}|�|�}t|�|krf|d��|�|�qD|dkr�|�|�}t|�|kr�|d��|�|�dS)Ni@r�unexpected end of data)�shutil�copyfileobj�divmodr3�readr �write)	�srcZdstr#�	exception�bufsize�blocks�	remainder�br?r&r&r'rC�s$


rCcCs8ttjdd�}|dur(|�|d��|�}t|dd�dS)Nr$Zbackslashreplacez )�end)�getattr�sysZstdoutrr)�print)r"r$r&r&r'�_safe_printsrQc@�eZdZdS)rN��__name__�
__module__�__qualname__r&r&r&r'r
�rc@rR)r	NrSr&r&r&r'r	
rWr	c@rR)rNrSr&r&r&r'rrWrc@rR)rNrSr&r&r&r'rrWrc@rR)rNrSr&r&r&r'rrWrc@rR)r
NrSr&r&r&r'r
rWr
c@rR)�EmptyHeaderErrorNrSr&r&r&r'rXrWrXc@rR)�TruncatedHeaderErrorNrSr&r&r&r'rYrWrYc@rR)�EOFHeaderErrorNrSr&r&r&r'rZ"rWrZc@rR)r6NrSr&r&r&r'r6%rWr6c@rR)�SubsequentHeaderErrorNrSr&r&r&r'r[(rWr[c@�,eZdZdd�Zdd�Zdd�Zdd�Zd	S)
�
_LowLevelFilecCsFtjtjtjBtjBd�|}ttd�r2|tjO}t�||d�|_dS)N��r�w�O_BINARYi�)	�osZO_RDONLYZO_WRONLYZO_CREATZO_TRUNC�hasattrrar�fd)�self�name�moder&r&r'�__init__5s��

z_LowLevelFile.__init__cCst�|j�dSr)rb�closerd�rer&r&r'ri>�z_LowLevelFile.closecCst�|j|�Sr)rbrErd�rerr&r&r'rEArkz_LowLevelFile.readcCst�|j|�dSr)rbrFrd�rer"r&r&r'rFDrkz_LowLevelFile.writeN)rTrUrVrhrirErFr&r&r&r'r]/s	r]c@sneZdZdd�Zdd�Zdd�Zdd�Zd	d
�Zdd�Zd
d�Z	dd�Z
ddd�Zdd�Zdd�Z
dd�ZdS)�_Streamc	Cs�d|_|durt||�}d|_|dkr6t|�}|��}|p<d|_||_||_||_||_d|_	d|_
d|_�zF|dkr�zddl}Wnt
y�td��Yn0||_|�d�|_|d	kr�|��|j|_n|��n�|d
k�r6zddl}Wnt
�ytd��Yn0|d	k�r*d|_|��|_t|_n
|��|_nz|dk�r�zddl}Wnt
�yhtd
��Yn0|d	k�r�d|_|��|_|j|_n
|��|_n|dk�r�td|��Wn&|j�s�|j��d|_�Yn0dS)NTFZ*��r�gzzzlib module is not availabler_�bz2�bz2 module is not available�xz�lzma module is not available�tar�unknown compression type %r) �_extfileobjr]�_StreamProxy�getcomptyperfrg�comptype�fileobjrIr?�pos�closed�zlib�ImportErrorr�crc32�crc�
_init_read_gzZerrorrH�_init_write_gzrr�dbufZBZ2Decompressor�cmp�OSErrorZ
BZ2Compressor�lzmaZLZMADecompressor�	LZMAErrorZLZMACompressorri)	rerfrgr{r|rIrrrr�r&r&r'rhRsl












z_Stream.__init__cCst|d�r|js|��dS)Nr~)rcr~rirjr&r&r'�__del__�sz_Stream.__del__cCs�|j�d|jj|jj|jjd�|_t�dtt	�	���}|�
d|d�|j�d�rf|jdd�|_|�
|j�
dd	�t�dS)
N�	r�<Ls�s��.gzi����z
iso-8859-1�replace)rZcompressobjZDEFLATED�	MAX_WBITSZ
DEF_MEM_LEVELr�r>�packr4�time�_Stream__writerf�endswithrr!)reZ	timestampr&r&r'r��s�z_Stream._init_write_gzcCsR|jdkr|j�||j�|_|jt|�7_|jdkrD|j�|�}|�|�dS)Nrqrv)	r{rr�r�r}r r�Zcompressr�rmr&r&r'rF�s

z
_Stream.writecCsN|j|7_t|j�|jkrJ|j�|jd|j��|j|jd�|_qdSr)r?r rIr|rFrmr&r&r'Z__write�sz_Stream.__writecCs�|jr
dSd|_z�|jdkr:|jdkr:|j|j��7_|jdkr�|jr�|j�|j�d|_|jdkr�|j�t�	d|j
��|j�t�	d|jd@��W|js�|j�
�n|js�|j�
�0dS)NTr`rvrprqr�l��)r~rgr{r?r��flushr|rFr>r�r�r}rxrirjr&r&r'ri�s 
�z
_Stream.closecCs�|j�|jj�|_d|_|�d�dkr0td��|�d�dkrFtd��t|�d��}|�d�|d	@r�t|�d��d
t|�d��}|�	|�|d@r�|�d�}|r�|t
kr�q�q�|d@r�|�d�}|r�|t
kr�q�q�|d@r�|�d�dS)
Nrprs��not a gzip filerszunsupported compression method��r/r.i)rZ
decompressobjr�r�r��
_Stream__readrrZordrEr!)reZflagZxlenr"r&r&r'r��s*
 


z_Stream._init_read_gzcC�|jSr)r}rjr&r&r'�tell��z_Stream.tellrcCsX||jdkrJt||j|j�\}}t|�D]}|�|j�q,|�|�ntd��|jS)Nrz seeking backwards is not allowed)r}rDrIr3rEr)rer}rJrKr8r&r&r'�seek�sz_Stream.seekcCs |�|�}|jt|�7_|Sr)�_readr}r )rerr?r&r&r'rEs
z_Stream.readcCs�|jdkr|�|�St|j�}|jg}||kr�|jrB|j}d|_n|j�|j�}|sVq�z|j�	|�}Wn|j
y�td��Yn0|�|�|t|�7}q&d�
|�}||d�|_|d|�S)Nrvrpzinvalid compressed data)r{r�r r�r?r|rErIr�Z
decompressrHr�append�join�rerZc�tr?r&r&r'r�s(




z
_Stream._readcCsjt|j�}|jg}||krF|j�|j�}|s.qF|�|�|t|�7}qd�|�}||d�|_|d|�S)Nrp)r r?r|rErIr�r�r�r&r&r'Z__read&s


z_Stream.__readN)r)rTrUrVrhr�r�rFr�rir�r�r�rEr�r�r&r&r&r'rnGsF
	

rnc@r\)
rycCs||_|j�t�|_dSr)r|rE�	BLOCKSIZEr?)rer|r&r&r'rh<sz_StreamProxy.__init__cCs|jj|_|jSr)r|rEr?rlr&r&r'rE@s
z_StreamProxy.readcCsP|j�d�rdS|jdd�dkr8|jdd�dkr8d	S|j�d
�rHdSdSdS)
Ns�rqr�sBZhr�i
s1AY&SYrr)s]�s�7zXZrtrv)r?Z
startswithrjr&r&r'rzDs$z_StreamProxy.getcomptypecCs|j��dSr)r|rirjr&r&r'riNrkz_StreamProxy.closeN)rTrUrVrhrErzrir&r&r&r'ry7s
ryc@sfeZdZddd�Zdd�Zdd�Zdd	�Zd
d�Zdd
�Ze	j
fdd�Zddd�Zdd�Z
dd�ZdS)�_FileInFileNcCs�||_||_||_d|_t|dd�|_d|_|dur>d|fg}d|_g|_d}|j}|D]L\}}||kr||j�	d||df�|j�	d||||f�||7}||}qX||jkr�|j�	d||jdf�dS)NrrfFT)
r|�offsetr�positionrNrfr~�	map_index�mapr�)rer|r�rZ	blockinfoZlastposZrealposr&r&r'rh[s(


z_FileInFile.__init__cCsdSrr&rjr&r&r'r�trkz_FileInFile.flushcC�dS�NTr&rjr&r&r'�readablewrkz_FileInFile.readablecCr��NFr&rjr&r&r'�writablezrkz_FileInFile.writablecCs
|j��Sr)r|�seekablerjr&r&r'r�}rkz_FileInFile.seekablecCr�r)r�rjr&r&r'r��r�z_FileInFile.tellcCs�|tjkr tt|d�|j�|_nj|tjkr\|dkrFt|j|d�|_q�t|j||j�|_n.|tjkr�tt|j||j�d�|_ntd��|jS)NrzInvalid argument)	�io�SEEK_SET�minZmaxrr�ZSEEK_CURZSEEK_ENDr5)rer�Zwhencer&r&r'r��s


z_FileInFile.seekc	Cs
|dur|j|j}nt||j|j�}d}|dk�r|j|j\}}}}||jkr`|krhq�nq�q6|jd7_|jt|j�kr6d|_q6t|||j�}|r�|j�||j|�|j�|�}t|�|kr�t	d��||7}n|t
|7}||8}|j|7_q,|S)NrprrrA)rr�r�r�r�r r|r�rErr!)	rerr?Zdata�startZstopr�r#rLr&r&r'rE�s,

z_FileInFile.readcCs&|�t|��}||dt|��<t|�Sr)rEr )rerLr?r&r&r'�readinto�sz_FileInFile.readintocCs
d|_dSr�)r~rjr&r&r'ri�rkz_FileInFile.closerr)rTrUrVrhr�r�r�r�r�r�r�r�rEr�rir&r&r&r'r�Us

r�cseZdZ�fdd�Z�ZS)�ExFileObjectcs&t|j|j|j|j�}t��|�dSr)r�r|�offset_datar�sparseZsuperrh)re�tarfile�tarinfor|��	__class__r&r'rh�s
�zExFileObject.__init__)rTrUrVrhZ
__classcell__r&r&r�r'r��rWr�c@s�eZdZeddddddddd	d
ddd
dddddddd�Zdddd�Zedd��Zejdd��Zedd��Z	e	jdd��Z	dd�Z
dd �Zee
d!fd"d#�Zd$d%�Zd&d'�Zd(d)�Zed*d+��Zd,d-�Zed.d/��Zed0d1��Zed2d3��Zed4d5��Zed6d7��Zed8d9��Zd:d;�Zd<d=�Zd>d?�Zd@dA�ZdBdC�Z dDdE�Z!dFdG�Z"dHdI�Z#dJdK�Z$dLdM�Z%dNdO�Z&dPdQ�Z'dRdS�Z(dTdU�Z)dVdW�Z*dXdY�Z+dZd[�Z,d\d]�Z-d^d_�Z.d`da�Z/dbdc�Z0dS)erzName of the archive member.zPermission bits.z6User ID of the user who originally stored this member.z7Group ID of the user who originally stored this member.zSize in bytes.zTime of last modification.zHeader checksum.z�File type. type is usually one of these constants: REGTYPE, AREGTYPE, LNKTYPE, SYMTYPE, DIRTYPE, FIFOTYPE, CONTTYPE, CHRTYPE, BLKTYPE, GNUTYPE_SPARSE.zcName of the target file name, which is only present in TarInfo objects of type LNKTYPE and SYMTYPE.z
User name.zGroup name.zDevice major number.zDevice minor number.zThe tar header starts here.zThe file's data starts here.zMA dictionary containing key-value pairs of an associated pax extended header.zSparse member information.N)rfrgrrrr�chksum�type�linknamerr�devmajor�devminorr�r��pax_headersr�r��_sparse_structs�_link_targetrocCsj||_d|_d|_d|_d|_d|_d|_t|_d|_	d|_
d|_d|_d|_
d|_d|_d|_i|_dS)Ni�rro)rfrgrrrrr��REGTYPEr�r�rrr�r�r�r�r�r��rerfr&r&r'rh�s"zTarInfo.__init__cCr�r�rfrjr&r&r'rr�zTarInfo.pathcC�
||_dSrr�r�r&r&r'r�cCr�r�r�rjr&r&r'rr�zTarInfo.linkpathcCr�rr�)rer�r&r&r'rr�cCsd|jj|jt|�fS)Nz<%s %r at %#x>)r�rTrfZidrjr&r&r'�__repr__rkzTarInfo.__repr__cCsl|j|jd@|j|j|j|j|j|j|j|j	|j
|j|jd�
}|dt
krh|d�d�sh|dd7<|S)N��)
rfrgrrrrr�r�r�rrr�r�r�rf�/)rfrgrrrrr�r�r�rrr�r��DIRTYPEr�)re�infor&r&r'�get_infos"�zTarInfo.get_info�surrogateescapecCsT|��}|tkr|�|||�S|tkr4|�|||�S|tkrH|�||�Std��dS)Nzinvalid format)r�r�create_ustar_headerr
�create_gnu_headerr�create_pax_headerr5)rer<r$r%r�r&r&r'�tobuf0sz
TarInfo.tobufcCsnt|d<t|d�||��tkr(td��t|d�||��tkr^|�|d||�\|d<|d<|�|t||�S)N�magicr�zlinkname is too longrf�prefix)	�POSIX_MAGICr r�LENGTH_LINKr5�LENGTH_NAME�_posix_split_name�_create_headerr)rer�r$r%r&r&r'r�>szTarInfo.create_ustar_headercCs�t|d<d}t|d�||��tkr<||�|dt||�7}t|d�||��tkrl||�|dt||�7}||�|t	||�S)Nr�rpr�rf)
�	GNU_MAGICr rr��_create_gnu_long_header�GNUTYPE_LONGLINKr��GNUTYPE_LONGNAMEr�r
)rer�r$r%r?r&r&r'r�KszTarInfo.create_gnu_headerc
	Cs(t|d<|j��}ddtfddtfddfD]h\}}}||vr>q*z||�dd	�Wn"tyt||||<Yq*Yn0t||�|kr*||||<q*d
D]`\}}||vr�d||<q�||}d|kr�d|d
kr�nn
t|t	�r�t
|�||<d||<q�|�r|�|t|�}	nd}	|	|�
|tdd�S)Nr�rfrr�r)rr� )rrr�r0r1))rr.)rr.)r�)rr�rr.rrpr�)r�r��copyr�r�r�UnicodeEncodeErrorr �
isinstance�float�str�_create_pax_generic_header�XHDTYPEr�r)
rer�r$r�rfZhnamer#r;Zvalr?r&r&r'r�Ys4
�
*
zTarInfo.create_pax_headercCs|�|td�S)Nr)r��XGLTYPE)�clsr�r&r&r'�create_pax_global_header��z TarInfo.create_pax_global_headercCs~|�d�}tdt|��D]T}d�|d|��}d�||d��}t|�||��tkrt|�||��tkrqvqtd��||fS)Nr�rzname is too long)�splitr3r r�r�
LENGTH_PREFIXr�r5)rerfr$r%Z
componentsr8r�r&r&r'r��s
�zTarInfo._posix_split_namec
Cs�|�d�ttfv}|r@t|�dd�d|�}t|�dd�d|�}ntdd||�}tdd||�}t|�dd�d||�t|�d	d�d
@d|�t|�dd�d|�t|�dd�d|�t|�d
d�d|�t|�dd�d|�d|�dt�t|�dd�d||�|�dt�t|�dd�d||�t|�dd�d||�||t|�dd�d||�g}t�dt	d�
|��}t|t	d��d}	|dd�td|	d�|dd�}|S)Nr�r�rr.r�rorfrrgr�rrrr�rs        r�r�rr�rr�rz%dsrpi����z%06or0i����)
�get�CHRTYPE�BLKTYPEr=r(r�r�r>r�r�r�r@r:)
r�r<r$r%Zhas_device_fieldsr�r�Zpartsr?r�r&r&r'r��s4

�&zTarInfo._create_headercCs.tt|�t�\}}|dkr*|t|t7}|S)Nr)rDr r�r!)ZpayloadrJrKr&r&r'�_create_payload�szTarInfo._create_payloadcCsR|�||�t}i}d|d<||d<t|�|d<t|d<|�|t||�|�|�S)Nz
././@LongLinkrfr�rr�)rr!r r�r�rr�)r�rfr�r$r%r�r&r&r'r��s�zTarInfo._create_gnu_long_headerc	Cs0d}|��D]6\}}z|�dd�Wqty@d}YqDYq0qd}|rT|d7}|��D]�\}}|�d�}|r�|�|d�}n
|�d�}t|�t|�d}d	}	}
|tt|
��}	|	|
kr�q�|	}
q�|tt|
�d
�d|d|d
7}q\i}d|d<||d<t|�|d<t|d<|�|td
d�|�	|�S)NFrr1Trps21 hdrcharset=BINARY
r�r�rr0s s=�
z././@PaxHeaderrfr�rr�r�)
�itemsrr�r r�r:r�r�rr�)r�r�r�r$Zbinary�keyword�valueZrecordsZlr7r*r�r&r&r'r��s<

(�z"TarInfo._create_pax_generic_headerc	Cstt|�dkrtd��t|�tkr(td��|�t�tkr>td��t|dd��}|t|�vrbt	d��|�}t
|dd�||�|_t|dd	��|_t|d	d
��|_
t|d
d��|_t|dd��|_t|dd��|_||_|dd
�|_t
|d
d�||�|_t
|dd�||�|_t
|dd�||�|_t|dd��|_t|dd��|_t
|dd�||�}|jtk�r�|j�d��r�t|_|jtk�r6d}g}td�D]j}	z0t|||d��}
t||d|d��}Wnt�y�Y�qYn0|�|
|f�|d7}�q�t|d�}t|dd��}
|||
f|_ |�!��rN|j�"d�|_|�rp|jt#v�rp|d|j|_|S)Nrzempty headerztruncated headerzend of file headeri�i�zbad checksumriliti|i�i�ii	i)iIiQiYi�r�i�r�r��i�i�i�)$r rXr�rY�countr!rZr9r@r6r+rfrgrrrrr�r�r�rrr�r��AREGTYPEr�r��GNUTYPE_SPARSEr3r5r��boolr��isdir�rstrip�	GNU_TYPES)r�r?r$r%r��objr�r}�structsr8r��numbytes�
isextended�origsizer&r&r'�frombufsZ
zTarInfo.frombufcCs8|j�t�}|�||j|j�}|j��t|_|�|�Sr)	r|rEr�rr$r%r�r��_proc_member)r�r�r?r�r&r&r'�fromtarfileQszTarInfo.fromtarfilecCsT|jttfvr|�|�S|jtkr,|�|�S|jtttfvrF|�	|�S|�
|�SdSr)r�r�r��
_proc_gnulongr��_proc_sparser�r��SOLARIS_XHDTYPE�	_proc_pax�
_proc_builtin)rer�r&r&r'rfs



zTarInfo._proc_membercCsR|j��|_|j}|��s$|jtvr4||�|j�7}||_|�	|j
|j|j�|Sr)
r|r�r��isregr��SUPPORTED_TYPES�_blockrr��_apply_pax_infor�r$r%)rer�r�r&r&r'r
sszTarInfo._proc_builtincCs�|j�|�|j��}z|�|�}Wnty<td��Yn0|j|_|jt	krdt
||j|j�|_
n|jtkr�t
||j|j�|_|S)N� missing or bad subsequent header)r|rEr
rrr
r[r�r�r�r+r$r%rfr�r�)rer�r?�nextr&r&r'r�s

zTarInfo._proc_gnulongc
	Cs�|j\}}}|`|r�|j�t�}d}td�D]l}z0t|||d��}t||d|d��}	WntyxYq�Yn0|r�|	r�|�||	f�|d7}q,t|d�}q||_	|j�
�|_|j|�|j
�|_||_
|S)Nrir�r�i�)r�r|rEr�r3r9r5r�r�r�r�r�r
rr�)
rer�r�rrr?r}r8r�rr&r&r'r�s(
zTarInfo._proc_sparsecCs|j�|�|j��}|jtkr&|j}n
|j��}t�	d|�}|durX|�
d��d�|d<|�d�}|dkrr|j
}nd}t�d�}d}|�||�}|s��q&|��\}	}
t|	�}	||�d�d|�d�|	d�}|�|
dd|j�}
|
tv�r|�|||j
|j�}n|�|dd|j�}|||
<||	7}q�z|�|�}Wnt�yPtd	��Yn0d
|v�rj|�||�nHd|v�r�|�|||�n.|�d�d
k�r�|�d�dk�r�|�|||�|jttfv�r|�||j
|j�|j |_ d|v�r|j!}
|�"��s|jt#v�r|
|�|j�7}
|
|_ |S)Ns\d+ hdrcharset=([^\n]+)\nrr�
hdrcharsetZBINARYs(\d+) ([^=]+)=rrr�GNU.sparse.map�GNU.sparse.sizezGNU.sparse.majorZ1zGNU.sparse.minorr2r)$r|rEr
rr�r�r�r��reZsearch�groupr)r�r$Zcompile�matchZgroupsr4rMr��_decode_pax_fieldr%�PAX_NAME_FIELDSrr
r[�_proc_gnusparse_01�_proc_gnusparse_00�_proc_gnusparse_10r�rrr�r�rr)rer�r?r�rrr$Zregexr}r#r�r�rr�r&r&r'r	�sd



$	
�
�
�


 
zTarInfo._proc_paxcCshg}t�d|�D]}|�t|�d���qg}t�d|�D]}|�t|�d���q:tt||��|_dS)Ns\d+ GNU.sparse.offset=(\d+)\nrs\d+ GNU.sparse.numbytes=(\d+)\n)rZfinditerr�r4r�list�zipr�)rerr�r?Zoffsetsrrr&r&r'rszTarInfo._proc_gnusparse_00cCs@dd�|d�d�D�}tt|ddd�|ddd���|_dS)NcSsg|]}t|��qSr&)r4)�.0�xr&r&r'�
<listcomp>*rpz.TarInfo._proc_gnusparse_01.<locals>.<listcomp>rz,rr)r�rrr�)rerr�r�r&r&r'r'szTarInfo._proc_gnusparse_01cCs�d}g}|j�t�}|�dd�\}}t|�}t|�|dkrtd|vrT||j�t�7}|�dd�\}}|�t|��q,|j��|_t	t
|ddd�|ddd���|_dS)Nr�rr)r|rEr�r�r4r r�r�r�rrr�)rerr�r�Zfieldsr�r?Znumberr&r&r'r-szTarInfo._proc_gnusparse_10c	Cs�|��D]�\}}|dkr&t|d|�q|dkr@t|dt|��q|dkrZt|dt|��q|tvr|tvr�zt||�}Wnty�d}Yn0|dkr�|�d�}t|||�q|��|_dS)NzGNU.sparse.namerrrzGNU.sparse.realsizerr�)	r�Zsetattrr4�
PAX_FIELDS�PAX_NUMBER_FIELDSr5r�r�r�)rer�r$r%r�r�r&r&r'r=s"

zTarInfo._apply_pax_infocCs2z|�|d�WSty,|�||�YS0dS)Nr1)r)ZUnicodeDecodeError)rer�r$Zfallback_encodingZfallback_errorsr&r&r'rTszTarInfo._decode_pax_fieldcCs"t|t�\}}|r|d7}|tS)Nr)rDr�)rer�rJrKr&r&r'r
\szTarInfo._blockcCs
|jtvSr)r��
REGULAR_TYPESrjr&r&r'rer�z
TarInfo.isregcCs|��Sr)rrjr&r&r'�isfileir�zTarInfo.isfilecC�
|jtkSr)r�r�rjr&r&r'r�mr�z
TarInfo.isdircCr%r)r��SYMTYPErjr&r&r'�issymqr�z
TarInfo.issymcCr%r)r��LNKTYPErjr&r&r'�islnkur�z
TarInfo.islnkcCr%r)r�r�rjr&r&r'�ischryr�z
TarInfo.ischrcCr%r)r�r�rjr&r&r'�isblk}r�z
TarInfo.isblkcCr%r)r��FIFOTYPErjr&r&r'�isfifo�r�zTarInfo.isfifocCs
|jduSr)r�rjr&r&r'�issparse�rkzTarInfo.issparsecCs|jtttfvSr)r�r�r�r,rjr&r&r'�isdev�r�z
TarInfo.isdev)ro)1rTrUrVZdictZ	__slots__rhZpropertyrZsetterrr�r�rrr�r�r�r��classmethodr�r�Zstaticmethodr�r�r�r�rrrr
rrr	rrrrrr
rr$r�r'r)r*r+r-r.r/r&r&r&r'r�s��





1

#
	

2
>

f	rc
@s�eZdZdZdZdZdZeZe	Z
dZeZ
eZd[dd�Zedddefd	d
��Zed\dd��Zed]dd��Zed^dd��Zed_dd��Zddddd�Zdd�Zdd�Zdd�Zdd �Zd`d!d"�Zdadd$�d%d&�Zdbdd'�d(d)�Zdcd*d+�Z dddd-�d.d/�Z!dedd-�d1d2�Z"d3d4�Z#dfd5d6�Z$d7d8�Z%d9d:�Z&d;d<�Z'd=d>�Z(d?d@�Z)dAdB�Z*dCdD�Z+dEdF�Z,dGdH�Z-dIdJ�Z.dgdKdL�Z/dMdN�Z0dhdOdP�Z1dQdR�Z2dSdT�Z3dUdV�Z4dWdX�Z5dYdZ�Z6dS)irrFrNr_r�c
Cs�ddddd�}||vrtd��||_|||_|sh|jdkrTtj�|�sTd|_d|_t||j�}d	|_n@|dur�t|d
�r�t	|j
ttf�r�|j
}t|d�r�|j|_d|_|r�tj�
|�nd|_
||_|dur�||_|dur�||_|dur�||_|dur�||_|du�r||_|	|_|
du�r0|jtk�r0|
|_ni|_|du�rF||_|du�rV||_|
|_d	|_g|_d	|_|j��|_i|_z�|jd
k�r�d|_ |�!�|_ |jdk�r2|j�"|j�z|j�#|�}|j�$|�WnXt%�y�|j�"|j�Y�q2Yn2t&�y,}zt't|���WYd}~n
d}~00�q�|jdv�r|d|_|j�r||j�(|j�)��}|j�*|�|jt+|�7_Wn&|j�s�|j�,�d|_�Yn0dS)N�rbzr+b�wbZxb�r_�ar`r�!mode must be 'r', 'a', 'w' or 'x'r4r`FrfrgTr_�r4r`r)-r5rgZ_moderbr�exists�	bltn_openrxrcr�rfr�r:�abspathr|r<r��dereference�ignore_zerosr$r%rr��debug�
errorlevel�copybufsizer~�members�_loadedr�r��inodes�firstmemberrr�rr�rZr
rr�r�rFr ri)rerfrgr|r<r�r:r;r$r%r�r<r=r>Zmodes�er?r&r&r'rh�s�
�





&
zTarFile.__init__c

s�|s|std��|dvr��fdd�}t�j|d�D]l}t��j|�}|durV|��}	z||d|fi|��WSttfy�|dur�|�|	�Yq2Yq20q2td���nd|v�r|�dd	�\}
}|
p�d}
|p�d
}|�jvr�t��j|�}ntd|��|||
|fi|��Sd|v�r�|�dd	�\}
}|
�p4d}
|�p>d
}|
d
v�rRtd��t	||
|||�}z�||
|fi|��}Wn|�
��Yn0d|_|S|dv�r��j|||fi|��Std��dS)Nznothing to open)r_�r:*cs�j|dkS)N�taropen)�	OPEN_METH)r{�r�r&r'�not_compressed@rkz$TarFile.open.<locals>.not_compressed�Zkeyr_z%file could not be opened successfullyz:rrvrwz|r^zmode must be 'r' or 'w'Fr6zundiscernible mode)
r5�sortedrFrNr�rrr�r�rnrirxrE)
r�rfrgr|rI�kwargsrHr{ZfuncZ	saved_pos�filemodeZstreamr�r&rGr'rsP%







zTarFile.opencKs$|dvrtd��||||fi|��S)Nr3r5)r5)r�rfrgr|rKr&r&r'rEqszTarFile.taropenr�cKs�|dvrtd��zddlm}Wnty:td��Yn0z|||d||�}Wn,ty~|durx|dkrxtd���Yn0z|j|||fi|��}Wn@ty�|��|dkr�td���Yn|���Yn0d	|_	|S)
N�r_r`r�mode must be 'r', 'w' or 'x'r)�GzipFilezgzip module is not availablerLr_r�F)
r5ZgziprOr�rr�rrErirx)r�rfrgr|�
compresslevelrKrOr�r&r&r'�gzopenys0zTarFile.gzopenc	Ks�|dvrtd��zddlm}Wnty:td��Yn0||pD|||d�}z|j|||fi|��}WnDttfy�|��|dkr�t	d���Yn|���Yn0d	|_
|S)
NrMrNr)�BZ2Filers)rPr_znot a bzip2 fileF)r5rrrRr�rrEr��EOFErrorrirrx)r�rfrgr|rPrKrRr�r&r&r'�bz2open�s&zTarFile.bz2openc		Ks�|dvrtd��zddlm}m}Wnty>td��Yn0||pH|||d�}z|j|||fi|��}WnD|tfy�|��|dkr�t	d���Yn|���Yn0d	|_
|S)
NrMrNr)�LZMAFiler�ru)�presetr_znot an lzma fileF)r5r�rUr�r�rrErSrirrx)	r�rfrgr|rVrKrUr�r�r&r&r'�xzopen�s&zTarFile.xzopenrErQrTrW)rvrqrrrtcCs�|jr
dSd|_zp|jdvrn|j�ttd�|jtd7_t|jt�\}}|dkrn|j�tt|�W|j	s�|j�
�n|j	s�|j�
�0dS)NTr6rr)r~rgr|rFr!r�r�rD�
RECORDSIZErxri)rerJrKr&r&r'ri�s
�z
TarFile.closecCs"|�|�}|durtd|��|S)Nzfilename %r not found)�
_getmember�KeyError)rerfr�r&r&r'�	getmember�s
zTarFile.getmembercCs|��|js|��|jSr)�_checkr@�_loadr?rjr&r&r'�
getmembers�szTarFile.getmemberscCsdd�|��D�S)NcSsg|]
}|j�qSr&r�)rr�r&r&r'r rpz$TarFile.getnames.<locals>.<listcomp>)r^rjr&r&r'�getnamesr�zTarFile.getnamescCsZ|�d�|dur|j}|dur$|}tj�|�\}}|�tjd�}|�d�}|��}||_	|dur�|j
stt�|�}q�t�|�}nt�
|���}d}|j}t�|�r�|j|jf}	|j
s�|jdkr�|	|jvr�||j|	kr�t}
|j|	}nt}
|	dr�||j|	<nht�|��rt}
nVt�|��r"t}
nDt�|��r>t}
t�|�}n(t�|��rPt}
nt� |��rbt!}
ndS||_||_"|j#|_$|j%|_&|
tk�r�|j'|_(nd|_(|j)|_*|
|_+||_,t-�r�zt-�.|j$�d|_/Wnt0�y�Yn0t1�rzt1�2|j&�d|_3Wnt0�yYn0|
tt!fv�rVt4td��rVt4td��rVt�5|j6�|_7t�8|j6�|_9|S)N�awxr�rorr�major�minor):r\rfrbrZ
splitdriver��sepZlstripr�r�r:Zlstat�statZfstatZfilenoZst_modeZS_ISREGZst_inoZst_devZst_nlinkrAr(r�ZS_ISDIRr�ZS_ISFIFOr,ZS_ISLNKr&ZreadlinkZS_ISCHRr�ZS_ISBLKr�rgZst_uidrZst_gidrZst_sizerZst_mtimerr�r��pwdZgetpwuidrrZ�grpZgetgrgidrrcraZst_rdevr�rbr�)rerf�arcnamer|Zdrvr�Zstatresr�ZstmdZinoder�r&r&r'�
gettarinfo
s�	


��

zTarFile.gettarinfoT)r?cCs�|��|dur|}|D]�}|r�tt�|j��td|jp>|j|jpH|jf�|�	�s`|�
�rztdd|j|jf�ntd|j
�tdt�|j�dd��t|j|��r�dnd�|r�|��r�td	|j�|��r�td
|j�t�qdS)Nz%s/%sz%10sz%d,%dz%10dz%d-%02d-%02d %02d:%02d:%02dr�r�roz-> zlink to )r\rQrdrLrgrrrrr*r+r�r�rr�Z	localtimerrfr�r'r�r)rP)re�verboser?r�r&r&r'rps0
���zTarFile.list��filtercCsL|�d�|dur|}|jdurFtj�|�|jkrF|�dd|�dS|�d|�|�||�}|durz|�dd|�dS|dur�||�}|dur�|�dd|�dS|��r�t|d��}|�	||�Wd�n1s�0Ynb|�
��r>|�	|�|�rHtt�|��D],}|j
tj�||�tj�||�||d��qn
|�	|�dS)	Nr`rztarfile: Skipped %rrztarfile: Unsupported type %rztarfile: Excluded %rr1rj)r\rfrbrr9�_dbgrhrr8�addfiler�rJZlistdir�addr�)rerfrgZ	recursiverkr�Zfr&r&r'rn�s6

,

�zTarFile.addcCs�|�d�t�|�}|�|j|j|j�}|j�|�|jt	|�7_|j
}|dur�t||j|j|d�t
|jt�\}}|dkr�|j�tt|�|d7}|j|t7_|j�|�dS)Nr`)rIrr)r\r�r�r<r$r%r|rFr�r r>rCrrDr�r!r?r�)rer�r|r?rIrJrKr&r&r'rm�s

zTarFile.addfile�.��
numeric_ownercCs�g}|dur|}|D]>}|��r:|�|�t�|�}d|_|j|||��|d�q|jdd�d�|��|D]�}tj�	||j
�}z,|j|||d�|�||�|�
||�Wqpty�}z*|jdkr΂n|�dd|�WYd}~qpd}~00qpdS)	N����	set_attrsrqcSr�rr�)r4r&r&r'Z<lambda>�rpz$TarFile.extractall.<locals>.<lambda>rIrpr�tarfile: %s)r�r�r�rg�extractZsortZreverserbrr�rf�chown�utime�chmodr	r=rl)rerr?rqZdirectoriesr�ZdirpathrCr&r&r'�
extractall�s.

�
zTarFile.extractallroc
Cs|�d�t|t�r |�|�}n|}|��r>tj�||j�|_	z"|j
|tj�||j�||d�Wn�ty�}zP|j
dkr~�n6|jdur�|�dd|j�n|�dd|j|jf�WYd}~nLd}~0t�y
}z*|j
dkr�n|�dd|�WYd}~n
d}~00dS)Nr_rsrrruztarfile: %s %r)r\r�r�r[r)rbrr�r�r��_extract_memberrfr�r=ZfilenamerlZstrerrorr	)re�memberrrtrqr�rCr&r&r'rvs*	

�


,
zTarFile.extractcCs�|�d�t|t�r |�|�}n|}|��s6|jtvrB|�||�S|��sR|�	�rzt|j
t�rhtd��q~|�
|�|��SndSdS)Nr_z'cannot extract (sym)link as file object)r\r�r�r[rr�r�
fileobjectr)r'r|rnr�extractfile�_find_link_target)rer|r�r&r&r'r~*s


zTarFile.extractfilecCsT|�d�}|�dtj�}tj�|�}|r>tj�|�s>t�|�|��sN|�	�rh|�
dd|j|jf�n|�
d|j�|�
�r�|�||�n�|��r�|�||�nx|��r�|�||�nb|��s�|��r�|�||�nD|��s�|�	�r�|�||�n&|jtv�r|�||�n|�||�|�rP|�|||�|�	��sP|�||�|�||�dS)Nr�rz%s -> %s)r�r�rbrcr�dirnamer7Zmakedirsr)r'rlrfr�r�makefiler��makedirr-�makefifor*r+�makedev�makelinkr�r�makeunknownrwryrx)rer��
targetpathrtrqZ	upperdirsr&r&r'r{Is4


zTarFile._extract_membercCs(zt�|d�Wnty"Yn0dS)Nrr)rbZmkdirZFileExistsError�rer�r�r&r&r'r�zszTarFile.makedircCs�|j}|�|j�|j}t|d��l}|jdurn|jD]"\}}|�|�t|||t|�q4|�|j�|�	�nt|||jt|�Wd�n1s�0YdS)Nr2)
r|r�r�r>r8r�rCrrZtruncate)rer�r�ZsourcerIZtargetr�rr&r&r'r��s


zTarFile.makefilecCs"|�||�|�dd|j�dS)Nrz9tarfile: Unknown file type %r, extracted as regular file.)r�rlr�r�r&r&r'r��s�zTarFile.makeunknowncCs"ttd�rt�|�ntd��dS)N�mkfifozfifo not supported by system)rcrbr�r	r�r&r&r'r��s
zTarFile.makefifocCs^ttd�rttd�std��|j}|��r6|tjO}n
|tjO}t�||t�	|j
|j��dS)N�mknodr�z'special devices not supported by system)rcrbr	rgr+rdZS_IFBLKZS_IFCHRr�r�r�r�)rer�r�rgr&r&r'r��s
�zTarFile.makedevcCs�zL|��rt�|j|�n0tj�|j�r8t�|j|�n|�|�	|�|�WnDt
y�z|�|�	|�|�Wnty�td��Yn0Yn0dS)Nz%unable to resolve link inside archive)
r'rbZsymlinkr�rr7r�Zlinkr{r�symlink_exceptionrZr	r�r&r&r'r��s��zTarFile.makelinkcCs�ttd�r�t��dkr�|j}|j}|s~ztr<t�|j�d}WntyPYn0zt	rht	�
|j�d}Wnty|Yn0z4|��r�ttd�r�t�
|||�nt�|||�Wnty�td��Yn0dS)N�geteuidrr�lchownzcould not change owner)rcrbr�rrrfZgetgrnamrrZreZgetpwnamrr'r�rwr�r	)rer�r�rqZgZur&r&r'rw�s(z
TarFile.chowncCs2zt�||j�Wnty,td��Yn0dS)Nzcould not change mode)rbryrgr�r	r�r&r&r'ry�sz
TarFile.chmodcCsFttd�sdSzt�||j|jf�Wnty@td��Yn0dS)Nrxz"could not change modification time)rcrbrxrr�r	r�r&r&r'rx�s
z
TarFile.utimec
Cs�|�d�|jdur$|j}d|_|S|j|j��krZ|j�|jd�|j�d�sZtd��d}z|j�	|�}W�q�t
y�}zD|jr�|�dd|j|f�|jt
7_WYd}~q^WYd}~�q�d}~0t�yB}z^|j�r|�dd|j|f�|jt
7_WYd}~q^n|jdk�r.tt|���WYd}~n�d}~0t�yh|jdk�rdtd��Ynnt�y�}z$|jdk�r�tt|���WYd}~n:d}~0t�y�}ztt|���WYd}~n
d}~00�q�q^|du�r�|j�|�nd|_|S)	NZrarrArz0x%X: %srz
empty fileT)r\rBr�r|r�r�rErr�rrZr;rlr�r6r�rXrYr[r?r�r@)reZmr�rCr&r&r'r�sJ

"  "
zTarFile.nextcCsn|��}|dur"|d|�|��}|r2tj�|�}t|�D].}|rRtj�|j�}n|j}||kr:|Sq:dSr)r^�indexrbrZnormpathZreversedrf)rerfr��	normalizer?r|Zmember_namer&r&r'rY0	szTarFile._getmembercCs|��}|durqqd|_dSr�)rr@)rer�r&r&r'r]G	sz
TarFile._loadcCs:|jrtd|jj��|dur6|j|vr6td|j��dS)Nz%s is closedzbad operation for mode %r)r~r�r�rTrg)rergr&r&r'r\Q	szTarFile._checkcCs`|��r.d�tdtj�|j�|jf��}d}n
|j}|}|j||dd�}|dur\t	d|��|S)Nr�T)r�r�zlinkname %r not found)
r'r�rkrbrr�rfr�rYrZ)rer�r�Zlimitr|r&r&r'rZ	s zTarFile._find_link_targetccs�|jr|jEdHdSd}|jdur:|��}|d7}|V|t|j�krT|j|}n"|jsr|��}|svd|_dSndS|d7}|Vq:dS)NrrT)r@r?rBrr )rer�r�r&r&r'�__iter__m	s$
zTarFile.__iter__cCs||jkrt|tjd�dS)N�Zfile)r<rPrO�stderr)reZlevel�msgr&r&r'rl�	s
zTarFile._dbgcCs|��|Sr)r\rjr&r&r'�	__enter__�	szTarFile.__enter__cCs,|dur|��n|js"|j��d|_dSr�)rirxr|r~)rer�r�Z	tracebackr&r&r'�__exit__�	s


zTarFile.__exit__)
Nr_NNNNNNr�NNNN)r_N�r_Nr�r�)r_NN)NNN)Tr�r)roN)roT)TFr�r)7rTrUrVr<r:r;r=rr<rr$r%rr�r�r}rhr0rXrrErQrTrWrFrir[r^r_rhrrnrmrzrvr~r{r�r�r�r�r�r�rwryrxrrYr]r\rr�rlr�r�r&r&r&r'r�sz�
oZ �


c 3
(&�
1
6


	rcCsFz,t|d�rt|d�}nt|�}|��WdSty@YdS0dS)NrE)r|TF)rcrrir)rfr�r&r&r'r�	s
rc	Cs,ddl}d}|j|d�}|jdddddd	�|jd
d�}|jdd
ddd�|jdddddd�|jdddddd�|jddddd�|��}|jdu�r|j}t|��rt|d��*}|��t	|��t
jd�Wd�n1s�0Y|j�rt	d �
|��n|�d!d"�
|���n|jdu�r�|j}t|��rtt�|d#��}|j|jd$�Wd�n1�sh0Yn|�d!d"�
|���n�|jdu�rpt|j�d!k�r�|jd}tj}n,t|j�d%k�r�|j\}}n|�d!|���t|��r\t�|d#��}|j|d&�Wd�n1�s0Y|j�rn|d'k�rFd(�
|�}	nd)�
||�}	t	|	�n|�d!d"�
|��n�|jdu�r(|j�d�}
tj�|
�\}}d*d*d+d+d,d,d,d,d-�}
||
v�r�d.|
|nd/}|j}t�|
|��&}|D]}|�|��q�Wd�n1�s0Y|j�r(t	d0�
|
��dS)1Nrz3A simple command-line interface for tarfile module.)�descriptionz-vz	--verboseZ
store_trueFzVerbose output)ZactionZdefault�helpT)Zrequiredz-lz--list�	<tarfile>zShow listing of a tarfile)�metavarr�z-ez	--extractz+)r�z<output_dir>zExtract tarfile into target dir)Znargsr�r�z-cz--create)z<name>z<file>zCreate tarfile from sourcesz-tz--testzTest if a tarfile is validr_r�z{!r} is a tar archive.rz{!r} is not a tar archive.
rD)rir)rroz{!r} file is extracted.z+{!r} file is extracted into {!r} directory.rqrtrr)r�z.tgzz.xzz.txzz.bz2z.tbzz.tbz2z.tb2zw:r`z{!r} file created.)�argparseZArgumentParserZadd_argumentZadd_mutually_exclusive_groupZ
parse_argsZtestrrr^rPrOr�rir<Zexitrrrvr rb�curdirZformat_helprzZcreateZpoprZsplitextrn)r�r�ZparserrZargsrGrvZtfr�r�Ztar_nameZ_ZextZcompressionsZtar_modeZ	tar_filesZ	file_namer&r&r'�main�	s��
�
�
�
�
0
0

,
�
�
.r�Z__main__)]ZversionZ
__author__Z__credits__Zbuiltinsrr8rOrbr�rBrdr�r>r�rrer�rfZAttributeErrorZNotImplementedErrorr�r�Z	NameErrorZ__all__r!r�rXr�r�r�r�r�r�r�r(r&r�r�r�r,ZCONTTYPEr�r�r�r�r�rrr
rrrr#r�r!rr�r4r"rfrZgetfilesystemencodingr(r+r9r=r@rCrQZ	Exceptionrr	rrrr
rXrYrZr6r[r]rnZobjectryr�ZBufferedReaderr�rrrr�rTr&r&r&r'Z<module> s�

����
qhJW