o ac@sddlmZddlZddlZddlZddlZddlZddlZddl Z ddl m Z ddl m ZddlmZmZmZddlmZddlmZmZmZmZmZmZejdkr^dd lmZd d Znd d Ze d ej!Z"dddZ#GdddeZ$dS))print_functionN) OrderedDict)log) ZIP_DEFLATEDZipInfoZipFile) WheelError)urlsafe_b64decode as_unicodenativeurlsafe_b64encodeas_bytesStringIO)) TextIOWrappercCstt|dddS)Nutf-8)newlineencoding)csvreaderr)fpr1/usr/lib/python3/dist-packages/wheel/wheelfile.pyread_csvsrccs&t|D] }dd|DVqdS)NcSsg|]}|dqS)r)decode).0columnrrr szread_csv..)rr)rlinerrrrsz^(?P(?P[^-]+?)-(?P[^-]+?))(-(?P\d[^-]*))? -(?P[^-]+?)-(?P[^-]+?)-(?P[^.]+?)\.whl$cCs,ttjd|p t}t|ddS)NSOURCE_DATE_EPOCHr)intosenvirongettimegmtime) timestamprrrget_zipinfo_datetime#sr)c@sReZdZdZejZdefddZdddZ dd Z dd d Z dd d Z ddZ dS) WheelFilezA ZipFile derivative class that also reads SHA-256 hashes from .dist-info/RECORD and checks any read files against those. rc Cstj|}t||_|dr|jdurtd|t j ||||ddd|j d|_ |j d|_ t|_i|_|dkrd |j|j <d |j|j d <d |j|j d <z||j }Wntyotd |j w|Nt|D]@}|\}}} |sqw|d \} }zt| Wntytd| w| dvrtd| | t|df|j|<qwWddS1swYdSdS)Nz.whlzBad wheel filename {!r}T) compression allowZip64z {}.dist-infonameverz/RECORDr+NNz.jwsz.p7szMissing {} file=zUnsupported hash algorithm: {}>md5sha1z4Weak hash algorithm ({}) is not permitted by PEP 427ascii)r#pathbasename WHEEL_INFO_REmatchparsed_filenameendswithrformatr__init__groupdist_info_path record_pathr _file_hashes _file_sizesopenKeyErrorrsplithashlibnew ValueErrorlowerr encode) selffilemoder,r5recordrr4hash_sumsize algorithmrrrr;1sN          "zWheelFile.__init__Ncsdfdd }tt|tr|jn||dkr.ds.|jvr.tdtt |||||dkrVdsV|j\}durVt |j |_ S)NcsV|dur j}|n||||r'kr)tdtdSdS)NzHash mismatch for file '{}')_eofupdatedigestrr:r )newdataeofefef_name expected_hash running_hashupdate_crc_origrr _update_crc^s   z#WheelFile.open.._update_crcr+/zNo hash found for file '{}'N)r isinstancerfilenamer9r?rr:r rrArDrEr[)rI name_or_inforKpwdr[rOrrUrrA]s  zWheelFile.openc Cstd|j|g}t|D]G\}}}|t|D]9}tjtj ||}tj |rUtj || tjj d}||jkrBq|drO|||fq|||qq||D] \}}|||q]dS)Nz#creating '%s' and adding '%s' to itr\z .dist-info)loggerinfor_r#walksortsortedr4normpathjoinisfilerelpathreplacesepr>r9appendwrite) rIbase_dirdeferredrootdirnames filenamesnamer4arcnamerrr write_filesxs&      zWheelFile.write_filescCst|d}t|}|}Wdn1swYt|p$|t|jd}t |j t |j Bd>|_ |p>|j |_||||dS)Nrb date_time)rAr#fstatfilenoreadrr)st_mtimestatS_IMODEst_modeS_IFMT external_attrr, compress_typewritestr)rIr_rurfstdatazinforrrrns   zWheelFile.writecCsvt||||t|tr|jn|}td|||jkr9||}|j t t | f|j |<t||j|<dSdS)Nz adding '%s')rrr^rr_rbrcr>_default_algorithmrtr r rRr?lenr@)rIzinfo_or_arcnamebytesrfnamehash_rrrrs   zWheelFile.writestrcsjdurNjdkrNjrNt}tj|dddd}|fddjD|t j ddft t j t d }j|_d |_|t|tdS) Nw," ) delimiter quotecharlineterminatorc3s0|]\}\}}||d|j|fVqdS)r0N)r@)rrrOrrIrr s   z"WheelFile.close..rrxi)rrKr?rrwriter writerowsitemswriterowr:r>rr r)r,rrrr getvaluerclose)rIrrrrrrrszWheelFile.close)r+Nr/r])__name__ __module__ __qualname____doc__rDsha256rrr;rArvrnrrrrrrr**s ,  r*r])% __future__rrrDos.pathr#rersysr& collectionsr distutilsrrbzipfilerrr wheel.clir wheel.utilr r r r r r version_infoiorrcompileVERBOSEr6r)r*rrrrs.