o Ec@sddlmZddlZddlZddlZddlmZddlZddlZddl Z ddl Z ddl Z ddl Z ddl Z ddlZddlZddlZddlZddlmZmZddlmZmZmZmZmZddlmZddlmZmZm Z m!Z!dd l"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+m,Z,dd l-m.Z.m/Z/e 0e1Z2da3e4ed rd Z5nej67d rdZ5n ej6dkrdZ5ndZ5e8dZ9e9sdej:ddZ9de9Z;e5e9Ze8dZ?e?re?7dre?=dd@ddZ?nddZAeAZ?[Ae Bde jCe jDBZEe Bde jCe jDBZFe BdZGe Bd ZHd!ZId"ZJe jKd#krd$d%ZLnd&d%ZLGd'd(d(eMZNeNZOGd)d*d*eMZPd+d,ZQd-d.ZReRZS[Rd1d/d0ZTdS)2)unicode_literalsN)message_from_file) __version__DistlibException) sysconfigZipFilefsdecode text_typefilter)InstalledDistribution)MetadataMETADATA_FILENAMEWHEEL_METADATA_FILENAMELEGACY_METADATA_FILENAME) FileOperator convert_path CSVReader CSVWriterCachecached_propertyget_cache_base read_exportstempdir get_platform)NormalizedVersionUnsupportedVersionErrorZpypy_version_infoZppjavaZjyZcliZipcpZpy_version_nodotz%s%spy-_.ZSOABIzcpython-cCsRdtg}tdr|dtdr|dtddkr$|dd |S) NrZPy_DEBUGdZ WITH_PYMALLOCmZPy_UNICODE_SIZEu) VER_SUFFIXrget_config_varappendjoin)partsr.L/opt/alt/python310/lib/python3.10/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|SNr.or.r.r/^sr5cCs|tjdS)Nr1)replaceossepr3r.r.r/r5`sc@s6eZdZddZddZddZd dd Zd d ZdS) MountercCsi|_i|_dSr2) impure_wheelslibsselfr.r.r/__init__ds zMounter.__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=r@rAkvr.r.r/removels   zMounter.removeNcCs||jvr |}|Sd}|Sr2)r;)r=fullnamepathresultr.r.r/ find_modulers zMounter.find_modulecCsl|tjvr tj|}|S||jvrtd|t||j|}||_|dd}t|dkr4|d|_ |S)Nzunable to find extension for %sr#rr) sysmodulesr; ImportErrorimpZ load_dynamic __loader__rsplitlen __package__)r=rGrIr-r.r.r/ load_moduleys      zMounter.load_moduler2)__name__ __module__ __qualname__r>rBrFrJrSr.r.r.r/r9cs   r9c@seZdZdZdZdZd4ddZedd Zed d Z ed d Z e ddZ ddZ e ddZddZd5ddZddZddZddZd6ddZd d!Zd"d#Zd$d%Zd&d'Zd(d)Zd*d+Zd7d,d-Zd.d/Zd0d1Zd5d2d3ZdS)8Wheelz@ Class to build and install from Wheel files (PEP 427). )rrZsha256NFcCs<||_||_d|_tg|_dg|_dg|_t|_ |dur*d|_ d|_ |j |_ dSt|}|rO|d}|d|_ |dd d |_ |d |_|j |_ dStj|\}}t|}|sdtd ||rmtj||_ ||_ |d}|d|_ |d|_ |d |_|d d|_|dd|_|dd|_dS)zB Initialise an instance using a (valid) filename. r(noneanyNZdummyz0.1ZnmZvnr"r!ZbnzInvalid name or filename: %rr r#ZbiZar)signZ should_verifybuildverPYVERpyverabiarchr7getcwddirnamenameversionfilenameZ _filenameNAME_VERSION_REmatch groupdictr6rHsplit FILENAME_RErabspath)r=rdrZverifyr%inforar.r.r/r>sD            zWheel.__init__cCs^|jr d|j}nd}d|j}d|j}d|j}|jdd}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]r^r_rcr6rb)r=r[r]r^r_rcr.r.r/rds     zWheel.filenamecCstj|j|j}tj|Sr2)r7rHr,rardisfile)r=rHr.r.r/existss z Wheel.existsccs6|jD]}|jD]}|jD]}|||fVqq qdSr2)r]r^r_)r=r]r^r_r.r.r/tagss   z Wheel.tagsc Cs2tj|j|j}d|j|jf}d|}td}t |dp}| |}|d dd}t dd |D}t tg} d} | D]=} z2t|| } || } || }t|d } | rb WdWnWdn1slwYWq>ty{Yq>w| std d | Wd| S1swY| S) N%s-%s %s.dist-infoutf-8r Wheel-Versionr#rcSg|]}t|qSr.int.0ir.r.r/ z"Wheel.metadata..)Zfileobjz8Invalid wheel, because metadata is missing: looked in %sz, )r7rHr,rardrbrccodecs getreaderrget_wheel_metadatarhtuplerr posixpathopenr KeyError ValueError)r=r@name_verinfo_dirwrapperzfwheel_metadatawv file_versionZfnsrIfnmetadata_filenamebfwfr.r.r/metadatasD        zWheel.metadatacCsrd|j|jf}d|}t|d}||}td|}t|}Wdt|S1s0wYt|S)NrprqWHEELrr) rbrcrr,rr}r~rdict)r=rrrrrrmessager.r.r/rs    zWheel.get_wheel_metadatacCsLtj|j|j}t|d}||}Wd|S1swY|S)Nrs)r7rHr,rardrr)r=r@rrIr.r.r/rls   z Wheel.infoc Cst|}|r?|}|d|||d}}d|vr!t}nt}t|}|r3d|d}nd}||}||}|S|d}|d} |dksQ|| krTd} n|||dd krad } nd} t| |}|S) Nspythonw   rrs ) SHEBANG_RErfendlowerSHEBANG_PYTHONWSHEBANG_PYTHONSHEBANG_DETAIL_REgroupsfind) r=datar%rZshebangZdata_after_shebangZshebang_pythonargsZcrZlfZtermr.r.r/process_shebangs.     zWheel.process_shebangcCsb|dur|j}ztt|}Wn tytd|w||}t|d d}||fS)NzUnsupported hash algorithm: %r=ascii) hash_kindgetattrhashlibAttributeErrorrdigestbase64Zurlsafe_b64encoderstripdecode)r=rrhasherrIr.r.r/get_hash%s   zWheel.get_hashcCslt|}ttj||}||ddft|}|D]}||qWddS1s/wYdS)Nr()listto_posixr7rHrelpathr+rZwriterow)r=recordsZ record_pathbasepwriterrowr.r.r/ write_record0s  "zWheel.write_recordc Csg}|\}}tt|j}|D]2\}} t| d } | } Wdn1s&wYd|| } tj| } | || | fqtj |d} | || |t tj |d}| || fdS)Nrbz%s=%sRECORD) rrrrreadrr7rHgetsizer+r,rr)r=rllibdir archive_pathsrdistinforraprfrrsizer.r.r/ write_records8s     zWheel.write_recordscCs\t|dtj}|D]\}}td|||||q WddS1s'wYdS)NwzWrote %s to %s in wheel)rzipfileZ ZIP_DEFLATEDloggerdebugwrite)r=r@rrrrr.r.r/ build_zipHs  "zWheel.build_zipc" s|duri}ttfdddd}|dkr#d}tg}tg}tg}n d}tg}d g}d g}|d ||_|d ||_|d ||_ |} d|j |j f} d| } d| } g} dD]}|vrbq[|}t j |rt |D]l\}}}|D]d}tt j ||}t j ||}tt j | ||}| ||f|dkr|dst|d }|}Wdn1swY||}t|d }||Wdn1swYqxqqq[| }d}t |D]W\}}}||krt|D]\}}t|}|drt j ||}||=nq|sJd|D]$}t|dr&qt j ||}tt j ||}| ||fqqt |}|D]!}|dvrgtt j ||}tt j | |}| ||fqGd|po|jdtd|g}|jD]\}}}|d|||fq{t j |d}t|d}|d |Wdn 1swYtt j | d}| ||fd!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.r3pathsr.r/r5VszWheel.build..)purelibplatlibrrZfalsetruerXrYr]r^r_rp%s.datarq)rZheadersscriptsr.exerwb .dist-infoz(.dist-info directory expected, not found)z.pycz.pyo)rZ INSTALLERZSHAREDrzWheel-Version: %d.%dzGenerator: distlib %szRoot-Is-Purelib: %sz Tag: %s-%s-%srr cSs*|d}|d}d|vr|d7}||fS)Nrr1ri')count)trnr.r.r/sorters  zWheel.build..sorter)key)$rr IMPVERABIARCHr\getr]r^r_rbrcr7rHisdirwalkr r,rrr+endswithrrrr enumeratelistdir wheel_versionrrosortedrrardr)"r=rrorZlibkeyZis_pureZ default_pyverZ default_abiZ default_archrrdata_dirrrrrHrootdirsfilesrrrprrrrrzdnrr]r^r_rr@r.rr/buildNs             z Wheel.buildcCs |dS)zl Determine whether an archive entry should be skipped when verifying or installing. )r1z /RECORD.jws)r)r=arcnamer.r.r/ skip_entrys zWheel.skip_entrycC KsP|j}|d}|dd}|dd}tj|j|j}d|j|jf} d| } d| } t | t } t | d} t | d }t d }t |d }|| }||}t|}Wd n1scwY|d dd}tdd|D}||jkr|r||j||ddkr|d}n|d}i}||*}t|d}|D] }|d}|||<qWd n1swYWd n1swYt | d}t | d}t | dd}t|d}d|_tj } g}!t}"|"|_d |_zz|D]}#|#j}$t|$tr|$}%n|$d }%| |%rq||%}|dr6t!|#j"|dkr6t#d|%|drr|ddd\}&}'||$ }|$}(Wd n 1sZwY|%|(|&\})}*|*|'krrt#d|$|r|%&||frt'(d |%q|%&|o|%)d! }+|%&|r|%d"d\})},}-tj||,t*|-}.n|%| |fvrqtj|t*|%}.|+sU||$}|+||.Wd n 1swYtjd#krt,|.|#j-d$?d%@|!.|.|s(|dr(t|.d&}|$}(|%|(|&\})}/|/|*krt#d'|.Wd n 1s#wY| rS|.)d(rSz|j/|.|d)}0|!.|0Wqt0yRt'j1d*dd+Yqwqtj2t*|$}1tj|"|1}2||$}|+||2Wd n 1s{wYtj|.\}3}1|3|_|3|1}4|4|4|!5|4q|rt'(d,d }5nMd }6|j6d }|d-kr$t | d.}7zZ||7 }t7|}8Wd n 1swYi}6d/D]9}9d0|9}:|:|8vri|6d1|9<};|8|:8D]}|6d:i}?|>su|?r|dd}@tj>|@st?d;|@|_|>@D]\}:}<|5C||}|r|!.||5D|!|d?||5WWtEF|"Wd St0yt'Gd@|HwtEF|"w1s!wYd S)Aa~ 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``. warnerlib_onlyFZbytecode_hashed_invalidationrprrqrrrrrsNrtr#rcSrur.rvrxr.r.r/r{r|z!Wheel.install..zRoot-Is-Purelibrrrstreamrr(r)dry_runTrsize mismatch for %s=digest mismatch for %szlib_only: skipping %srr1posixirzdigest mismatch on write for %sz.py)Zhashed_invalidationzByte-compilation failed)exc_infozlib_only: returning Nonez1.0zentry_points.txt)Zconsoleguiz %s_scriptszwrap_%sz%s:%sz [%s],zAUnable to read legacy script metadata, so cannot generate scriptsrAzpython.commandsz8Unable to read JSON metadata, so cannot generate scriptsZ wrap_consoleZwrap_guizValid script path not specifiedz%s = %srlibprefixzinstallation failed.)Irrr7rHr,rardrbrcrrr}r~rrrrhrrrrrecordrKdont_write_bytecodetempfileZmkdtempZ source_dirZ target_dirinfolist isinstancer rrstr file_sizerrr startswithrrrrZ copy_streamchmodZ external_attrr+Z byte_compile ExceptionZwarningbasenameZmakeZset_executable_modeextendrlrvaluesrsuffixflagsjsonloadrritemsr rZwrite_shared_locationsZwrite_installed_filesshutilZrmtree exceptionZrollback)Cr=rZmakerkwargsrrrZbc_hashed_invalidationr@rrr metadata_namewheel_metadata_name record_namerrbwfrrrrrrrreaderrrZdata_pfxZinfo_pfxZ script_pfxZfileopZbcZoutfilesworkdirzinfor u_arcnamekindvaluerr"rZ is_scriptwhererZoutfileZ newdigestZpycrZworknamer filenamesZdistZcommandsZepZepdatarrDr$rEsZconsole_scriptsZ gui_scriptsZ script_dirZscriptoptionsr.r.r/installs                                                            F  z Wheel.installcCs8tdurtjttddtjdd}t|atS)Nz dylib-cachez%s.%sr) cacher7rHr,rrrK version_infor)r=rr.r.r/_get_dylib_caches zWheel._get_dylib_cachec Cstj|j|j}d|j|jf}d|}t|d}t d}g}t |d}z| |r}||} t | } |} | |} tj| j| } tj| sTt| | D]@\}}tj| t|}tj|snd}nt|j}tj|}||}tj|j}||k}|r||| |||fqXWdn1swYWn tyYn wWd|SWd|S1swY|S)NrprqZ EXTENSIONSrrrsT)r7rHr,rardrbrcrr}r~rrr r r#Z prefix_to_dirrrmakedirsrrrnstatst_mtimedatetimeZ fromtimestampZgetinfoZ date_timeextractr+r)r=r@rrrrrIrrrrAr!rZ cache_baserbrdestr(Z file_timerlZ wheel_timer.r.r/_get_extensionssT                 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_mountableszWheel.is_mountablecCstjtj|j|j}|sd|}t||s%d|}t||t jvr2t d|dS|r;t j |nt j d||}|r[tt jvrSt j tt||dSdS)Nz)Wheel %s not compatible with this Python.z$Wheel %s is marked as not mountable.z%s already in pathr)r7rHrjr,rardr+rr,rKrrr+insertr*_hook meta_pathrB)r=r+r@msgrAr.r.r/mounts$   z Wheel.mountcCs|tjtj|j|j}|tjvrtd|dStj ||t j vr*t |t j s:t tj vr.rrr1..invalid entry in wheel: %rrrrr)r7rHr,rardrbrcrrr}r~rrrrhrrrrr rrrrrrr)r=r@rrrrrrrrrrrrrrrrrrrrrrrrr"rr.r.r/rksn                   $z Wheel.verifyc Ksdd}dd}tj|j|j}d|j|jf}d|}t|d} t} t |dC} i} | D]4} | j}t |t r@|}n| d }|| krJq3d |vrTtd || | | tj| t|}|| |<q3Wd n1srwY|| |\}}|| fi|}|r|| |\}}|r||kr||||d urtjd d| d\}}t|ntj|std|tj||j}t| }tj| |}||f}||| |||||d urt||Wd |SWd |SWd |S1swY|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}||vrd|}||vr ||}t|dj}||fS)Nz%s/%sz %s/PKG-INFOrH)rr rc)path_maprrcrHrr.r.r/ get_version`s  z!Wheel.update..get_versioncSsd}z>t|}|d}|dkrd|}n*dd||dddD}|dd7<d |d|dd d |Df}WntyOtd |Ynw|rot|d }||_| t }|j ||dtd||dSdS)Nr!rz%s+1cSrur.rv)ryrr.r.r/r{rr|z8Wheel.update..update_version..rr#rz%s+%scss|]}t|VqdSr2)rrxr.r.r/ usz7Wheel.update..update_version..z0Cannot update non-compliant (PEP-440) version %rr5)rHlegacyzVersion updated from %r to %r) rrrhr,rrrr rcrrr)rcrHupdatedrErzr-Zmdr9r.r.r/update_versionjs4       z$Wheel.update..update_versionrprqrrsrrr3r4Nz.whlz wheel-update-)r rdirzNot a directory: %r)r7rHr,rardrbrcrrrrrr rrr(rrZmkstempcloserrrrrrZcopyfile)r=ZmodifierZdest_dirrr7r;r@rrrrrr6rrrrHZoriginal_versionr"ZmodifiedZcurrent_versionfdnewpathrrrlr.r.r/r?Osr                - - --z Wheel.update)NFFr2)NN)F)rTrUrV__doc__rrr>propertyrdrnrorrrrlrrrrrrrr r#r*r+r,r1r2rkr?r.r.r.r/rWsB )        tn "  8rWcCsZddl}|}g}|ddkr+|ddD]}||r#t|ndqt|}|S)NrZglibcrr#)platformZlibc_verrhr+isdigitrwr)rBverrIrr.r.r/_get_glibc_versions rEc CsRtg}td}ttjddddD]}|d|t|gqg}tD]\}}}| dr<|| dddq'| t dkrK| dt |dg}tg}tjd krtd t}|r|\} }}} t|}| g} | d vrz| d | d vr| d| dvr| d| dvr| d| dvr| d|dkr| D]} d| ||| f} | tkr|| q|d8}|dks|D]}|D]} |dt|df|| f|dkrMtj drM| dd} t}t|dkrM|dkr |dt|df|d| f|dkr|dt|df|d| f|dkr5|dt|df|d| f|dt|df|d|d|d| ffqqt|D]&\}}|dt|fddf|dkrx|dt|dfddfqSt|D]&\}}|dd |fddf|dkr|dd |dfddfq~t|S)!zG Return (pyver, abi, arch) tuples compatible with this Python. rrrr(z.abir#rrXdarwinz(\w+)_(\d+)_(\d+)_(\w+)$)i386ppcZfat)rGrHx86_64Zfat3)ppc64rIZfat64)rGrIintel)rGrIrKrHrJZ universalz %s_%s_%s_%sZlinuxZlinux_)rz manylinux1_%s)r zmanylinux2010_%s)rzmanylinux2014_%szmanylinux_%s_%s_%srYr )r)rangerKr"r+r,rrNZ get_suffixesrrhsortrr-rrBrerfrrw IMP_PREFIXr6rErQrset)ZversionsmajorminorZabisr r"rIZarchesr%rbr_Zmatchesrfrr^r-rzrcr.r.r/compatible_tagss                 rVcCs^t|ts t|}d}|durt}|D]\}}}||jvr,||jvr,||jvr,d}|Sq|S)NFT)rrWCOMPATIBLE_TAGSr]r^r_)ZwheelrorIrDr^r_r.r.r/r+s r+r2)UZ __future__rrr}r'ZemailrrrNr Zloggingr7rrQrrKrrr(rrcompatrrr r r Zdatabaser rr rrrutilrrrrrrrrrrrcrrZ getLoggerrTrr!hasattrrRrBrr*r)r"r\rr6rrrhr0compile IGNORECASEVERBOSErirerrrrr8robjectr9r.rWrErVrWr+r.r.r.r/s   0             #1 P