U .e@sddlmZddlZddlZddlZddlZddlmZddl Z ddl Z ddl Z ddl Z ddl Z ddlZddlZddlZddlZddlZddlZddlmZmZddlmZmZmZmZmZddlmZddlm 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.m/Z/e 0e1Z2da3e4ed r8d Z5n*ej67d rLdZ5nej6dkr^dZ5ndZ5e8dZ9e9sdej:ddZ9de9Z;e5e9Zdd>ddZ?e8dZ@e@re@7dre@>ddZ@nddZAeAZ@[AeBdejCejDBZEeBdejCejDBZFeBdZGeBd ZHd!ZId"ZJe jKd#krBd$d%ZLnd&d%ZLGd'd(d(eMZNeNZOGd)d*d*eMZPd+d,ZQeQZR[Qd/d-d.ZSdS)0)unicode_literalsN)message_from_file) __version__DistlibException) sysconfigZipFilefsdecode text_typefilter)InstalledDistribution)MetadataMETADATA_FILENAMEWHEEL_METADATA_FILENAME) FileOperator convert_path CSVReader CSVWriterCachecached_propertyget_cache_base read_exportstempdir)NormalizedVersionUnsupportedVersionErrorZpypy_version_infoZppjavaZjyZcliZipcpZpy_version_nodotz%s%spy-_.ZSOABIzcpython-cCsRdtg}tdr|dtdr0|dtddkrH|dd |S) NrZPy_DEBUGdZ WITH_PYMALLOCmZPy_UNICODE_SIZEu) VER_SUFFIXrget_config_varappendjoin)partsr,=/usr/lib/python3.8/site-packages/pip/_vendor/distlib/wheel.py _derive_abi;s     r.zz (?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-]r3cCs|tjdS)Nr/)replaceossepr1r,r,r-r3_r4c@s6eZdZddZddZddZd dd Zd d ZdS) MountercCsi|_i|_dSr0) impure_wheelslibsselfr,r,r-__init__cszMounter.__init__cCs||j|<|j|dSr0)r9r:update)r<pathname extensionsr,r,r-addgs z Mounter.addcCs0|j|}|D]\}}||jkr|j|=qdSr0)r9popr:)r<r?r@kvr,r,r-removeks   zMounter.removeNcCs||jkr|}nd}|Sr0)r:)r<fullnamepathresultr,r,r- find_moduleqs zMounter.find_modulecCsj|tjkrtj|}nP||jkr,td|t||j|}||_|dd}t|dkrf|d|_ |S)Nzunable to find extension for %sr!rr) sysmodulesr: ImportErrorimpZ load_dynamic __loader__rsplitlen __package__)r<rFrHr+r,r,r- load_modulexs       zMounter.load_module)N)__name__ __module__ __qualname__r=rArErIrRr,r,r,r-r8bs  r8c@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/Zd0d1Zd8d2d3ZdS)9Wheelz@ Class to build and install from Wheel files (PEP 427). rrZsha256NFcCs8||_||_d|_tg|_dg|_dg|_t|_ |dkrRd|_ d|_ |j |_ nt|}|r|d}|d|_ |dd d |_ |d |_|j |_ ntj|\}}t|}|std ||rtj||_ ||_ |d}|d|_ |d|_ |d |_|d d|_|dd|_|dd|_dS)zB Initialise an instance using a (valid) filename. r&noneanyNZdummyz0.1ZnmZvnr rZbnzInvalid name or filename: %rrr!ZbiZar)signZ should_verifybuildverPYVERpyverabiarchr6getcwddirnamenameversionfilenameZ _filenameNAME_VERSION_REmatch groupdictr5rGsplit FILENAME_RErabspath)r<rdrZverifyr#inforar,r,r-r=sD            zWheel.__init__cCs^|jrd|j}nd}d|j}d|j}d|j}|jdd}d|j|||||fS)zJ Build and return a filename from the various components. rr&r!r z%s-%s%s-%s-%s-%s.whl)r[r*r]r^r_rcr5rb)r<r[r]r^r_rcr,r,r-rds     zWheel.filenamecCstj|j|j}tj|Sr0)r6rGr*rardisfile)r<rGr,r,r-existssz Wheel.existsccs4|jD](}|jD]}|jD]}|||fVqqqdSr0)r]r^r_)r<r]r^r_r,r,r-tagss   z Wheel.tagsc Cstj|j|j}d|j|jf}d|}td}t |d}| |}|d dd}t dd |D}|d krt td g} nt tg} d} | D]f} zLt|| } || ,} || }t|d } | rW5QRWqW5QRXWqtk rYqXq| std d| W5QRX| S)N%s-%s %s.dist-infoutf-8r Wheel-Versionr!rcSsg|] }t|qSr,int.0ir,r,r- sz"Wheel.metadata..rWZMETADATA)Zfileobjz8Invalid wheel, because metadata is missing: looked in %sz, )r6rGr*rardrbrccodecs getreaderrget_wheel_metadatarhtuplerr posixpathopenr KeyError ValueError)r<r?name_verinfo_dirwrapperzfwheel_metadatawv file_versionZfnsrHfnmetadata_filenamebfwfr,r,r-metadatas6       zWheel.metadatac CsXd|j|jf}d|}t|d}||}td|}t|}W5QRXt|S)NrprqWHEELrr) rbrcrr*rr{r|rdict)r<rrrrrrmessager,r,r-r}s  zWheel.get_wheel_metadatac Cs6tj|j|j}t|d}||}W5QRX|S)Nrs)r6rGr*rardrr})r<r?rrHr,r,r-rls z Wheel.infoc Cst|}|r||}|d|||d}}d|krBt}nt}t|}|rfd|d}nd}||}||}nT|d}|d} |dks|| krd} n|||dd krd } nd} t| |}|S) Nspythonw r4  rrs ) SHEBANG_RErfendlowerSHEBANG_PYTHONWSHEBANG_PYTHONSHEBANG_DETAIL_REgroupsfind) r<datar#rZshebangZdata_after_shebangZshebang_pythonargsZcrZlfZtermr,r,r-process_shebangs,       zWheel.process_shebangcCsh|dkr|j}ztt|}Wn tk r<td|YnX||}t|d d}||fS)NzUnsupported hash algorithm: %r=ascii) hash_kindgetattrhashlibAttributeErrorrdigestbase64Zurlsafe_b64encoderstripdecode)r<rrhasherrHr,r,r-get_hash"s zWheel.get_hashc Cs^t|}ttj||}||ddf|t|}|D]}||q@W5QRXdS)Nr&) listto_posixr6rGrelpathr)sortrZwriterow)r<recordsZ record_pathbasepwriterrowr,r,r- write_record-s zWheel.write_recordc Csg}|\}}tt|j}|D]P\}} t| d} | } W5QRXd|| } tj| } | || | fqtj |d} | || |t tj |d}| || fdS)Nrbz%s=%sRECORD) rrrrreadrr6rGgetsizer)r*rr)r<rllibdir archive_pathsrdistinforraprfrrsizer,r,r- write_records6s    zWheel.write_recordsc CsFt|dtj.}|D]"\}}td|||||qW5QRXdS)NwzWrote %s to %s in wheel)rzipfileZ ZIP_DEFLATEDloggerdebugwrite)r<r?rrrrr,r,r- build_zipFs zWheel.build_zipc! s~|dkr i}ttfdddd}|dkrFd}tg}tg}tg}nd}tg}d g}d g}|d ||_|d ||_|d ||_ |} d|j |j f} d| } d| } g} dD]}|krq|}t j |rt |D]\}}}|D]}tt j ||}t j ||}tt j | ||}| ||f|dkr|dst|d}|}W5QRX||}t|d}||W5QRXqqq| }d}t |D]\}}}||kr t|D]8\}}t|}|drt j ||}||=qq|s td|D]H}t|dr(qt j ||}tt j ||}| ||fqqt |}|D]B}|dkrltt j ||}tt j | |}| ||fqld|p|jdtd|g}|jD] \}}}|d|||fqt j |d}t|d}|d |W5QRXtt j | d}| ||f| || 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|kSr0r,r1pathsr,r-r3Tr4zWheel.build..)purelibplatlibrrZfalsetruerXrYr]r^r_rp%s.datarq)rZheadersscriptsr.exerwbz .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 )$rr IMPVERABIARCHr\getr]r^r_rbrcr6rGisdirwalkr r*rrr)endswithrrrr enumerateAssertionErrorlistdir wheel_versionrrorrardr)!r<rrorZlibkeyZis_pureZ default_pyverZ default_abiZ default_archrrdata_dirrrkeyrGrootdirsfilesrrrprrrrrydnrr]r^r_r?r,rr-buildLs           z Wheel.buildcCs |dS)zl Determine whether an archive entry should be skipped when verifying or installing. )r/z /RECORD.jws)r)r<arcnamer,r,r- skip_entryszWheel.skip_entrycC Ksf|j}|d}|dd}|dd}tj|j|j}d|j|jf} d| } d| } t | t } t | d} t | d }t d }t |d }|| }||}t|}W5QRX|d d d}tdd|D}||jkr|r||j||ddkr|d}n|d}i}||8}t|d"}|D]}|d}|||<q8W5QRXW5QRXt | d}t | d}t | dd}t|d}d|_tj } g}!t}"|"|_d|_zz\|D]}#|#j}$t|$t r|$}%n |$!d }%|"|%rq||%}|dr4t#|#j$|dkr4t%d|%|dr|ddd\}&}'||$}|&}(W5QRX|'|(|&\})}*|*|'krt%d|$|r|%(||frt)*d |%q|%(|o|%+d! }+|%(|r |%d"d\})},}-tj||,t,|-}.n$|%| |fkrqtj|t,|%}.|+s ||$}|-||.W5QRX|!.|.|s|drt|.d#4}|&}(|'|(|&\})}/|/|*krt%d$|.W5QRX| r~|.+d%r~z|j/|.|d&}0|!.|0Wn$t0k rt)j1d'dd(YnXnttj2t,|$}1tj|"|1}2||$}|-||2W5QRXtj|.\}3}1|3|_|3|1}4|4|4|!5|4q|rt)*d)d}5nnd}6|j6d }|d*krzt | d+}7z||7}t7|}8W5QRXi}6d,D]l}9d-|9}:|:|8kri|6d.|9<};|8|:8D]6}|6d6i}?|>s|?r|dd}@tj>|@s*t?d7|@|_|>@D]*\}:}.zRoot-Is-Purelibrrrstreamrr&r)dry_runTNrsize mismatch for %s=digest mismatch for %szlib_only: skipping %srr/rzdigest mismatch on write for %sz.py)Zhashed_invalidationzByte-compilation failed)exc_infozlib_only: returning Nonez1.0zentry_points.txt)Zconsoleguiz %s_scriptszwrap_%sz%s:%sz %szAUnable to read legacy script metadata, so cannot generate scriptsr@zpython.commandsz8Unable to read JSON metadata, so cannot generate scriptsZ wrap_consoleZwrap_guizValid script path not specifiedz%s = %srlibprefixzinstallation failed.)Grrr6rGr*rardrbrcrrr{r|rrrrhr~rrrrecordrJdont_write_bytecodetempfileZmkdtempZ source_dirZ target_dirshutilZrmtreeinfolist isinstancer rrstr file_sizerrr startswithrrrrZ copy_streamr)Z byte_compile ExceptionZwarningbasenameZmakeZset_executable_modeextendrlrvaluesrsuffixflagsjsonloadrritemsr rZwrite_shared_locationsZwrite_installed_filesZ exceptionZrollback)Cr<rZmakerkwargsrrrZbc_hashed_invalidationr?rrr metadata_namewheel_metadata_name record_namerrbwfrrrrrrrreaderrrZdata_pfxZinfo_pfxZ script_pfxZfileopZbcZoutfilesworkdirzinfor u_arcnamekindvaluerr rZ is_scriptwhererZoutfileZ newdigestZpycrZworknamer filenamesZdistZcommandsZepZepdatarrCr"rDsZconsole_scriptsZ gui_scriptsZ script_dirZscriptZoptionsr,r,r-installsT                                                     z Wheel.installcCs4tdkr0tjttdtjdd}t|atS)Nz dylib-cache) cacher6rGr*rrrJrcr)r<rr,r,r-_get_dylib_caches  zWheel._get_dylib_cachec Cshtj|j|j}d|j|jf}d|}t|d}t d}g}t |d}z| |}||} t | } |} | |} tj| j| } tj| st| | D]\}}tj| t|}tj|sd}n6t|j}tj|}||}tj|j}||k}|r&||| |||fqW5QRXWntk rXYnXW5QRX|S)NrprqZ EXTENSIONSrrrsT)r6rGr*rardrbrcrr{r|rrrrrZ prefix_to_dirrrmakedirsrrrnstatst_mtimedatetimeZ fromtimestampZgetinfoZ date_timeextractr)r)r<r?rrrrrHrrrr@rrZ cache_baserbrdestrZ file_timerlZ wheel_timer,r,r-_get_extensionss>             zWheel._get_extensionscCst|S)zM Determine if a wheel is compatible with the running system. ) is_compatibler;r,r,r-rszWheel.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}|s2d|}t||sJd|}t||t jkrbt d|nN|rtt j |nt j d||}|rtt jkrt j tt||dS)Nz)Wheel %s not compatible with this Python.z$Wheel %s is marked as not mountable.z%s already in pathr)r6rGrjr*rardrrrrJrrr)insertr_hook meta_pathrA)r<r)r?msgr@r,r,r-mounts"   z Wheel.mountcCsrtjtj|j|j}|tjkr2td|n.rrr/..invalid entry in wheel: %rrrrr)r6rGr*rardrbrcrrr{r|rrrrhr~rrrr rrrrrrr)r<r?rrrrrrrrr rrrrrrr rrr rr rrrr rr,r,r-rks\                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 }|| krqhd |krtd || | | tj| t|}|| |<qhW5QRX|| |\}}|| f|}|r|| |\}}|r$||kr$||||d krNtjd d| d\}}t|n*tj|shtd|tj||j}t| }tj| |}||f}||| |||||d krt||W5QRX|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-INFOrG)rr rc)path_maprrcrGrr,r,r- get_versionKs  z!Wheel.update..get_versioncSsd}z|t|}|d}|dkr*d|}nTdd||dddD}|dd7<d |d|dd d |Df}Wn tk rtd |YnX|rt|d }||_| t  }|j ||dtd||dS)Nrrz%s+1cSsg|] }t|qSr,ru)rxrr,r,r-rz]sz8Wheel.update..update_version..rr!rz%s+%scss|]}t|VqdSr0)rrwr,r,r- `sz7Wheel.update..update_version..z0Cannot update non-compliant (PEP-440) version %rr()rGlegacyzVersion updated from %r to %r) rrrhr*rrrr rcrrr)rcrGupdatedrDryr+Zmdr,r,r,r-update_versionUs.        z$Wheel.update..update_versionrprqrrsrrr&r'Nz.whlz wheel-update-)rrdirzNot a directory: %r)r6rGr*rardrbrcrrrrrr rrrrrZmkstempcloserrrrrrZcopyfile)r<ZmodifierZdest_dirrr*r.r?rrrr rr)r rr rGZoriginal_versionr ZmodifiedZcurrent_versionfdnewpathrrrlr,r,r-r>:s\                 z Wheel.update)NFF)N)NN)F)N)rSrTrU__doc__rrr=propertyrdrnrorrr}rlrrrrrrrrrrrrr$r%rkr>r,r,r,r-rVs@ )         hg "  8rVc Csxtg}td}ttjddddD]}|d|t|gq$g}tD]*\}}}| drN|| dddqN| t dkr| dt |dg}tg}tjd krtd t}|r|\} }}} t|}| g} | d kr| d | d kr | d| dkr | d| dkr4| d| dkrH| d|dkr| D]*} d| ||| f} | tkrV|| qV|d8}qH|D]0}|D]$} |dt|df|| fqqt|D]L\}}|dt|fddf|dkr|dt|dfddfqt|D]L\}}|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)r6r7x86_64Zfat3)ppc64r8Zfat64)r6r8intel)r6r8r:r7r9Z universalz %s_%s_%s_%srYr)r'rangerJ version_infor)r*rrMZ get_suffixesrrhrrr rplatformrerfrrv IMP_PREFIXrset)ZversionsmajorminorZabisrr rHZarchesr#rbr_Zmatchesrfrr^ryrcr,r,r-compatible_tagss`                 & " "rCcCs\t|tst|}d}|dkr"t}|D]0\}}}||jkr&||jkr&||jkr&d}qXq&|S)NFT)rrVCOMPATIBLE_TAGSr]r^r_)ZwheelrorHZverr^r_r,r,r-rs r)N)TZ __future__rrr{rZdistutils.utilZ distutilsZemailrrrMrZloggingr6rr>rrJrrr&rrcompatrrr r r Zdatabaser rr rrutilrrrrrrrrrrcrrZ getLoggerrSrrhasattrr?r=rr(r'r<r\rZ get_platformr5rrr.compile IGNORECASEVERBOSErirerrrrr7robjectr8r!rVrCrDrr,r,r,r-s   ,             #>