a [Îdg¸ ã@s’ddlmZddlZddlZddlZddlZddlmZddl Z ddl Z ddl Z ddl Z ddl Z ddlZddlZddlZddlZddlZddlZddlmZmZddlmZmZmZmZmZddlmZddlm Z m!Z!m"Z"m#Z#dd l$m%Z%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+m,Z,m-Z-dd l.m/Z/m0Z0e  1e2¡Z3da4e5ed ƒr¡ ?dd¡ ?dd¡Z@e 9d¡ZAeArÜeA 8d¡rÜeA ?dd¡ZAndd„ZBeBƒZA[Be CdejDejEB¡ZFe CdejDejEB¡ZGe Cd¡ZHe Cd ¡ZId!ZJd"ZKe jLd#krFd$d%„ZMnd&d%„ZMGd'd(„d(eNƒZOeOƒZPGd)d*„d*eNƒZQd+d,„ZReRƒZS[Rd/d-d.„ZTdS)0é)Úunicode_literalsN)Úmessage_from_fileé)Ú __version__ÚDistlibException)Ú sysconfigÚZipFileÚfsdecodeÚ text_typeÚfilter)ÚInstalledDistribution)ÚMetadataÚMETADATA_FILENAMEÚWHEEL_METADATA_FILENAMEÚLEGACY_METADATA_FILENAME) Ú FileOperatorÚ convert_pathÚ CSVReaderÚ CSVWriterÚCacheÚcached_propertyÚget_cache_baseÚ read_exportsÚtempdir)ÚNormalizedVersionÚUnsupportedVersionErrorZpypy_version_infoÚppÚjavaZjyZcliZipÚcpZpy_version_nodotz%s%séÚpyú-Ú_Ú.ZSOABIzcpython-cCsRdtg}t d¡r| d¡t d¡r0| d¡t d¡dkrH| d¡d  |¡S) NrZPy_DEBUGÚdZ WITH_PYMALLOCÚmZPy_UNICODE_SIZEéÚuÚ)Ú VER_SUFFIXrÚget_config_varÚappendÚjoin)Úparts©r.úC/usr/local/lib/python3.9/site-packages/pip/_vendor/distlib/wheel.pyÚ _derive_abi<s     r0zz (?P[^-]+) -(?P\d+[^-]*) (-(?P\d+[^-]*))? -(?P\w+\d+(\.\w+\d+)*) -(?P\w+) -(?P\w+(\.\w+)*) \.whl$ z7 (?P[^-]+) -(?P\d+[^-]*) (-(?P\d+[^-]*))?$ s \s*#![^\r\n]*s^(\s*#!("[^"]+"|\S+))\s+(.*)$s#!pythons #!pythonwú/cCs|S©Nr.©Úor.r.r/Ú^ór5cCs| tjd¡S)Nr1)ÚreplaceÚosÚsepr3r.r.r/r5`r6c@s6eZdZdd„Zdd„Zdd„Zd dd „Zd d „ZdS) ÚMountercCsi|_i|_dSr2)Ú impure_wheelsÚlibs©Úselfr.r.r/Ú__init__dszMounter.__init__cCs||j|<|j |¡dSr2)r;r<Úupdate)r>ÚpathnameÚ extensionsr.r.r/Úaddhs z Mounter.addcCs0|j |¡}|D]\}}||jvr|j|=qdSr2)r;Úpopr<)r>rArBÚkÚvr.r.r/Úremovels   zMounter.removeNcCs||jvr|}nd}|Sr2)r<)r>ÚfullnameÚpathÚresultr.r.r/Ú find_modulers zMounter.find_modulecCsj|tjvrtj|}nP||jvr,td|ƒ‚t ||j|¡}||_| dd¡}t|ƒdkrf|d|_ |S)Nzunable to find extension for %sr#rr) ÚsysÚmodulesr<Ú ImportErrorÚimpZ load_dynamicÚ __loader__ÚrsplitÚlenÚ __package__)r>rHrJr-r.r.r/Ú load_moduleys       zMounter.load_module)N)Ú__name__Ú __module__Ú __qualname__r?rCrGrKrTr.r.r.r/r:cs  r:c@sîeZdZdZdZdZd4dd„Zedd „ƒZed d „ƒZ ed d „ƒZ e dd„ƒZ dd„Z e dd„ƒZdd„Zd5dd„Zdd„Zdd„Zdd„Zd6dd„Zd d!„Zd"d#„Zd$d%„Zd&d'„Zd(d)„Zd*d+„Zd7d,d-„Zd.d/„Zd0d1„Zd8d2d3„ZdS)9ÚWheelz@ Class to build and install from Wheel files (PEP 427). )rrZsha256NFcCs8||_||_d|_tg|_dg|_dg|_t ¡|_ |durRd|_ d|_ |j |_ nât |¡}|rš| d¡}|d|_ |d d d ¡|_ |d |_|j |_ nštj |¡\}}t |¡}|sÄtd |ƒ‚|rÖtj |¡|_ ||_ | d¡}|d|_ |d|_ |d |_|d  d¡|_|d d¡|_|d d¡|_dS)zB Initialise an instance using a (valid) filename. r(ÚnoneÚanyNÚdummyz0.1ZnmZvnr"r!ZbnzInvalid name or filename: %rr r#ZbiÚar)ÚsignZ should_verifyÚbuildverÚPYVERÚpyverÚabiÚarchr8ÚgetcwdÚdirnameÚnameÚversionÚfilenameZ _filenameÚNAME_VERSION_REÚmatchÚ groupdictr7rIÚsplitÚ FILENAME_RErÚabspath)r>rgr]Úverifyr%Úinfordr.r.r/r?‘sD        ÿ    zWheel.__init__cCs^|jrd|j}nd}d |j¡}d |j¡}d |j¡}|j dd¡}d|j|||||fS)zJ Build and return a filename from the various components. r!r(r#r"z%s-%s%s-%s-%s-%s.whl)r^r,r`rarbrfr7re)r>r^r`rarbrfr.r.r/rgºs     ÿzWheel.filenamecCstj |j|j¡}tj |¡Sr2)r8rIr,rdrgÚisfile)r>rIr.r.r/ÚexistsËsz Wheel.existsccs4|jD](}|jD]}|jD]}|||fVqqqdSr2)r`rarb)r>r`rarbr.r.r/ÚtagsÐs   z Wheel.tagsc Cs4tj |j|j¡}d|j|jf}d|}t d¡}t |dƒà}|  |¡}|d  dd¡}t dd „|Dƒƒ}t tg} d} | D]z} zbt || ¡} | | ¡8} || ƒ}t|d } | rÂWdƒWqøWdƒn1sÖ0YWq|tyôYq|0q|| std d  | ¡ƒ‚Wdƒn1s&0Y| S) Nú%s-%sú %s.dist-infoúutf-8Úrú Wheel-Versionr#rcSsg|] }t|ƒ‘qSr.©Úint©Ú.0Úir.r.r/Ú àr6z"Wheel.metadata..)Úfileobjz8Invalid wheel, because metadata is missing: looked in %sz, )r8rIr,rdrgrerfÚcodecsÚ getreaderrÚget_wheel_metadatarkÚtuplerrÚ posixpathÚopenr ÚKeyErrorÚ ValueError)r>rAÚname_verÚinfo_dirÚwrapperÚzfÚwheel_metadataÚwvÚ file_versionZfnsrJÚfnÚmetadata_filenameÚbfÚwfr.r.r/Úmetadata×s2      4 ÿ&zWheel.metadatacCsld|j|jf}d|}t |d¡}| |¡&}t d¡|ƒ}t|ƒ}Wdƒn1sZ0Yt|ƒS)NrsrtÚWHEELru) rerfrƒr,r„rr€rÚdict)r>rŠr‡rˆrrr‘Úmessager.r.r/r÷s  &zWheel.get_wheel_metadatacCsJtj |j|j¡}t|dƒ}| |¡}Wdƒn1s<0Y|S)Nrv)r8rIr,rdrgrr)r>rArŠrJr.r.r/ros (z Wheel.infoc CsÔt |¡}|r|| ¡}|d|…||d…}}d| ¡vrBt}nt}t |¡}|rfd| ¡d}nd}||}||}nT| d¡}| d¡} |dks || kr¦d} n|||d…d krÀd } nd} t| |}|S) Nspythonwó éÿÿÿÿr6ó ó rrs ) Ú SHEBANG_REriÚendÚlowerÚSHEBANG_PYTHONWÚSHEBANG_PYTHONÚSHEBANG_DETAIL_REÚgroupsÚfind) r>Údatar%r›ZshebangZdata_after_shebangZshebang_pythonÚargsZcrZlfZtermr.r.r/Úprocess_shebangs,       zWheel.process_shebangcCsf|dur|j}ztt|ƒ}Wnty:td|ƒ‚Yn0||ƒ ¡}t |¡ d¡  d¡}||fS)NzUnsupported hash algorithm: %ró=Úascii) Ú hash_kindÚgetattrÚhashlibÚAttributeErrorrÚdigestÚbase64Zurlsafe_b64encodeÚrstripÚdecode)r>r¢r§ÚhasherrJr.r.r/Úget_hash%s  zWheel.get_hashcCsjt|ƒ}ttj ||¡ƒ}| |ddf¡t|ƒ$}|D]}| |¡q8Wdƒn1s\0YdS)Nr()ÚlistÚto_posixr8rIÚrelpathr+rZwriterow)r>ÚrecordsZ record_pathÚbaseÚpÚwriterÚrowr.r.r/Ú write_record0s  zWheel.write_recordc CsÂg}|\}}tt|jƒ}|D]d\}} t| dƒ} |  ¡} Wdƒn1sL0Yd| | ¡} tj | ¡} |  || | f¡qtj  |d¡} |  || |¡t tj  |d¡ƒ}|  || f¡dS)NÚrbz%s=%sÚRECORD) r¨r©r§r„Úreadr°r8rIÚgetsizer+r,r¹r²)r>roÚlibdirÚ archive_pathsr´Údistinforˆr¯Úapr¶Úfr¢r«Úsizer.r.r/Ú write_records8s   & zWheel.write_recordscCsZt|dtjƒ8}|D]"\}}t d||¡| ||¡qWdƒn1sL0YdS)NÚwzWrote %s to %s in wheel)rÚzipfileÚ ZIP_DEFLATEDÚloggerÚdebugÚwrite)r>rAr¿rŠrÁr¶r.r.r/Ú build_zipHs zWheel.build_zipc" sÈ|dur i}tt‡fdd„dƒƒd}|dkrFd}tg}tg}tg}nd}tg}d g}d g}| d |¡|_| d |¡|_| d |¡|_ ˆ|} d|j |j f} d| } d| } g} dD] }|ˆvrÆq¶ˆ|}t j  |¡r¶t  |¡D]Ü\}}}|D]Ì}tt j  ||¡ƒ}t j  ||¡}tt j  | ||¡ƒ}|  ||f¡|dkrò| d¡sòt|dƒ}| ¡}Wdƒn1st0Y| |¡}t|dƒ}| |¡Wdƒqò1s´0Yqòqäq¶| }d}t  |¡D]¦\}}}||kr,t|ƒD]8\}}t|ƒ}| d¡ròt j  ||¡}||=q,qò|D]H}t|ƒ d¡rHq0t j  ||¡}tt j  ||¡ƒ}|  ||f¡q0qÖt  |¡}|D]B}|dvrŒtt j  ||¡ƒ}tt j  | |¡ƒ}|  ||f¡qŒd|pÜ|jdtd|g}|jD] \}}}| d|||f¡qôt j  |d¡}t|dƒ }| d |¡¡Wdƒn1sV0Ytt j  | d¡ƒ}|  ||f¡d d!„} t| | d"} |  || f| | ¡t j  |j!|j"¡}!| #|!| ¡|!S)#z‰ Build a wheel from files in specified paths, and use any specified tags when determining the name of the wheel. Ncs|ˆvSr2r.r3©Úpathsr.r/r5Vr6zWheel.build..)ÚpurelibÚplatlibrrÏZfalseÚtruerYrZr`rarbrsú%s.datart)r¢ZheadersÚscriptsrÒú.exerºÚwbú .dist-info)z.pycz.pyo)r»Z INSTALLERZSHAREDr“zWheel-Version: %d.%dzGenerator: distlib %szRoot-Is-Purelib: %sz Tag: %s-%s-%sr“rÅÚ cSs*|d}| d¡}d|vr"|d7}||fS)Nrr1rÕi')Úcount)ÚtrÁÚnr.r.r/Úsorter²s  zWheel.build..sorter)Úkey)$r±r ÚIMPVERÚABIÚARCHr_Úgetr`rarbrerfr8rIÚisdirÚwalkr r,r³r²r+Úendswithr„r¼r¤rÊÚ enumerateÚlistdirÚ wheel_versionrrrÚsortedrÄrdrgrË)"r>rÍrrråZlibkeyZis_pureZ default_pyverZ default_abiZ default_archr¾r‡Údata_dirrˆr¿rÛrIÚrootÚdirsÚfilesrŽr¶ÚrprÁrÂr¢rÀr|Údnr‹r`rarbrÚrAr.rÌr/ÚbuildNs˜   (  0     ý 0  z Wheel.buildcCs | d¡S)zl Determine whether an archive entry should be skipped when verifying or installing. )r1z /RECORD.jws)râ)r>Úarcnamer.r.r/Ú skip_entryÂszWheel.skip_entrycC KsV|j}| d¡}| dd¡}| dd¡}tj |j|j¡}d|j|jf} d| } d| } t  | t ¡} t  | d¡} t  | d ¡}t   d ¡}t |d ƒ¬}| | ¡ }||ƒ}t|ƒ}Wd ƒn1sÆ0Y|d  dd¡}tdd„|Dƒƒ}||jkr|r||j|ƒ|ddkr(|d}n|d}i}| |¡X}t|d,}|D]}|d}|||<qPWd ƒn1s~0YWd ƒn1sž0Yt  | d¡}t  | d¡}t  | dd¡}t|d}d|_tj } g}!t ¡}"|"|_d |_z$zê| ¡D] }#|#j}$t|$tƒr,|$}%n |$ d ¡}%|  |%¡rFq||%}|drxt!|#j"ƒ|dkrxt#d|%ƒ‚|drð|d dd¡\}&}'| |$¡}| $¡}(Wd ƒn1sÀ0Y| %|(|&¡\})}*|*|'krðt#d|$ƒ‚|r|% &||f¡rt' (d |%¡q|% &|¡o,|% )d!¡ }+|% &|¡rd|% d"d¡\})},}-tj ||,t*|-ƒ¡}.n$|%| |fvrvqtj |t*|%ƒ¡}.|+sŽ| |$¡}| +||.¡Wd ƒn1s¼0Y|! ,|.¡|s:|dr:t|.d#ƒ>}| $¡}(| %|(|&¡\})}/|/|*krt#d$|.ƒ‚Wd ƒn1s00Y| r|. )d%¡rz|j-|.|d&}0|! ,|0¡Wn"t.yŠt'j/d'dd(Yn0nŠtj 0t*|$ƒ¡}1tj |"|1¡}2| |$¡}| +||2¡Wd ƒn1sÚ0Ytj |.¡\}3}1|3|_| 1|1¡}4| 2|4¡|! 3|4¡q|r4t' (d)¡d }5nœd }6|j4d }|d*kr.t  | d+¡}7z´| |7¡}t5|ƒ}8Wd ƒn1s„0Yi}6d,D]r}9d-|9}:|:|8vr–i|6d.|9<};|8|: 6¡D]<}|6 d7i¡}?|>sÐ|?rp| dd¡}@tj <|@¡sòt=d8ƒ‚|@|_|> >¡D]*\}:}¡D],\}:}a~ Install a wheel to the specified paths. If kwarg ``warner`` is specified, it should be a callable, which will be called with two tuples indicating the wheel version of this software and the wheel version in the file, if there is a discrepancy in the versions. This can be used to issue any warnings to raise any exceptions. If kwarg ``lib_only`` is True, only the purelib/platlib files are installed, and the headers, scripts, data and dist-info metadata are not written. If kwarg ``bytecode_hashed_invalidation`` is True, written bytecode will try to use file-hash based invalidation (PEP-552) on supported interpreter versions (CPython 2.7+). The return value is a :class:`InstalledDistribution` instance unless ``options.lib_only`` is True, in which case the return value is ``None``. ÚwarnerÚlib_onlyFZbytecode_hashed_invalidationrsrÑrtr“r»rurvNrwr#rcSsg|] }t|ƒ‘qSr.rxrzr.r.r/r}ør6z!Wheel.install..zRoot-Is-PurelibrÐrÎrÏ©Ústreamrr(rÒ)Údry_runTrúsize mismatch for %sú=údigest mismatch for %szlib_only: skipping %srÓr1rºzdigest mismatch on write for %sz.py)Zhashed_invalidationzByte-compilation failed)Úexc_infozlib_only: returning Nonez1.0zentry_points.txt)ZconsoleÚguiz %s_scriptszwrap_%sz%s:%sz [%s]ú,zAUnable to read legacy script metadata, so cannot generate scriptsrBzpython.commandsz8Unable to read JSON metadata, so cannot generate scriptsZ wrap_consoleZwrap_guizValid script path not specifiedz%s = %srùÚlibÚprefixzinstallation failed.)Grôrßr8rIr,rdrgrerfrƒrrr€rr„rrkr‚rårrÚrecordrLÚdont_write_bytecodeÚtempfileÚmkdtempZ source_dirZ target_dirÚinfolistÚ isinstancer r®rïÚstrÚ file_sizerr¼r°Ú startswithrÈrÉrârZ copy_streamr+Z byte_compileÚ ExceptionÚwarningÚbasenameZmakeZset_executable_modeÚextendrorÚvaluesrüÚsuffixÚflagsÚjsonÚloadràr†Úitemsr r”Zwrite_shared_locationsZwrite_installed_filesÚshutilÚrmtreeÚ exceptionZrollback)Cr>rÍZmakerÚkwargsrôrðrñZbc_hashed_invalidationrAr‡rçrˆÚ metadata_nameÚwheel_metadata_nameÚ record_namer‰rŠÚbwfr‘r•rŒrr¾r´rÚreaderr¸r¶Zdata_pfxZinfo_pfxZ script_pfxZfileopZbcZoutfilesÚworkdirÚzinforîÚ u_arcnameÚkindÚvaluer¢r"r«Z is_scriptÚwhererëZoutfileZ newdigestZpycrŽZworknamerìÚ filenamesÚdistÚcommandsZepZepdatarÛrEr$rFÚsZconsole_scriptsZ gui_scriptsZ script_dirZscriptÚoptionsr.r.r/ÚinstallÒsX        &    L      ÿ  ( ÿ   ÿ  ,   þ&ÿÿ ,       (  .           ÿ ú  z Wheel.installcCs8tdur4tj tƒtdƒdtjdd…¡}t|ƒatS)Nz dylib-cachez%s.%sr) Úcacher8rIr,rrrLÚ version_infor)r>rµr.r.r/Ú_get_dylib_cache¸s ÿzWheel._get_dylib_cachec Cs”tj |j|j¡}d|j|jf}d|}t |d¡}t  d¡}g}t |dƒ.}z|  |¡æ}||ƒ} t   | ¡} | ¡} |  |¡} tj | j| ¡} tj | ¡s¬t | ¡|  ¡D]‚\}}tj | t|ƒ¡}tj |¡sàd}n6t |¡j}tj |¡}| |¡}tj|jŽ}||k}|r(| || ¡| ||f¡q´Wdƒn1sN0YWntynYn0Wdƒn1s†0Y|S)NrsrtZ EXTENSIONSrurvT)r8rIr,rdrgrerfrƒrr€rr„r rr'Z prefix_to_dirrµràÚmakedirsrrrqÚstatÚst_mtimeÚdatetimeZ fromtimestampZgetinfoZ date_timeÚextractr+r…)r>rAr‡rˆrîr‰rJrŠrr‘rBr%rüZ cache_baserer³Údestr,Z file_timeroZ wheel_timer.r.r/Ú_get_extensionsÁs>             4&zWheel._get_extensionscCst|ƒS)zM Determine if a wheel is compatible with the running system. )Ú is_compatibler=r.r.r/r/ãszWheel.is_compatiblecCsdS)zP Determine if a wheel is asserted as mountable by its metadata. Tr.r=r.r.r/Ú is_mountableészWheel.is_mountablecCs´tj tj |j|j¡¡}| ¡s2d|}t|ƒ‚| ¡sJd|}t|ƒ‚|t jvrbt   d|¡nN|rtt j  |¡nt j  d|¡| ¡}|r°tt jvr¤t j  t¡t ||¡dS)Nz)Wheel %s not compatible with this Python.z$Wheel %s is marked as not mountable.z%s already in pathr)r8rIrmr,rdrgr/rr0rLrÈrÉr+Úinsertr.Ú_hookÚ meta_pathrC)r>r+rAÚmsgrBr.r.r/Úmountïs"   z Wheel.mountcCsrtj tj |j|j¡¡}|tjvr2t d|¡nrAr.r.r/Úunmounts     z Wheel.unmountc Csrtj |j|j¡}d|j|jf}d|}d|}t |t¡}t |d¡}t |d¡}t   d¡}t |dƒð} |   |¡ } || ƒ} t | ƒ} Wdƒn1sž0Y| d d d ¡} td d „| Dƒƒ}i}|   |¡V}t|d *}|D]}|d}|||<qêWdƒn1s0YWdƒn1s60Y|  ¡D]}|j}t|tƒrf|}n | d¡}| d¡}d|vrtd|ƒ‚| |¡r qH||}|drÒt|jƒ|dkrÒtd|ƒ‚|d rH|d  dd ¡\}}|   |¡}| ¡}Wdƒn1s0Y| ||¡\}}||krHtd|ƒ‚qHWdƒn1sd0YdS)NrsrÑrtr“r»rurvrwr#rcSsg|] }t|ƒ‘qSr.rxrzr.r.r/r}!r6z Wheel.verify..ròrr1ú..úinvalid entry in wheel: %rrrõrör÷)r8rIr,rdrgrerfrƒrrr€rr„rrkr‚rrrr r®rrïrrr¼r°)r>rAr‡rçrˆrrrr‰rŠrr‘r•rŒrr´rrr¸r¶rrîrrrr¢r"r«r.r.r/rns\     &  J    ÿ ÿ  ( ÿz Wheel.verifyc Ksdd„}dd„}tj |j|j¡}d|j|jf}d|}t |d¡} tƒ¢} t |dƒ†} i} |   ¡D]h} | j}t |t ƒr‚|}n |  d ¡}|| kr–qhd |vrªtd |ƒ‚|  | | ¡tj | t|ƒ¡}|| |<qhWd ƒn1sæ0Y|| |ƒ\}}|| fi|¤Ž}|râ|| |ƒ\}}|r<||kr<|||ƒ|d urftjd d| d\}}t |¡n*tj |¡s€td|ƒ‚tj ||j¡}t|  ¡ƒ}tj | |¡}||f}| || |¡| ||¡|d urât ||¡Wd ƒn1sø0Y|S)a‘ Update the contents of a wheel in a generic way. The modifier should be a callable which expects a dictionary argument: its keys are archive-entry paths, and its values are absolute filesystem paths where the contents the corresponding archive entries can be found. The modifier is free to change the contents of the files pointed to, add new entries and remove entries, before returning. This method will extract the entire contents of the wheel to a temporary location, call the modifier, and then use the passed (and possibly updated) dictionary to write a new wheel. If ``dest_dir`` is specified, the new wheel is written there -- otherwise, the original wheel is overwritten. The modifier should return True if it updated the wheel, else False. This method returns the same value the modifier returns. cSsHd}}d|tf}||vr$d|}||vr@||}t|dj}||fS)Nz%s/%sz %s/PKG-INFO©rI)rr rf)Úpath_maprˆrfrIrÛr.r.r/Ú get_versionYs  z!Wheel.update..get_versioncSsÞd}z|t|ƒ}| d¡}|dkr*d|}nTdd„||dd… d¡Dƒ}|dd7<d |d|…d d d „|Dƒ¡f}Wntyžt d |¡Yn0|rÚt|d }||_|  t ¡}|j ||dt d||¡dS)Nr!rz%s+1cSsg|] }t|ƒ‘qSr.rx)r{r"r.r.r/r}kr6z8Wheel.update..update_version..rr#r—z%s+%scss|]}t|ƒVqdSr2)rrzr.r.r/Ú nr6z7Wheel.update..update_version..z0Cannot update non-compliant (PEP-440) version %rr9)rIÚlegacyzVersion updated from %r to %r) rr¡rkr,rrÈrÉr rfrârrÊ)rfrIÚupdatedrFr|r-Zmdr=r.r.r/Úupdate_versioncs.    ÿ  ÿ   ÿz$Wheel.update..update_versionrsrtr»rvrur7r8Nz.whlz wheel-update-)r rüÚdirzNot a directory: %r)r8rIr,rdrgrerfrƒrrrrr r®rr,rrÿÚmkstempÚcloseràr±rrÄrËrÚcopyfile)r>ÚmodifierZdest_dirrr;r?rAr‡rˆrrrŠr:rrîrrIZoriginal_versionr"ZmodifiedZcurrent_versionÚfdÚnewpathr¿rÀror.r.r/r@Hs\       ÿ (  þ      ,z Wheel.update)NFF)N)NN)F)N)rUrVrWÚ__doc__rår§r?Úpropertyrgrqrrrr’rror¤r°r¹rÄrËrírïr$r'r.r/r0r5r6rnr@r.r.r.r/rX‰s@ )        tg "  8rXc Csxtg}td}ttjddddƒD]}| d |t|ƒg¡¡q$g}t ¡D]*\}}}|  d¡rN| |  dd¡d¡qN|  ¡t dkr–|  dt ¡| d¡g}tg}tjd krŽt d t¡}|rŽ| ¡\} }}} t|ƒ}| g} | d vrø|  d ¡| d vr |  d¡| dvr |  d¡| dvr4|  d¡| dvrH|  d¡|dkrŽ| D]*} d| ||| f} | tkrV| | ¡qV|d8}qH|D]0}|D]$} | d t|df¡|| f¡qšq’t|ƒD]L\}}| d t|f¡ddf¡|dkrÌ| d t|df¡ddf¡qÌt|ƒD]L\}}| d d|f¡ddf¡|dkr"| d d|df¡ddf¡q"t|ƒS)zG Return (pyver, abi, arch) tuples compatible with this Python. rrr—r(z.abir#rrYÚdarwinz(\w+)_(\d+)_(\d+)_(\w+)$)Úi386ÚppcZfat)rJrKÚx86_64Zfat3)Úppc64rLZfat64)rJrLÚintel)rJrLrNrKrMÚ universalz %s_%s_%s_%srZr )r)ÚrangerLr&r+r,rrOZ get_suffixesrrkÚsortrÝr1rÞÚplatformÚrerir ryÚ IMP_PREFIXrãÚset)ZversionsÚmajorÚminorZabisr r"rJZarchesr%rerbÚmatchesrir"rar|rfr.r.r/Úcompatible_tags­s`                 & " "rYcCs\t|tƒst|ƒ}d}|dur"t}|D]0\}}}||jvr&||jvr&||jvr&d}qXq&|S)NFT)rrXÚCOMPATIBLE_TAGSr`rarb)ZwheelrrrJÚverrarbr.r.r/r/ðs r/)N)UZ __future__rr¬rr+Zdistutils.utilZ distutilsZemailrr©rOr Úloggingr8rƒrSrrLrÿrÆr(rrÚcompatrrr r r Zdatabaser r’r rrrÚutilrrrrrrrrrrfrrÚ getLoggerrUrÈr%ÚhasattrrTrRrr*r)r&r_rÜZ get_platformr7rÞrÝr0ÚcompileÚ IGNORECASEÚVERBOSErlrhršrŸržrr9r²Úobjectr:r2rXrYrZr/r.r.r.r/ÚsŠ   ,       ø  ü    #*>