
    Ce                        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
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  ej,                  dej.                        ZdZdd	Z G d
 de      Zy)    )annotationsN)StringIOTextIOWrapper)ZIP_DEFLATEDZipFileZipInfo)
WheelError)logurlsafe_b64decodeurlsafe_b64encodez^(?P<namever>(?P<name>[^\s-]+?)-(?P<ver>[^\s-]+?))(-(?P<build>\d[^\s-]*))?
     -(?P<pyver>[^\s-]+?)-(?P<abi>[^\s-]+?)-(?P<plat>\S+)\.whl$i c                    t        t        j                  j                  d| xs t	        j                                     } t        | t              } t	        j                  |       dd S )NSOURCE_DATE_EPOCHr      )intosenvirongettimemaxMINIMUM_TIMESTAMPgmtime)	timestamps    1/usr/lib/python3/dist-packages/wheel/wheelfile.pyget_zipinfo_datetimer      sL     BJJNN#6	8PTYY[QRII01I;;y!!A&&    c                  X    e Zd ZdZej
                  ZdefdZd
dZ	d Z
ddZddZd	 Zy)	WheelFilezA ZipFile derivative class that also reads SHA-256 hashes from
    .dist-info/RECORD and checks any read files against those.
    rc                   t         j                  j                  |      }t        j	                  |      | _        |j                  d      r| j
                  t        d|      t        j                  | |||d       dj                  | j
                  j                  d            | _        | j                  dz   | _        i | _        i | _        |dk(  r(d	| j                  | j                  <   d	| j                  | j                  d
z   <   d	| j                  | j                  dz   <   	 | j!                  | j                        }|5  t%        j&                  t)        |dd            D ]  }|\  }}}	|s|j+                  d      \  }
}	 t-        j.                  |
       |
j3                         dv rt        dj                  |
            |
t5        |j7                  d            f| j                  |<    	 d d d        y y # t"        $ r t        d| j                   d      d w xY w# t0        $ r t        d|
       d w xY w# 1 sw Y   y xY w)Nz.whlzBad wheel filename T)compression
allowZip64z{}.dist-infonameverz/RECORDr   NNz.jwsz.p7szMissing z file utf-8)newlineencoding=zUnsupported hash algorithm: >   md5sha1z4Weak hash algorithm ({}) is not permitted by PEP 427ascii)r   pathbasenameWHEEL_INFO_REmatchparsed_filenameendswithr	   r   __init__formatgroupdist_info_pathrecord_path_file_hashes_file_sizesopenKeyErrorcsvreaderr   splithashlibnew
ValueErrorlowerr   encode)selffilemoder    r-   recordliner,   hash_sumsize	algorithms              r   r2   zWheelFile.__init__(   sS   77##D),228<  (D,@,@,H28,?@@tT{tT,33  &&y1
  ..:3;2<Dd../;EDd..78;EDd..78O4#3#34  JJ!&"wG D ,0(D(D# *2..*='Ix$I. !(O;(""(&"3  ")(//'*BC/D%%d++    O 8D,<,<+=U!CD$NO & $(:9+F#$$ s2   (G? AIH&AI?$H#&H??IINc                  	
 	
fd}t        |t              r|j                  n||dk(  r.j                  d      s| j                  vrt        d d      t        j                  | |||      |dk(  rNj                  d      s=| j                     \  })t        j                  |      	j                  |c
_
        S )Nc                    j                   } |        j                  |        |r#j                         k7  rt        d d      y y )NzHash mismatch for file '')_eofupdatedigestr	   )newdataeofefef_nameexpected_hashrunning_hashupdate_crc_origs     r   _update_crcz#WheelFile.open.<locals>._update_crc^   sQ    ''CG$(|**,= #;G9A!FGG >sr   r   /zNo hash found for file 'rM   )
