3 Bu_@sddlmZddlZddlZddlZddlZddlmZddl 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 j1e2Z3da4e5ed rj?ddj?ddZ@ej9dZAeAreAj8dreAj?ddZAnddZBeBZA[BejCdejDejEBZFejCdejDejEBZGejCdZHejCd ZId!ZJd"ZKe jLd#krFd$d%ZMnd&d%ZMGd'd(d(eNZOeOZPGd)d*d*eNZQd+d,ZReRZS[Rd/d-d.ZTdS)0)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)NormalizedVersionUnsupportedVersionErrorpypy_version_infoppjavajycliipcppy_version_nodotz%s%spy-_.SOABIzcpython-cCsRdtg}tjdr|jdtjdr0|jdtjddkrH|jdd j|S) Nr"Py_DEBUGd WITH_PYMALLOCmPy_UNICODE_SIZEu) VER_SUFFIXrget_config_varappendjoin)partsr7/builddir/build/BUILDROOT/alt-python36-pip-20.2.4-1.el7.x86_64/opt/alt/python36/lib/python3.6/site-packages/pip/_vendor/distlib/wheel.py _derive_abi<s     r9zz (?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)Nr7)or7r7r8^sr<cCs|jtjdS)Nr:)replaceossep)r;r7r7r8r<`sc@s6eZdZddZddZddZd dd Zd d ZdS) MountercCsi|_i|_dS)N) impure_wheelslibs)selfr7r7r8__init__dszMounter.__init__cCs||j|<|jj|dS)N)rArBupdate)rCpathname extensionsr7r7r8addhs z Mounter.addcCs4|jj|}x"|D]\}}||jkr|j|=qWdS)N)rApoprB)rCrFrGkvr7r7r8removels  zMounter.removeNcCs||jkr|}nd}|S)N)rB)rCfullnamepathresultr7r7r8 find_modulers zMounter.find_modulecCsj|tjkrtj|}nP||jkr,td|tj||j|}||_|jdd}t|dkrf|d|_ |S)Nzunable to find extension for %sr(rr) sysmodulesrB ImportErrorimpZ load_dynamic __loader__rsplitlen __package__)rCrMrOr6r7r7r8 load_moduleys       zMounter.load_module)N)__name__ __module__ __qualname__rDrHrLrPrYr7r7r7r8r@cs  r@c@seZdZdZd4ZdZd5ddZedd Zed d Z ed d Z e ddZ ddZ e ddZddZd6ddZddZddZddZd7ddZd d!Zd"d#Zd$d%Zd&d'Zd(d)Zd*d+Zd8d,d-Zd.d/Zd0d1Zd9d2d3ZdS):Wheelz@ Class to build and install from Wheel files (PEP 427). rsha256NFcCs8||_||_d|_tg|_dg|_dg|_tj|_ |dkrRd|_ d|_ |j |_ ntj|}|r|jd}|d|_ |djd d |_ |d |_|j |_ ntjj|\}}tj|}|std ||rtjj||_ ||_ |jd}|d|_ |d|_ |d |_|d jd|_|djd|_|djd|_dS)zB Initialise an instance using a (valid) filename. r1noneanyNdummyz0.1nmZvnr'r&ZbnzInvalid name or filename: %rr%r(Zbiar)signZ should_verifybuildverPYVERpyverabiarchr>getcwddirnamenameversionfilename _filenameNAME_VERSION_REmatch groupdictr=rNsplit FILENAME_RErabspath)rCrnrdverifyr-inforkr7r7r8rDsB            zWheel.__init__cCs^|jrd|j}nd}dj|j}dj|j}dj|j}|jjdd}d|j|||||fS)zJ Build and return a filename from the various components. r&r1r(r'z%s-%s%s-%s-%s-%s.whl)rer5rgrhrirmr=rl)rCrergrhrirmr7r7r8rns     zWheel.filenamecCstjj|j|j}tjj|S)N)r>rNr5rkrnisfile)rCrNr7r7r8existssz Wheel.existsccs@x:|jD]0}x*|jD] }x|jD]}|||fVq WqWqWdS)N)rgrhri)rCrgrhrir7r7r8tagss   z Wheel.tagscCstjj|j|j}d|j|jf}d|}tjd}t |d}|j |}|dj dd}t dd |D}t tg} d} x`| D]X} y>tj|| } |j| } || }t|d } | rPWdQRXWq~tk rYq~Xq~W| std d j| WdQRX| S) Nz%s-%sz %s.dist-infozutf-8rz Wheel-Versionr(rcSsg|] }t|qSr7)int).0ir7r7r8 sz"Wheel.metadata..)fileobjz8Invalid wheel, because metadata is missing: looked in %sz, )r>rNr5rkrnrlrmcodecs getreaderrget_wheel_metadatarstuplerr posixpathopenr KeyError ValueError)rCrFname_verinfo_dirwrapperzfwheel_metadatawv file_versionfnsrOfnmetadata_filenamebfwfr7r7r8metadatas0        zWheel.metadatac CsXd|j|jf}d|}tj|d}|j|}tjd|}t|}WdQRXt|S)Nz%s-%sz %s.dist-infoWHEELzutf-8) rlrmrr5rrrrdict)rCrrrrrrmessager7r7r8rs  zWheel.get_wheel_metadatac Cs6tjj|j|j}t|d}|j|}WdQRX|S)Nr{)r>rNr5rkrnrr)rCrFrrOr7r7r8rws z Wheel.infoc Cstj|}|r||j}|d|||d}}d|jkrBt}nt}tj|}|rfd|jd }nd}||}||}nT|jd}|jd} |dks|| krd} n|||dd krd } nd} t| |}|S) Nspythonw r  rr$s ) SHEBANG_RErqendlowerSHEBANG_PYTHONWSHEBANG_PYTHONSHEBANG_DETAIL_REgroupsfind) rCdatar-rshebangZdata_after_shebangZshebang_pythonargsZcrlfZtermr7r7r8process_shebangs,       zWheel.process_shebangc Csh|dkr|j}ytt|}Wn tk r<td|YnX||j}tj|jdj d}||fS)NzUnsupported hash algorithm: %r=ascii) hash_kindgetattrhashlibAttributeErrorrdigestbase64urlsafe_b64encoderstripdecode)rCrrhasherrOr7r7r8get_hash%s zWheel.get_hashc CsZt|}ttjj||}|j|ddft|}x|D]}|j|q:WWdQRXdS)Nr1)listto_posixr>rNrelpathr4rwriterow)rCrecords record_pathbasepwriterrowr7r7r8 write_record0s   zWheel.write_recordc Csg}|\}}tt|j}xX|D]P\}} t| d} | j} WdQRXd|j| } tjj| } |j || | fqWtjj |d} |j || |t tjj |d}|j || fdS)Nrbz%s=%sRECORD) rrrrreadrr>rNgetsizer4r5rr)rCrwlibdir archive_pathsrdistinforraprfrrsizer7r7r8 write_records8s   zWheel.write_recordsc CsJt|dtj2}x*|D]"\}}tjd|||j||qWWdQRXdS)NwzWrote %s to %s in wheel)rzipfile ZIP_DEFLATEDloggerdebugwrite)rCrFrrrrr7r7r8 build_zipHszWheel.build_zipc"s|dkr i}ttfddd(d}|dkrFd}tg}tg}tg}nd}tg}d g}d g}|jd ||_|jd ||_|jd ||_ |} d|j |j f} d| } d| } g} xd)D]}|krq|}t j j|rxt j|D]\}}}x|D]}tt j j||}t j j||}tt j j| ||}| j||f|dkr|jd rt|d}|j}WdQRX|j|}t|d}|j|WdQRXqWqWqW| }d}xt j|D]\}}}||kr"x@t|D]4\}}t|}|jdrt j j||}||=PqW|s"tdxP|D]H}t|jd*r@q(t j j||}tt j j||}| j||fq(WqWt j|}xJ|D]B}|d+krtt j j||}tt j j| |}| j||fqWd|p|jd td!|g}x*|jD] \}}}|jd"|||fqWt j j|d}t|d#}|jd$j|WdQRXtt j j| d}| j||fd%d&} t | | d'} |j!|| f| | t j j|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|kS)Nr7)r;)pathsr7r8r<VszWheel.build..purelibplatlibrfalsetruer_r`rgrhriz%s-%sz%s.dataz %s.dist-inforheadersscriptsz.exerwbz .dist-infoz(.dist-info directory expected, not found.pyc.pyor INSTALLERSHAREDrzWheel-Version: %d.%dzGenerator: distlib %szRoot-Is-Purelib: %sz Tag: %s-%s-%sr cSs*|d}|jd}d|kr"|d7}||fS)Nrr:z .dist-infoi')count)trnr7r7r8sorters  zWheel.build..sorter)key)rr)rrr)rr)rrrr)%rr IMPVERABIARCHrfgetrgrhrirlrmr>rNisdirwalkr r5rrr4endswithrrrr enumerateAssertionErrorlistdir wheel_versionrrzsortedrrkrnr)"rCrrzrZlibkeyis_pureZ default_pyverZ default_abiZ default_archrrdata_dirrrrrNrootdirsfilesrrrprrrrr~dnrrgrhrirrFr7)rr8buildNs      "          z Wheel.buildcCs |jdS)zl Determine whether an archive entry should be skipped when verifying or installing. r: /RECORD.jws)r:r)r)rCarcnamer7r7r8 skip_entryszWheel.skip_entrycCIKsv|j}|jd}|jdd}|jdd}tjj|j|j}d|j|jf} d| } d| } t j| t } t j| d} t j| d }t j d }t |d }|j| }||}t|}Wd QRX|d jdd}tdd|D}||jkr|r||j||ddkr|d}n|d}i}|j|<}t|d&}x|D]}|d}|||<q:WWd QRXWd QRXt j| d}t j| d}t j| dd}t|d}d|_tj } g}!tj}"|"|_d |_zyhx|jD]}#|#j}$t|$tr|$}%n |$jd }%|j |%r q||%}|drD]v}9d.|9}:|:|8kri|6d/|9<};xL|8|:j6D]<}|6jd8i}?|>s"|?r|jdd}@tjj<|@sDt=d9|@|_x6|>j>D]*\}:}D],\}:}.zRoot-Is-Purelibrrr)streamrr1r)dry_runTr$zsize mismatch for %s=zdigest mismatch for %szlib_only: skipping %sz.exer:rzdigest mismatch on write for %sz.py)hashed_invalidationzByte-compilation failed)exc_infozlib_only: returning Nonez1.0zentry_points.txtconsoleguiz %s_scriptszwrap_%sz%s:%sz [%s],zAUnable to read legacy script metadata, so cannot generate scriptsrGzpython.commandsz8Unable to read JSON metadata, so cannot generate scriptsZ wrap_consoleZwrap_guizValid script path not specifiedz%s = %slibprefixzinstallation failed.)rr)Grrr>rNr5rkrnrlrmrrrrrrrrsrrrrrecordrQdont_write_bytecodetempfilemkdtemp source_dir target_dirinfolist isinstancer rrstr file_sizerrr startswithrrrr copy_streamr4 byte_compile Exceptionwarningbasenamemakeset_executable_modeextendrwrvaluesr suffixflagsjsonloadrritemsr rZwrite_shared_locationsZwrite_installed_files exceptionrollbackshutilrmtree)CrCrmakerkwargsrrrZbc_hashed_invalidationrFrrr metadata_namewheel_metadata_name record_namerrbwfrrrrrrrreaderrrZdata_pfxZinfo_pfxZ script_pfxfileopZbcoutfilesworkdirzinfor u_arcnamekindvaluerr'rZ is_scriptwhereroutfileZ newdigestZpycrZworknamer filenamesdistcommandsepZepdatarrJr+rKsconsole_scripts gui_scriptsZ script_dirscriptoptionsr7r7r8installsF             "                                         z Wheel.installcCs8tdkr4tjjttddtjdd}t|atS)Nz dylib-cachez%s.%sr$) cacher>rNr5rrrQ version_infor)rCrr7r7r8_get_dylib_caches zWheel._get_dylib_cachecCsltjj|j|j}d|j|jf}d|}tj|d}tj d}g}t |d}y|j |}||} t j | } |j} | j|} tjj| j| } tjj| stj| x| jD]\}}tjj| t|}tjj|sd}n6tj|j}tjj|}|j|}tj|j}||k}|r(|j|| |j||fqWWdQRXWntk r\YnXWdQRX|S)Nz%s-%sz %s.dist-infoZ EXTENSIONSzutf-8r{T)r>rNr5rkrnrlrmrrrrrr r!rC prefix_to_dirrrmakedirsr"rrystatst_mtimedatetime fromtimestampgetinfo date_timeextractr4r)rCrFrrrrrOrrrrGrAr Z cache_baserlrdestrLZ file_timerwZ wheel_timer7r7r8_get_extensionss>              zWheel._get_extensionscCst|S)zM Determine if a wheel is compatible with the running system. ) is_compatible)rCr7r7r8rOszWheel.is_compatiblecCsdS)zP Determine if a wheel is asserted as mountable by its metadata. Tr7)rCr7r7r8 is_mountableszWheel.is_mountablecCstjjtjj|j|j}|js2d|}t||jsJd|}t||t jkrbt j d|nN|rtt jj |nt jj d||j}|rtt jkrt jj ttj||dS)Nz)Wheel %s not compatible with this Python.z$Wheel %s is marked as not mountable.z%s already in pathr)r>rNrur5rkrnrOrrPrQrrr4insertrN_hook meta_pathrH)rCr4rFmsgrGr7r7r8mounts"   z Wheel.mountcCsrtjjtjj|j|j}|tjkr2tjd|nrNrur5rkrnrQrrrLrRrArS)rCrFr7r7r8unmounts     z Wheel.unmountc'Cs tjj|j|j}d|j|jf}d|}d|}tj|t}tj|d}tj|d}t j d}t |d} | j |} || } t | } WdQRX| djd d } td d | D}i}| j |:}t|d $}x|D]}|d}|||<qWWdQRXWdQRXx| jD]}|j}t|tr*|}n |jd}|jd}d|krTtd||j|rdq||}|drt|j|dkrtd||d r|d jdd \}}| j |}|j}WdQRX|j||\}}||krtd|qWWdQRXdS)Nz%s-%sz%s.dataz %s.dist-inforrzutf-8r{z Wheel-Versionr(rcSsg|] }t|qSr7)r|)r}r~r7r7r8r!sz Wheel.verify..)rrr:z..zinvalid entry in wheel: %rr$zsize mismatch for %srzdigest mismatch for %s)r>rNr5rkrnrlrmrrrrrrrrsrrrrr rrrrrrr)rCrFrrrr)r*r+rrr,rrrrrrr-rrr1rr2r3r4rr'rr7r7r8rvsV                 z Wheel.verifycKsdd}dd}tjj|j|j}d|j|jf}d|}tj|d} t} t |d} i} xt| j D]h} | j}t |t r|}n |j d }|| krqjd |krtd || j| | tjj| t|}|| |<qjWWd QRX|| |\}}|| f|}|r|| |\}}|r(||kr(||||d krRtjd d| d\}}tj|n*tjj|sltd|tjj||j}t| j}tjj| |}||f}|j|| ||j|||d krtj||Wd QRX|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}||kr$d|}||kr@||}t|dj}||fS)Nz%s/%sz %s/PKG-INFO)rN)rr rm)path_maprrmrNrr7r7r8 get_versionYs  z!Wheel.update..get_versionc Ssd}y|t|}|jd}|dkr*d|}nTdd||ddjdD}|dd7<d|d|djd d |Df}Wn tk rtjd |YnX|rt|d }||_|j t }|j ||d tjd||dS)Nr&rz%s+1cSsg|] }t|qSr7)r|)r}r;r7r7r8rksz8Wheel.update..update_version..rr(z%s+%scss|]}t|VqdS)N)r)r}r~r7r7r8 nsz7Wheel.update..update_version..z0Cannot update non-compliant (PEP-440) version %r)rN)rNlegacyzVersion updated from %r to %rr) rrrsr5rrrr rmrrr)rmrNupdatedrKr~r6ZmdrZr7r7r8update_versioncs(       z$Wheel.update..update_versionz%s-%sz %s.dist-inforr{zutf-8z..zinvalid entry in wheel: %rNz.whlz wheel-update-)rr dirzNot a directory: %r)r>rNr5rkrnrlrmrrrrrr rrrLrr mkstempcloserrr"rrr%copyfile)rCmodifierdest_dirr(rXr\rFrrr+r0rrWr1rr2rNZoriginal_versionr'modifiedcurrent_versionfdnewpathrrrwr7r7r8rEHsX                z Wheel.update)rr)NFF)N)NN)F)N)rZr[r\__doc__rrrDpropertyrnryrzrrrrwrrrrrrrr@rCrNrOrPrUrVrvrEr7r7r7r8r]s6 )       tg "  8r]cCstg}td}x6ttjddddD]}|jdj|t|gq&Wg}x6tjD]*\}}}|j drT|j|j dddqTW|j t dkr|j dt |jdg}tg}tjdkrtjd t}|r|j\} }}} t|}| g} | dkr| jd | dkr| jd| dkr*| jd| dkr>| jd| dkrR| jdxL|dkrx2| D]*} d| ||| f} | tkrd|j| qdW|d8}qTWx<|D]4}x,|D]$} |jdjt|df|| fqWqWxXt|D]L\}}|jdjt|fddf|dkr|jdjt|dfddfqWxXt|D]L\}}|jdjd|fddf|dkrB|jdjd|dfddfqBWt|S)zG Return (pyver, abi, arch) tuples compatible with this Python. rrr1z.abir(r$r_darwinz(\w+)_(\d+)_(\d+)_(\w+)$i386ppcfatx86_64Zfat3ppc64fat64intel universalz %s_%s_%s_%sr`r%rr)rjrk)rjrkrm)rnrm)rjrm)rjrmrprkrn)r2rangerQrBr4r5rrTZ get_suffixesrrssortrrQrplatformrerqrr| IMP_PREFIXrset)versionsmajorminorabisrr'rOarchesr-rlrimatchesrqr;rhr~rmr7r7r8compatible_tagss`                    * $ $r~cCs^t|tst|}d}|dkr"t}x6|D].\}}}||jkr(||jkr(||jkr(d}Pq(W|S)NFT)rr]COMPATIBLE_TAGSrgrhri)wheelrzrOverrhrir7r7r8rOs rO)N)U __future__rrrrHdistutils.util distutilsemailrrrTr loggingr>rrur%rQr rr1rrcompatrrr r r Zdatabaser rr rrrutilrrrrrrrrrrmrr getLoggerrZrrAhasattrrvrtrr3r2rBrfr get_platformr=rrr9compile IGNORECASEVERBOSErtrprrrrr?robjectr@rRr]r~rrOr7r7r7r8s   ,          #*>