o
    6_                     @   s   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	m
Z
 d dlmZ d dlmZmZmZ d dlmZ d dlmZmZmZmZmZmZ edejZdd	d
ZG dd deZdS )    )print_functionN)OrderedDict)log)ZIP_DEFLATEDZipInfoZipFile)
WheelError)urlsafe_b64decode
as_unicodenativeurlsafe_b64encodeas_bytesStringIOzt^(?P<namever>(?P<name>.+?)-(?P<ver>.+?))(-(?P<build>\d[^-]*))?
     -(?P<pyver>.+?)-(?P<abi>.+?)-(?P<plat>.+?)\.whl$c                 C   s,   t tjd| p
t } t| dd S )NSOURCE_DATE_EPOCHr      )intosenvirongettimegmtime)Z	timestamp r   /lib/python3.10/site-packages/wheel/wheelfile.pyget_zipinfo_datetime   s   r   c                   @   sR   e Zd ZdZejZdefddZdddZ	dd	 Z
dd
dZdddZdd ZdS )	WheelFilezA ZipFile derivative class that also reads SHA-256 hashes from
    .dist-info/RECORD and checks any read files against those.
    rc              
   C   s  t j|}t|| _|dr| jd u rtd|t	j
| |||dd d| jd| _| jd | _t | _i | _|dkrd	| j| j< d	| j| jd
 < d	| j| jd < z| | j}W n tyo   td| jw |T |D ]H}|d}|dd\}}}	|r|d\}
}zt|
 W n ty   td|
w |
 dv rtd|
|
t|df| j|< quW d    d S 1 sw   Y  d S d S )Nz.whlzBad wheel filename {!r}T)compressionZ
allowZip64z{}.dist-infoZnameverz/RECORDr   NNz.jwsz.p7szMissing {} filezutf-8,   =zUnsupported hash algorithm: {}>   Zsha1Zmd5z4Weak hash algorithm ({}) is not permitted by PEP 427ascii)r   pathbasenameWHEEL_INFO_REmatchZparsed_filenameendswithr   formatr   __init__groupZdist_info_pathrecord_pathr   _file_hashes_file_sizesopenKeyErrordecodersplitsplithashlibnew
ValueErrorlowerr	   encode)selffilemoder   r#   recordliner"   Zhash_sumsize	algorithmr   r   r   r(   &   sP   

"zWheelFile.__init__Nc                    s   d fdd	}t t|tr|jn||dkr.ds.| jvr.tdtt	
| ||| |dkrVdsV| j \}d urVt| j| _ S )Nc                    sV   |d u r j }|  n| | |  |r' kr)tdtd S d S )NzHash mismatch for file '{}')_eofupdatedigestr   r'   r   )newdataeofZefZef_nameZexpected_hashZrunning_hashZupdate_crc_origr   r   _update_crcR   s   


z#WheelFile.open.<locals>._update_crcr   /zNo hash found for file '{}'N)r
   
isinstancer   filenamer&   r+   r   r'   r   r   r-   r2   r3   rD   )r7   Zname_or_infor9   pwdrD   r=   r   rC   r   r-   Q   s   
zWheelFile.openc           	      C   s   t d| j| g }t|D ]G\}}}|  t|D ]9}tjtj	||}tj
|rUtj||tjjd}|| jkrBq|drO|||f q| || qq|  |D ]
\}}| || q]d S )Nz#creating '%s' and adding '%s' to itrE   z
.dist-info)loggerinforH   r   walksortsortedr"   normpathjoinisfilerelpathreplacesepr*   r&   appendwrite)	r7   base_dirZdeferredrootdirnames	filenamesnamer"   arcnamer   r   r   write_filesl   s&   

zWheelFile.write_filesc                 C   s   t |d}t| }| }W d    n1 sw   Y  t|p$|t|jd}t	|j
t|j
B d> |_|p>| j|_| ||| d S )NrbZ	date_time   )r-   r   fstatfilenoreadr   r   st_mtimestatS_IMODEst_modeS_IFMTexternal_attrr   compress_typewritestr)r7   rH   r\   rj   fstdatazinfor   r   r   rV      s   
zWheelFile.writec                 C   sv   t | ||| t|tr|jn|}td| || jkr9| |}|j	t
t| f| j|< t|| j|< d S d S )Nzadding '%s')r   rk   rG   r   rH   rJ   rK   r*   _default_algorithmr[   r   r   r@   r+   lenr,   )r7   Zzinfo_or_arcnamebytesrj   fnamehash_r   r   r   rk      s   

zWheelFile.writestrc                    s    j d urN jdkrN jrNt }tj|dddd}| fdd j D  |t	 j
ddf tt j
t d	} j|_d
|_ |t|  t  d S )Nwr   "
)Z	delimiterZ	quotecharZlineterminatorc                 3   s0    | ]\}\}}||d  |  j | fV  qdS )r    N)r,   ).0rs   r=   rt   r7   r   r   	<genexpr>   s    


z"WheelFile.close.<locals>.<genexpr> r_   i  )fpr9   r+   r   csvwriterZ	writerowsitemsZwriterowr'   r*   r   r   r   r   rj   ri   rk   r   getvaluer   close)r7   rn   r~   ro   r   ry   r   r      s   zWheelFile.close)r   Nr   rF   )__name__
__module____qualname____doc__r2   Zsha256rp   r   r(   r-   r]   rV   rk   r   r   r   r   r   r      s    
+



r   rF   ) Z
__future__r   r}   r2   Zos.pathr   rere   r   collectionsr   	distutilsr   rJ   zipfiler   r   r   Z	wheel.clir   Z
wheel.utilr	   r
   r   r   r   r   compileVERBOSEr$   r   r   r   r   r   r   <module>   s$     
