0{Y@sddlZddlmZddlZddlZddlmZddlZddl Z ddl Z ddl Z ddl Z ddl Z ddlZddlZddlZddlZddlZddlZddlZyddlZWnek rddlZYnXddlZddlmZddlmZmZmZmZmZm Z m!Z!m"Z"m#Z#m$Z$m%Z%m&Z'm(Z(m)Z)m*Z*m+Z+m,Z,m-Z-m.Z.m/Z/e j0e1Z2dZ3e j4e3Z5dZ6d e6d Z7e6d Z8d Z9d e9de8de3d e9de8dZ:dZ;de:de;de:dZ<e7d e3e7dZ=de=dZ>de6de>de<dZ?e j4e?Z@de9de8d ZAe j4eAZBdd ZCd!d"ZDd#d$ZEd%d&ZFddd'd(ZGd)d*ZHd+d,ZId-d.ZJejKd/d0ZLejKd1d2ZMejKd3d4d5ZNGd6d7d7eOZPd8d9ZQGd:d;d;eOZRd<d=ZSGd>d?d?eOZTe j4d@e jUZVdAdBZWddCdDZXdEdFZYdGdHZZdIdJZ[dKdLZ\dMdNZ]e j4dOe j^Z_e j4dPZ`ddQdRZae j4dSZbdTdUZcdVdWZddXdYZedZd[Zfd\d]ZgGd^d_d_eOZhGd`dadaeOZiGdbdcdceOZjdZkddkdldmZldndoZmdZnGdvdwdweOZoe j4dxZpe j4dyZqe j4dzZrd{d|Zd}d~ZsGddde"jtZtGddde'Z&Gddde&e%ZuejvddZwewdkrGddde"jxZxGddde"jyZynGddde#jzZzGddde#j{Z{Gddde#j|Z|ddZ}GdddeOZ~Gddde~ZGddde~ZGddde(ZGdddeOZdS)N)deque)iglob)DistlibException) string_types text_typeshutil raw_inputStringIOcache_from_sourceurlopenhttplib xmlrpclib splittype HTTPHandler HTTPSHandlerBaseConfigurator valid_ident Container configparserURLErrormatch_hostnameCertificateErrorZipFilez\s*,\s*z (\w|[.-])+z(\*|:(\*|\w+):|)z\*?z([<>=!~]=)|[<>](z)?\s*(z)(z)\s*(z))*z(from\s+(?P.*))z \(\s*(?P|z)\s*\)|(?Pz\s*)z)*z \[\s*(?Pz)?\s*\]z(?Pz \s*)?(\s*z)?$z(?Pz )\s*(?Pc s^ddd}tj|}|rZ|j}|d}|dpN|d}|dsdd}nd}|dj}|sd}d}|d}nk|dd krd |}ntj|} fd d | D}d |djdd |Df}|dsd} ntj|d} t d|d|d| d|d|d|}n|S)NcSs|j}|d|dfS)Nopvn) groupdict)mdr"3/tmp/pip-ok8sy_ze-build/pip/_vendor/distlib/util.pyget_constraintTs z)parse_requirement..get_constraintdnc1c2direfrz<>!=z~=csg|]}|qSr"r").0r )r$r"r# ls z%parse_requirement..z%s (%s)z, cSsg|]}d|qS)z%s %sr")r*conr"r"r#r+ms exname constraintsextras requirementsourceurl) REQUIREMENT_REmatchrstripRELOP_IDENT_REfinditerjoinCOMMA_REsplitr) sresultr r!r.consr3constrrsiteratorr0r")r$r#parse_requirementRs4       &  rBcCsdd}i}x|D]\}}}tjj||}xt|D]}tjj||} xt| D]v} ||| } |dkr|j| dqr||| } |jtjjdjd} | d| || .get_rel_pathNrC)rErFr9rpoprDrGrstrip)resources_rootrulesrM destinationsrLsuffixdestprefixabs_baseabs_globabs_path resource_filerel_pathrel_destr"r"r#get_resources_destsws  !r\cCs:ttdrd}ntjttdtjk}|S)N real_prefixT base_prefix)hasattrsysrUgetattr)r=r"r"r#in_venvs rbcCs;tjdkr.dtjkr.tjd}n tj}|S)Ndarwin__PYVENV_LAUNCHER__)r`platformrEenviron executable)r=r"r"r#get_executables   rhcCs~|}xqt|}|}| r1|r1|}n|r |dj}||krWPn|rvd|||f}qvq q W|S)Nrz %c: %s %s)r lower)prompt allowed_chars error_promptdefaultpr<cr"r"r#proceeds    rpcCsVt|tr|j}ni}x+|D]#}||kr+||||szFileOperator.cCstjj|}||jkrtjj| r|jj|tjj|\}}|j|tj d||j stj |n|j r|j j|qndS)Nz Creating %s)rErFrrrrr;rrrrmkdirrr)rrFr!rr"r"r#rs"   zFileOperator.ensure_dircCst|| }tjd|||js|sD|j||r|sSd}q|j|sht|t|d}ntj |||dn|j ||S)NzByte-compiling %s to %sT) r rrrrrHrIrJ py_compilecompiler)rrFoptimizeforcerUdpathdiagpathr"r"r# byte_compiles   zFileOperator.byte_compilecCstjj|rtjj|rtjj| rtjd||js`tj |n|j r ||j kr|j j |qq qtjj|rd}nd}tjd|||jstj |n|j r||j kr |j j |q qndS)NzRemoving directory tree at %slinkfilezRemoving %s %s)rErFrrrrdebugrrrrrrr)rrFr<r"r"r#ensure_removeds"%     zFileOperator.ensure_removedcCsjd}x]|setjj|r:tj|tj}Pntjj|}||kr\Pn|}q W|S)NF)rErFraccessW_OKr)rrFr=parentr"r"r# is_writables   zFileOperator.is_writablecCs/|jst|j|jf}|j|S)zV Commit recorded changes, turn off recording, return changes. )rrIrrr)rr=r"r"r#commits zFileOperator.commitcCs|jsx9t|jD](}tjj|rtj|qqWt|jdd}xq|D]f}tj |}|r|dgkst tjj ||d}tj |ntj |qaWn|j dS)NreverseT __pycache__r)rlistrrErFrrsortedrlistdirrIr9rmdirr)rrdirsr!flistsdr"r"r#rollbacks  zFileOperator.rollback)rrrrrrrrrrrrset_executable_moderrrrrrr"r"r"r#r:s          rcCs|tjkrtj|}n t|}|dkr@|}nG|jd}t||jd}x|D]}t||}qnW|S)N.r)r`modules __import__r;rarN) module_name dotted_pathmodr=partsrnr"r"r#resolves    r c@sOeZdZddZeddZddZddZej Z d S) ExportEntrycCs(||_||_||_||_dS)N)r.rUrSr)rr.rUrSrr"r"r#rs   zExportEntry.__init__cCst|j|jS)N)r rUrS)rr"r"r#rszExportEntry.valuecCs d|j|j|j|jfS)Nz)r.rUrSr)rr"r"r#__repr__ szExportEntry.__repr__cCsdt|tsd}nH|j|jko]|j|jko]|j|jko]|j|jk}|S)NF)rqrr.rUrSr)rotherr=r"r"r#__eq__s zExportEntry.__eq__N) rrrrrrrrr__hash__r"r"r"r#rs    rz(?P(\w|[-.])+) \s*=\s*(?P(\w+)([:\.]\w+)*) \s*(\[\s*(?P\w+(=\w+)?(,\s*\w+(=\w+)?)*)\s*\])? c CsGtj|}|sId}d|ks3d|krCtd|qCn|j}|d}|d}|jd}|dkr|d}}n4|dkrtd|n|jd\}}|d } | dkrd|ksd|kr td|ng} nd d | jd D} t|||| }|S) N[]zInvalid specification %rr.callable:rrrcSsg|]}|jqSr")r6)r*rr"r"r#r+;s z$get_export_entry..,)ENTRY_REsearchrrcountr;r) specificationr r=r!r.rFcolonsrUrSrr"r"r#r!s2          rc Cs|dkrd}ntjdkrHdtjkrHtjjd}ntjjd}tjj|rtj|tj}|st j d|qnHytj |d}Wn.t k rt j d |d dd }YnX|s t j}t j d |ntjj||S) a Return the default base location for distlib caches. If the directory does not exist, it is created. Use the suffix provided for the base directory, and default to '.distlib' if it isn't provided. On Windows, if LOCALAPPDATA is defined in the environment, then it is assumed to be a directory, and will be the parent directory of the result. On POSIX, and on Windows if LOCALAPPDATA is not defined, the user's home directory - using os.expanduser('~') - will be the parent directory of the result. The result is just the directory '.distlib' in the parent directory as determined above, or with the name specified with ``suffix``. Nz.distlibnt LOCALAPPDATAz $localappdata~z(Directory exists but is not writable: %sTzUnable to create %sexc_infoFz#Default location unusable, using %s)rEr.rfrF expandvars expanduserrrrrwarningmakedirsOSErrorrrr9)rSr=usabler"r"r#get_cache_base@s&       r'cCs`tjjtjj|\}}|r?|jdd}n|jtjd}||dS)a Convert an absolute path to a directory name for use in a cache. The algorithm used is: #. On Windows, any ``':'`` in the drive is replaced with ``'---'``. #. Any occurrence of ``os.sep`` is replaced with ``'--'``. #. ``'.cache'`` is appended. rz---z--z.cache)rErF splitdriverrDrG)rFr!rnr"r"r#path_to_cache_diris $r)cCs|jds|dS|S)NrC)endswith)r<r"r"r# ensure_slashzsr+cCskd}}d|kr^|jdd\}}d|krC|}q^|jdd\}}n|||fS)N@rr)r;)netlocusernamepasswordrUr"r"r#parse_credentialss    r0cCs tjd}tj||S)N)rEumask)r=r"r"r#get_process_umasks r3cCsXd}d}x3t|D]%\}}t|tsd}PqqW|dk sTt|S)NTF) enumeraterqrrI)seqr=ir<r"r"r#is_string_sequencesr7z3([a-z0-9_]+([.-][a-z_][a-z0-9_]*)*)-([a-z0-9_.+-]+)z -py(\d\.?\d?)cCsd}d}tj|}|rI|jd}|d|j}n|rt|t|dkrtjtj|d|}|r|j}|d|||dd|f}qn|dkrt j|}|r|jd|jd|f}qn|S)zw Extract name, version, python version from a filename (no extension) Return name, version, pyver or None Nrz\bru) PYTHON_VERSIONrrstartrJrer5escapeendPROJECT_NAME_AND_VERSION)filename project_namer=pyverr nr"r"r#split_filenames " - 'rBz-(?P[\w .-]+)\s*\(\s*(?P[^\s)]+)\)$cCsRtj|}|s(td|n|j}|djj|dfS)z A utility method used to get name and version from a string. From e.g. a Provides-Dist value. :param p: A value in a form 'foo (1.0)' :return: The name and version as a tuple. z$Ill-formed name/version string: '%s'r.ver)NAME_VERSION_REr5rrr6ri)rnr r!r"r"r#parse_name_and_versions  rEcCst}t|pg}t|p'g}d|krS|jd||O}nx|D]}|dkr||j|qZ|jdr|dd}||krtjd|n||kr|j|qqZ||krtjd|n|j|qZW|S)N*-rzundeclared extra: %s)rrrrHrr#) requested availabler=runwantedr"r"r# get_extrass&         rLcCsi}yet|}|j}|jddkrFtjdn$tjd|}tj|}Wn8t k r}ztj d||WYdd}~XnX|S)Nz Content-Typezapplication/jsonz$Unexpected response for JSON requestzutf-8z&Failed to get external data for %s: %s) r rgetrrryrzr|r}r exception)r3r=respheadersreaderer"r"r#_get_external_datas  &rScCs*d|dj|f}t|}|S)Nz9https://www.red-dove.com/pypi/projects/%s/%s/project.jsonr)upperrS)r.r3r=r"r"r#get_project_datas rUcCs'd|dj||f}t|S)Nz.strongconnect)ro)rrqr")rrrrr=rrr#strong_connectionss  $"  zSequencer.strong_connectionscCsdg}xF|jD];}|j|}x%|D]}|jd||fq-WqWx"|jD]}|jd|q\W|jddj|S)Nz digraph G {z %s -> %s;z %s;} )rnr\rpr9)rr=rwryrvrqr"r"r#dots    z Sequencer.dotN) rrrrrrrtrrr|rpropertyrrr"r"r"r#rmvs      3rm.tar.gz.tar.bz2.tar.zip.tgz.tbz.whlTc sfdd}tjjtd}|dkr|jdr]d}q|jdr{d}d }q|jdrd }d }q|jdrd}d}qtd|nz|dkrt|d}|r]|j}x|D]}||qWq]nBtj ||}|r]|j }x|D]}||qFWn|dkrt j ddkrxA|j D]0} t| jts| jjd| _qqWn|jWd|r|jnXdS)Ncs|t|ts!|jd}ntjjtjj|}|j se|tjkrxt d|ndS)Nzutf-8zpath outside destination: %r) rqrdecoderErFrr9rHrGr)rFrn)dest_dirplenr"r# check_paths !#zunarchive..check_path.zip.whlzip.tar.gz.tgztgzzr:gz.tar.bz2.tbztbzzr:bz2z.tartarrJzUnknown format for %rrruzutf-8)rr)rr)rr)rErFrrJr*rrnamelisttarfilergetnamesr`rx getmembersrqr.rr extractallr) archive_filenamerformatrrarchivernamesr.tarinfor")rrr# unarchivesH           rc Cstj}t|}t|d}x{tj|D]j\}}}xX|D]P}tjj||}||d} tjj| |} |j|| qPWq:WWdQX|S)z*zip a directory tree into a BytesIO objectrN) ioBytesIOrJrrEwalkrFr9r) directoryr=dlenzfrootrrr.fullrelrTr"r"r#zip_dir:s   rr)KMGTPc@seZdZdZddddZddZdd Zd d Zd d Ze ddZ e ddZ ddZ e ddZ e ddZdS)ProgressUNKNOWNrdcCsV|dks||kst||_|_||_d|_d|_d|_dS)NrF)rIrcurmaxstartedelapseddone)rminvalmaxvalr"r"r#rQs    zProgress.__init__cCs}|j|kst|jdks9||jks9t||_tj}|jdkri||_n||j|_dS)N)rrIrrtimerr)rcurvalnowr"r"r#updateYs$   zProgress.updatecCs*|dkst|j|j|dS)Nr)rIrr)rincrr"r"r# incrementcszProgress.incrementcCs|j|j|S)N)rr)rr"r"r#r9gszProgress.startcCs/|jdk r"|j|jnd|_dS)NT)rrr)rr"r"r#stopksz Progress.stopcCs|jdkr|jS|jS)N)runknown)rr"r"r#maximumpszProgress.maximumcCsZ|jrd}nD|jdkr*d}n,d|j|j|j|j}d|}|S)Nz100 %z ?? %gY@z%3d %%)rrrr)rr=rr"r"r# percentagets   " zProgress.percentagecCsU|dkr|jdks-|j|jkr6d}ntjdtj|}|S)Nrz??:??:??z%H:%M:%S)rrrrstrftimegmtime)rdurationr=r"r"r#format_durations- zProgress.format_durationcCs|jrd}|j}nd}|jdkr9d}ne|jdksZ|j|jkrcd}n;t|j|j}||j|j}|d|j}d||j|fS)NDonezETA rrz%s: %sr)rrrrrfloatr)rrUtr"r"r#ETAs   ! z Progress.ETAcCsh|jdkrd}n|j|j|j}x(tD] }|dkrLPn|d}q6Wd||fS)Nrgig@@z%d %sB/s)rrrUNITS)rr=unitr"r"r#speeds   zProgress.speedN)rrrrrrrr9rrrrrrrr"r"r"r#rNs     rz \{([^}]*)\}z[^/\\,{]\*\*|\*\*[^/\\,}]z^[^{]*\}|\{[^}]*$cCsZtj|r(d}t||ntj|rPd}t||nt|S)zAExtended globbing function that supports ** and {opt1,opt2,opt3}.z7invalid glob %r: recursive glob "**" must be used alonez2invalid glob %r: mismatching set marker '{' or '}')_CHECK_RECURSIVE_GLOBrr_CHECK_MISMATCH_SET_iglob) path_globrr"r"r#rsrc cstj|d}t|dkrt|dksBt||\}}}x3|jdD]4}x+tdj|||fD] }|VqWqaWnd|krxt|D] }|VqWn|jdd\}}|dkrd}n|dkr d}n|jd}|jd }x]tj |D]L\}}} tj j |}x(ttj j||D] } | VqtWq7WdS) Nrrurr)z**rrFrC\) RICH_GLOBr;rJrIrr9 std_iglobrKrErrFrZ) rrich_path_globrUrrSitemrFradicaldirrr^r"r"r#rs*%      "rc@s(eZdZdZdZddZdS)HTTPSConnectionNTc Cstj|j|jf|j}t|ddrI||_|jntt ds|j rmt j }n t j }t j ||j|jd|dt jd|j |_nt jt j}|jt jO_|jr|j|j|jni}|j rHt j |_|jd|j tt ddrH|j|d !           zHTTPSConnection.connect)rrrrrr r"r"r"r#rs rc@s7eZdZdddZddZddZdS) rTcCs#tj|||_||_dS)N)BaseHTTPSHandlerrrr)rrrr"r"r#rs  zHTTPSHandler.__init__cOs7t||}|jr3|j|_|j|_n|S)a This is called to create a connection instance. Normally you'd pass a connection class to do_open, but it doesn't actually check for a class, and just expects a callable. As long as we behave just as a constructor would have, we should be OK. If it ever changes so that we *must* pass a class, we'll create an UnsafeHTTPSConnection class which just sets check_domain to False in the class definition, and choose which one to pass to do_open. )rrr)rrjrkr=r"r"r# _conn_maker s   zHTTPSHandler._conn_makercCsqy|j|j|SWnStk rl}z3dt|jkrWtd|jnWYdd}~XnXdS)Nzcertificate verify failedz*Unable to verify server certificate for %s)do_openrrstrreasonrr)rreqrRr"r"r# https_openszHTTPSHandler.https_openN)rrrrrrr"r"r"r#rs  rc@seZdZddZdS)HTTPSOnlyHandlercCstd|dS)NzAUnexpected HTTP request on what should be a secure connection: %s)r)rrr"r"r# http_open0szHTTPSOnlyHandler.http_openN)rrrrr"r"r"r#r/s rc@s"eZdZddddZdS)HTTPr)NcKs5|dkrd}n|j|j|||dS)Nr)_setup_connection_class)rrrrkr"r"r#r<s  z HTTP.__init__)rrrrr"r"r"r#r;s rc@s"eZdZddddZdS)HTTPSr)NcKs5|dkrd}n|j|j|||dS)Nr)rr)rrrrkr"r"r#rCs  zHTTPS.__init__)rrrrr"r"r"r#rBs rc@s+eZdZdddZddZdS) TransportrcCs ||_tjj||dS)N)rrrr)rr use_datetimer"r"r#rJs zTransport.__init__cCs|j|\}}}tdkr<t|d|j}nN|j sY||jdkr}||_|tj|f|_n|jd}|S)Nrrrrr)rr) get_host_info _ver_inforr _connection_extra_headersr HTTPConnection)rrhehx509r=r"r"r#make_connectionNs   zTransport.make_connectionN)rrrrr'r"r"r"r#rIs rc@s+eZdZdddZddZdS) SafeTransportrcCs ||_tjj||dS)N)rrr(r)rrrr"r"r#rZs zSafeTransport.__init__cCs|j|\}}}|s'i}n|j|ds zCSVReader.nextN)rrrrr=r>__next__r"r"r"r#r;s   r;c@s(eZdZddZddZdS) CSVWritercKs1t|d|_tj|j|j|_dS)Nr)r2rr<writerr:)rr^rkr"r"r#rszCSVWriter.__init__cCsutjddkrag}x<|D]4}t|trG|jd}n|j|q W|}n|jj|dS)Nrruzutf-8)r`rxrqrrr\rAwriterow)rrowrJrr"r"r#rBs  zCSVWriter.writerowN)rrrrrBr"r"r"r#r@s  r@csbeZdZeejZded.convert..z())rqrrtypedictconfigure_customrJ)or=r)rJrr"r#rJs(  z.Configurator.configure_custom..convertz()rz[]csg|]}|qSr"r")r*rN)rJr"r#r+s z1Configurator.configure_custom..cs2g|](}t|r||fqSr")r)r*r)rHrJr"r#r+s )rNrr rrLr~setattr) rrHropropsrjr~rkr=rArr")rHrJrr#rMs " zConfigurator.configure_customcCsI|j|}t|trEd|krE|j||j|<}n|S)Nz())rHrqrLrM)rrsr=r"r"r# __getitem__s zConfigurator.__getitem__c Csatjj|s-tjj|j|}ntj|ddd}tj|}WdQX|S)z*Default converter for the inc:// protocol.rJrzutf-8N) rErFisabsr9rLryrr|r})rrrr=r"r"r#rEs zConfigurator.inc_convert) rrrrLrvalue_convertersrrMrQrEr"r")rIr#rDs    rDc@s:eZdZddddZddZddZdS) SubprocessMixinFNcCs||_||_dS)N)verboseprogress)rrUrVr"r"r#rs zSubprocessMixin.__init__cCs|j}|j}xu|j}|s+Pn|dk rG|||q|s`tjjdntjj|jdtjjqW|jdS)z Read lines from a subprocess' output stream and either pass to a progress callable (if specified) or write progress information to sys.stderr. Nrzutf-8) rVrUreadliner`stderrrrflushr)rrr rVrUr<r"r"r#rQs    zSubprocessMixin.readercKstj|dtjdtj|}tjd|jd|jdf}|jtjd|jd|jdf}|j|j |j |j |j dk r|j ddn|j rt jjdn|S)NstdoutrXrrjzdone.mainzdone. ) subprocessPopenPIPE threadingThreadrQrZr9rXwaitr9rVrUr`r)rcmdrkrnt1t2r"r"r# run_commands$ $     zSubprocessMixin.run_command)rrrrrQrer"r"r"r#rTs  rT)rrrrrrr)r)rrrrr)rr)ry collectionsr contextlibr<globrrrr|loggingrErr:rrrr\r`rrr_ ImportErrordummy_threadingrr)rcompatrrr r r r r rrrrrrrrrrrrr getLoggerrrCOMMArr:IDENT EXTRA_IDENTVERSPECRELOPBARE_CONSTRAINTS DIRECT_REF CONSTRAINTS EXTRA_LISTEXTRAS REQUIREMENTr4 RELOP_IDENTr7rBr\rbrhrprtrrcontextmanagerrrrrrrrr rVERBOSErrr'r)r+r0r3r7Ir=r8rBrDrErLrSrUrWrXrarmARCHIVE_EXTENSIONSrrrrrrrrrrrxr rrrr(r)r2r3r;r@rDrTr"r"r"r#s                    . %   $      )          ,H6 ] !*)   :