isinstancer   filenamer1   r7   r	   r   r9   r>   r?   rX   )rC   name_or_inforE   pwdrX   rJ   rS   rT   rU   rV   rW   s         @@@@@r   r9   zWheelFile.open]   s    	H 	H &0g%FL!!L 	 CK$$S)t0007yBCC\\$dC83;w//4'+'8'8'A$I}(  '{{9524..+/	r   c                   t        j                  d| j                   d| d       g }t        j                  |      D ]  \  }}}|j                          t        |      D ]  }t        j                  j                  t        j                  j                  ||            }t        j                  j                  |      s`t        j                  j                  ||      j                  t        j                  j                  d      }|| j                  k(  r|j                  d      r|j!                  ||f       | j#                  ||         |j                          |D ]  \  }}| j#                  ||        y )Nz
creating 'z' and adding 'z' to itrY   z
.dist-info)r
   infor[   r   walksortsortedr,   normpathjoinisfilerelpathreplacesepr6   r1   appendwrite)	rC   base_dirdeferredrootdirnames	filenamesnamer,   arcnames	            r   write_fileszWheelFile.write_filesz   s(   :dmm_N8*GLM)+): 	2%D(I MMOy) 	2ww''T4(@A77>>$' ggoodH=EEbggkkSVWG$"2"22|4 w8

41	2		2 	% 	&MD'JJtW%	&r   c                   t        |d      5 }t        j                  |j                               }|j	                         }d d d        t        |xs |t        j                              }t        j                  |j                        t        j                  |j                        z  dz  |_        |xs | j                  |_        | j                  ||       y # 1 sw Y   xY w)Nrb	date_time   )r9   r   fstatfilenoreadr   r   st_mtimestatS_IMODEst_modeS_IFMTexternal_attrr    compress_typewritestr)rC   r[   rq   r   fstdatazinfos           r   rj   zWheelFile.write   s    (D! 	Q!((*%B668D	 x+?+L
  $||BJJ7$++bjj:QQVXX+?t/?/?eT=1	 	s   4CC&c                z   t        |t              rAt        |t                     }| j                  |_        dt        j                  z  dz  |_        t        |t              r|j                  d      }t        j                  | |||       t        |t              r|j                  n|}t        j                  d| d       || j                  k7  rk| j!                  |      }|j"                  t%        |j'                               j)                  d      f| j*                  |<   t-        |      | j.                  |<   y y )Nru   i  rw   r%   zadding 'rM   r+   )rZ   strr   r   r    r   r|   S_IFREGr   rB   r   r   r[   r
   r_   r6   _default_algorithmrp   r   rP   decoder7   lenr8   )rC   zinfo_or_arcnamer   r   fnamehash_s         r   r   zWheelFile.writestr   s   &,& ,@,B  .2-=-=*.3dll.Br-I*dC ;;w'D/}E *G4 %%! 	
 	8E7!$%D$$$++D1E

!%,,.188A(De$ '*$iDU# %r   c                     j                    j                  dk(  r j                  rt               }t	        j
                  |ddd      }|j                   fd j                  j                         D               |j                  t         j                        ddf        j                   j                  |j                                t        j                          y )Nw,"
)	delimiter	quotecharlineterminatorc              3  Z   K   | ]"  \  }\  }}||d z   |z   j                   |   f $ yw)r(   N)r8   ).0r   rJ   r   rC   s       r   	<genexpr>z"WheelFile.close.<locals>.<genexpr>   s=      11	5 IOe3T5E5Ee5LMs   (+r$   )fprE   r7   r   r;   writer	writerowsitemswriterowr3   r6   r   getvaluer   close)rC   r   r   s   `  r   r   zWheelFile.close   s    77499#38I8I:DZZsSWXF595F5F5L5L5N OOVD$4$45r2>?MM$**DMMO<dr   )r   Nr#   N)__name__
__module____qualname____doc__r>   sha256r   r   r2   r9   rr   rj   r   r    r   r   r   r   !   s7     !"%< 3j:&,
204r   r   r   )
__future__r   r;   r>   os.pathr   rer|   r   ior   r   zipfiler   r   r   	wheel.clir	   
wheel.utilr
   r   r   compileVERBOSEr.   r   r   r   r   r   r   <module>r      sf    " 
   	   & 2 2   @ @ 

CJJ
  'c cr   