3 e@sdZddlZddlZddlZddlZddlZddlZddlZddlZddl Z ddl Z ddl Z ddl Z ddl ZddlZddlZddlZddlmZddlZddlmZmZmZmZmZmZmZmZmZm Z m!Z!m"Z"m#Z#m$Z$ddl%m&Z&ddl'm(Z(ddl)m*Z*ddl+m,Z,dd l-m.Z.ej/d Z0ej/d ej1Z2ej/d Z3ej/d ej1j4Z5dj6Z7ddddgZ8dZ9dZ:e:j;dj;ej<edZ=ddZ>ddZ?ddZ@dAddZAdBddZBdCdd ZCdedfd!dZDd"d#ZEej/d$ej1ZFeEd%d&ZGGd'd(d(ZHGd)d*d*eHZIGd+ddeZJej/d,jKZLd-d.ZMd/d0ZNdDd1d2ZOd3d4ZPGd5d6d6ZQGd7d8d8e jRZSejTjUfd9d:ZVd;d<ZWeOe9eVZVd=d>ZXd?d@ZYdS)Ez#PyPI and direct package downloadingN)wraps) CHECKOUT_DIST Distribution BINARY_DISTnormalize_path SOURCE_DIST Environmentfind_distributions safe_name safe_version to_filename Requirement DEVELOP_DISTEGG_DIST parse_version)log)DistutilsError) translate)Wheel)unique_everseenz^egg=([-A-Za-z0-9_.+!]+)$zhref\s*=\s*['"]?([^'"> ]+)z([^<]+)\n\s+\(md5\)z([-+.a-z0-9]{2,}):z.tar.gz .tar.bz2 .tar .zip .tgz PackageIndexdistros_for_urlparse_bdist_wininstinterpret_distro_namez/tmp/pip-build-vlmub77e/setuptools/setuptools/package_index.pyparse_requirement_arg6s   r"cCs|j}d\}}}|jdr|jdr8|dd}d}nn|jddrb|dd}|dd}d}nD|jd r~|dd}d }n(|jd dr|dd}|dd}d }|||fS)z=Return (base,pyversion) or (None,None) for possible .exe nameNz.exez .win32.exe win32z .win32-pyz.win-amd64.exez win-amd64z .win-amd64-py)NNNiiiiiiir*i)lowerendswith startswith)namer+basepy_verplatr r r!r?s$            c Csxtjj|}|\}}}}}}tjj|jdd}|dkrX|dkrXtjj|jdd}d|krp|jdd\}}||fS) N/zsourceforge.netdownload#)urllibrurlparseunquotesplit) urlpartsschemeserverpathZ parametersqueryfragmentr/r r r!egg_info_for_urlWs rDccsdt|\}}xt|||D] }|VqW|r`tj|}|r`x$t||jd|tdD] }|VqRWdS)zEYield egg or source distribution objects that might be found at a URLr3) precedenceN)rDdistros_for_location EGG_FRAGMENTmatchrgroupr)r=metadatar/rCdistrHr r r!rbs   cCs|jdr|dd }|jdr8d|kr8tj|||gS|jdrxd|krxt|}|js^gSt||j|jtddgS|jd rt|\}}}|dk rt ||||t |Sx4t D],}|j|r|dt | }t |||SqWgS) z:Yield egg or source distribution objects based on basenamez.egg.zipNr'z.egg-z.whlr3)location project_nameversionrEz.exer*) r,r from_locationrZ is_compatiblerNrOrrrr EXTENSIONSlen)rMbasenamerJwheelZwin_baser0platformextr r r!rFps.     rFcCstt|tjj||S)zEYield possible egg or source distribution objects based on a filename)rFrosrArS)filenamerJr r r!distros_for_filenamesrYc cs|jd}| r.tdd|ddDr.dSxNtdt|dD]8}t||dj|d|dj||d|||dVqBWdS)zGenerate alternative interpretations of a source distro name Note: if `location` is a filesystem filename, you should call ``pkg_resources.normalize_path()`` on it before passing it to this routine! rLcss|]}tjd|VqdS)z py\d\.\d$N)rerH).0pr r r! sz(interpret_distro_name..r5Nr3) py_versionrErU)r<anyrangerRrjoin)rMrSrJr^rErUr>r\r r r!rs  $cstfdd}|S)zs Wrap a function returning an iterable such that the resulting iterable only ever yields unique items. cst||S)N)r)argskwargs)funcr r!wrapperszunique_values..wrapper)r)rdrer )rdr! unique_valuessrfz(<([^>]*\srel\s*=\s*['"]?([^'">]+)[^>]*)>ccsxvtj|D]h}|j\}}tttj|jjd}d|ksFd|kr x,t j|D]}t j j |t |jdVqRWq WxHdD]@}|j|}|d kr~t j||}|r~t j j |t |jdVq~WdS) zEFind rel="homepage" and rel="download" links in `page`, yielding URLs,Zhomepager4r3 Home PageDownload URLN)rhrir7)RELfinditergroupssetmapstrstripr+r<HREFr9rurljoin htmldecoderIfindsearch)r=pagerHtagrelZrelsposr r r!find_external_linkss "   rzc@s(eZdZdZddZddZddZdS) ContentCheckerzP A null content checker that defines the interface for checking content cCsdS)z3 Feed a block of data to the hash. Nr )selfblockr r r!feedszContentChecker.feedcCsdS)zC Check the hash. Return False if validation fails. Tr )r|r r r!is_validszContentChecker.is_validcCsdS)zu Call reporter with information about the checker (hash name) substituted into the template. Nr )r|reportertemplater r r!reportszContentChecker.reportN)__name__ __module__ __qualname____doc__r~rrr r r r!r{sr{c@sBeZdZejdZddZeddZddZ dd Z d d Z d S) HashCheckerzK(?Psha1|sha224|sha384|sha256|sha512|md5)=(?P[a-f0-9]+)cCs||_tj||_||_dS)N) hash_namehashlibnewhashexpected)r|rrr r r!__init__s zHashChecker.__init__cCs>tjj|d}|stS|jj|}|s0tS|f|jS)z5Construct a (possibly null) ContentChecker from a URLr3r7)r9rr:r{patternru groupdict)clsr=rCrHr r r!from_urls zHashChecker.from_urlcCs|jj|dS)N)rupdate)r|r}r r r!r~szHashChecker.feedcCs|jj|jkS)N)r hexdigestr)r|r r r!rszHashChecker.is_validcCs||j}||S)N)r)r|rrmsgr r r!rs zHashChecker.reportN) rrrrZcompilerr classmethodrr~rrr r r r!rs rcsPeZdZdZdOddZfdd ZdPd d ZdQd dZdRddZddZ ddZ ddZ ddZ ddZ dSddZddZdTfdd Zd!d"Zd#d$Zd%d&Zd'd(Zd)d*ZdUd+d,ZdVd-d.Zd/d0Zd1Zd2d3Zd4d5ZdWd6d7Zd8d9Zd:d;Zdd?Z d@dAZ!e"dXdBdCZ#dDdEZ$dFdGZ%dHdIZ&dJdKZ'dLdMZ(Z)S)Yrz;A distribution index that scans web pages for download URLshttps://pypi.org/simple/*NTcOsltj|f|||dd|jd |_i|_i|_i|_tjdj t t |j |_ g|_tjj|_dS)Nr2|)rrr, index_url scanned_urls fetched_urls package_pagesrZrrarnrrHallowsto_scanr9requesturlopenopener)r|rhostsZ ca_bundleZ verify_sslrbkwr r r!rszPackageIndex.__init__c s0yt|jWntk r"dSXtj|S)N)rrO Exceptionsuperadd)r|rK) __class__r r!r)s zPackageIndex.addFc Cs||jkr| rdSd|j|<t|s4|j|dStt|}|r^|j|sRdS|jd||sr| sr||jkrtt|j |dS|j|sd|j|<dS|j d|d|j|<d}|j |||}|dkrdSt |t jjo|jdkr|j d|jd|j|j<d|jjd d jkr.|jdS|j}|j}t |ts|t |t jjr^d }n|jjd pnd }|j|d }|jx6tj|D](} t jj|t| j d} |j!| qW|j"|j#rt$|dddkr|j%||}dS)z.)filterrWrArr itertoolsstarmap scan_egg_link)r| search_pathdirsZ egg_linksr r r!scan_egg_linksszPackageIndex.scan_egg_linksc Csttjj||}ttdttj|}WdQRXt |dkrDdS|\}}x>t tjj||D](}tjj|f||_ t |_ |j|q`WdS)Nr5)openrWrArarrrnrorprRr rMrrEr)r|rArZ raw_lineslinesZegg_pathZ setup_pathrKr r r!rs  zPackageIndex.scan_egg_linkcCsd}|j|js|Stttjj|t|jdjd}t|dksRd|dkrV|St |d}t |d}d|j j |j i|<t|t|fS)Nr2r5r6r3rT)NN)r-rrrnr9rr;rRr<r r r setdefaultr+r )r|rZNO_MATCH_SENTINELr>pkgverr r r!_scans "  zPackageIndex._scanc CsxJtj|D]<}y"|jtjj|t|jdWq tk rFYq Xq W|j|\}}|sbdSxXt ||D]J}t |\}}|j dr| r|r|d||f7}n |j ||j |qnWtjdd|S)z#Process the contents of a PyPI pager3rz.pyz #egg=%s-%scSsd|jdddS)Nz%sr3r5)rI)mr r r!sz,PackageIndex.process_index..)rqrkrr9rrrrsrIrrzrDr,need_version_infoscan_urlPYPI_MD5sub) r|r=rvrHrrnew_urlr/fragr r r!rs""   zPackageIndex.process_indexcCs|jd|dS)NzPPage at %s links to .py file(s) without version info; an index scan is required.)scan_all)r|r=r r r!rszPackageIndex.need_version_infocGs:|j|jkr*|r |j|f||jd|j|jdS)Nz6Scanning index of all packages (this may take a while))rrrrr)r|rrbr r r!rs  zPackageIndex.scan_allcCs~|j|j|jd|jj|js:|j|j|jd|jj|jsR|j|x&t|jj|jfD]}|j|qhWdS)Nr2) rr unsafe_namerrkeyrNnot_found_in_indexr)r| requirementr=r r r! find_packagess zPackageIndex.find_packagescsR|j|j|x,||jD]}||kr.|S|jd||qWtt|j||S)Nz%s does not match %s)prescanrrrrrobtain)r|r installerrK)rr r!rs zPackageIndex.obtaincCsL|j|jd||jsH|jtj|td|jjtj j |fdS)z- checker is a ContentChecker zValidating %%s checksum for %sz7%s validation failed for %s; possible download problem?N) rrrrrWunlinkrrr.rArS)r|checkerrXtfpr r r! check_hashs  zPackageIndex.check_hashcCsTxN|D]F}|jdks4t| s4|jds4tt|r@|j|q|jj|qWdS)z;Add `urls` to the list that will be prescanned for searchesNzfile:)rrr-rrrappend)r|urlsr=r r r!add_find_linkss      zPackageIndex.add_find_linkscCs"|jrtt|j|jd|_dS)z7Scan urls scheduled for prescanning (e.g. --find-links)N)rrrnr)r|r r r!rszPackageIndex.prescancCs<||jr|jd}}n |jd}}|||j|jdS)Nz#Couldn't retrieve index page for %rz3Couldn't find index page for %r (maybe misspelled?))rrrrr)r|rmethrr r r!rs   zPackageIndex.not_found_in_indexcCs~t|tsjt|}|rR|j|jd||}t|\}}|jdrN|j|||}|Stj j |rb|St |}t |j ||ddS)aLocate and/or download `spec` to `tmpdir`, returning a local path `spec` may be a ``Requirement`` object, or a string containing a URL, an existing local filename, or a project/version requirement spec (i.e. the string form of a ``Requirement`` object). If it is the URL of a .py file with an unambiguous ``#egg=name-version`` tag (i.e., one that escapes ``-`` as ``_`` throughout), a trivial ``setup.py`` is automatically created alongside the downloaded file. If `spec` is a ``Requirement`` object or a string containing a project/version requirement spec, this method returns the location of a matching distribution (possibly after downloading it to `tmpdir`). If `spec` is a locally existing file or directory name, it is simply returned unchanged. If `spec` is a URL, it is downloaded to a subpath of `tmpdir`, and the local filename is returned. Various errors may be raised if a problem occurs during downloading. r3z.pyrMN)rr r _download_urlrIrDr, gen_setuprWrArr"rfetch_distribution)r|rtmpdirr?foundr/rCr r r!r4#s    zPackageIndex.downloadc sjd|id}d fdd }|rHjj|||}| r`|dk r`|||}|dkrjdk rzj||}|dkr| rj|||}|dkrˆjdrdpd|njd||j|jd SdS) a|Obtain a distribution suitable for fulfilling `requirement` `requirement` must be a ``pkg_resources.Requirement`` instance. If necessary, or if the `force_scan` flag is set, the requirement is searched for in the (online) package index as well as the locally installed packages. If a distribution matching `requirement` is found, the returned distribution's ``location`` is the value you would have gotten from calling the ``download()`` method with the matching distribution's URL or filename. If no matching distribution is found, ``None`` is returned. If the `source` flag is set, only source distributions and source checkout links will be considered. Unless the `develop_ok` flag is set, development and system eggs (i.e., those using the ``.egg-info`` format) will be ignored. zSearching for %sNcs|dkr }x||jD]t}|jtkrJ rJ|krjd|d|<q||ko`|jtkp` }|rj|j}||_tj j |jr|SqWdS)Nz&Skipping development or system egg: %sr3) rrErrrr4rMdownload_locationrWrAr)reqenvrKtestloc) develop_okr|skippedsourcerr r!rt]s z-PackageIndex.fetch_distribution..findz:No local packages or working download links found for %s%sza source distribution of rzBest match: %s)rM)N)rrrrrcloner) r|rr force_scanrrZ local_indexrKrtr )rr|rrrr!rEs0       zPackageIndex.fetch_distributioncCs"|j||||}|dk r|jSdS)a3Obtain a file suitable for fulfilling `requirement` DEPRECATED; use the ``fetch_distribution()`` method now instead. For backward compatibility, this routine is identical but returns the ``location`` of the downloaded distribution instead of a distribution object. N)rrM)r|rrrrrKr r r!fetchszPackageIndex.fetchc Cstj|}|r*ddt||jddDp,g}t|dkrtjj|}tjj||krtjj ||}ddl m }|||st j |||}ttjj |dd2} | jd|dj|djtjj|dfWdQRX|S|rtd ||fntd dS) NcSsg|]}|jr|qSr )rO)r[dr r r! sz*PackageIndex.gen_setup..r3r)samefilezsetup.pywzIfrom setuptools import setup setup(name=%r, version=%r, py_modules=[%r]) zCan't unambiguously interpret project/version identifier %r; any dashes in the name or version should be escaped using underscores. %rzpCan't process plain .py files without an '#egg=name-version' suffix to enable automatic setup script generation.)rGrHrrIrRrWrArSdirnameraZsetuptools.command.easy_installr shutilcopy2rwriterNrOsplitextr) r|rXrCrrHrrSdstr rr r r!rs2       zPackageIndex.gen_setupi c Cs|jd|d}ztj|}|j|}t|tjjrJtd||j |j f|j}d}|j }d}d|kr|j d} t tt| }|j|||||t|dZ} xD|j|} | r|j| | j| |d7}|j|||||qPqW|j||| WdQRX|S|r|jXdS) NzDownloading %szCan't download %s: %s %srr3zcontent-lengthzContent-Lengthwbr7)rrrrrr9rrrrr dl_blocksizeget_allmaxrnint reporthookrrr~rrr) r|r=rXfprrblocknumbssizesizesrr}r r r! _download_tos:        zPackageIndex._download_tocCsdS)Nr )r|r=rXrZblksizerr r r!rszPackageIndex.reporthookcCs|jdrt|Sy t||jSttjjfk r}z@djdd|j D}|r`|j ||nt d||f|WYdd}~Xnt j jk r}z|Sd}~Xnt j jk r}z.|r|j ||jnt d||jf|WYdd}~Xntjjk rB}z0|r|j ||jnt d||jf|WYdd}~XnTtjjtj fk r}z,|rr|j ||nt d||f|WYdd}~XnXdS)Nzfile: cSsg|] }t|qSr )ro)r[argr r r!r sz)PackageIndex.open_url..z%s %szDownload error for %s: %sz;%s returned a bad status line. The server might be down, %s)r- local_openopen_with_authrrhttpclient InvalidURLrarbrrr9rrURLErrorreason BadStatusLineline HTTPExceptionsocket)r|r=warningvrr r r!rs8  $  zPackageIndex.open_urlcCst|\}}|r4x&d|kr0|jddjdd}qWnd}|jdrN|dd}tjj||}|dksn|jd rz|j||S|d ks|jd r|j||S|jd r|j ||S|d krt j j t j j|dS|j|d|j||SdS)Nz...\_Z__downloaded__z.egg.zipr'svnzsvn+gitzgit+zhg+rr5Tr*)rDreplacer,rWrArar- _download_svn _download_git _download_hgr9r url2pathnamerr:r_attempt_download)r|r?r=rr.rCrXr r r!rs$         zPackageIndex._download_urlcCs|j|ddS)NT)r)r|r=r r r!r1szPackageIndex.scan_urlcCs6|j||}d|jddjkr.|j|||S|SdS)Nrz content-typer)rrr+_download_html)r|r=rXrr r r!r94s zPackageIndex._attempt_downloadcCslt|}x@|D]8}|jrtjd|rD|jtj||j||SPqW|jtj|td|dS)Nz ([^- ]+ - )?Revision \d+:zUnexpected HTML page found at ) r���rp���rZ���ru���r���rW���r���r5��r���)r|���r=���r���rX���r���r*��r ���r ���r!���r:��;��s����     zPackageIndex._download_htmlc�������������C���s ��t�jdt�|jddd�}d}|j�jdrd|krtjj|\}}}}}} | �r|jdrd |d d��kr|d d��jd d\}}t |\} } | rd | kr| jd d\} } d | | f�}nd | �}| }|||||| f}tjj |}|�j d||�t j d|||f��|S�)Nz"SVN download support is deprecatedr6���r3���r���r���zsvn:@z//r2���r5���:z --username=%s --password=%sz --username=z'Doing subversion checkout from %s to %szsvn checkout%s -q %s %s)warningsr��� UserWarningr<���r+���r-���r9���r���r:��� _splituser urlunparser���rW���system)r|���r=���rX���credsr?���netlocrA���r\���qr���authhostuserpwr>���r ���r ���r!���r5��J��s&����    zPackageIndex._download_svnc�������������C���sp���t�jj|�\}}}}}|jddd�}|jddd�}d�}d|krR|jdd\}}t�jj||||df}�|�|fS�)N+r3���r6���r���r;��r���r7���)r9���r���urlsplitr<���rsplit urlunsplit)r=��� pop_prefixr?���rC��rA���rB���r���revr ���r ���r!���_vcs_split_rev_from_url`��s����z$PackageIndex._vcs_split_rev_from_urlc�������������C���sl���|j�ddd�}|�j|dd\}}|�jd||�tjd||f��|d�k rh|�jd|�tjd ||f��|S�) Nr6���r3���r���T)rM��zDoing git clone from %s to %szgit clone --quiet %s %szChecking out %szgit -C %s checkout --quiet %s)r<���rO��r���rW���rA��)r|���r=���rX���rN��r ���r ���r!���r6��r��s����  zPackageIndex._download_gitc�������������C���sl���|j�ddd�}|�j|dd\}}|�jd||�tjd||f��|d�k rh|�jd|�tjd ||f��|S�) Nr6���r3���r���T)rM��zDoing hg clone from %s to %szhg clone --quiet %s %szUpdating to %szhg --cwd %s up -C -r %s -q)r<���rO��r���rW���rA��)r|���r=���rX���rN��r ���r ���r!���r7����s����  zPackageIndex._download_hgc�������������G���s���t�j|f|��d�S�)N)r���r���)r|���r���rb���r ���r ���r!���r�����s����zPackageIndex.debugc�������������G���s���t�j|f|��d�S�)N)r���r���)r|���r���rb���r ���r ���r!���r�����s����zPackageIndex.infoc�������������G���s���t�j|f|��d�S�)N)r���r���)r|���r���rb���r ���r ���r!���r�����s����zPackageIndex.warnr���)r���rP��NT)F)F)F)N)N)FFFN)FF)N)F)*r���r���r���r���r���r���r���r���r���r���r���r���r���r���r���r���r���r���r���r���r���r4���r���r ��r���r��r��r��r���r���r���r9��r:��r5�� staticmethodrO��r6��r7��r���r���r��� __classcell__r ���r ���)r���r!���r�����sP���� 5      #� J )$ # z!&(#(\d+|x[\da-fA-F]+)|[\w.:-]+);?c�������������C���s���|�j�d}tj|S�)Nr���)rI���r���unescape)rH���whatr ���r ���r!��� decode_entity��s���� rU��c�������������C���s ���t�t|�S�)a�� Decode HTML entities in the given text. >>> htmldecode( ... 'https://../package_name-0.1.2.tar.gz' ... '?tokena=A&tokenb=B">package_name-0.1.2.tar.gz') 'https://../package_name-0.1.2.tar.gz?tokena=A&tokenb=B">package_name-0.1.2.tar.gz' ) entity_subrU��)textr ���r ���r!���rs�����s���� rs���c����������������s����fdd}|S�)Nc����������������s����fdd}|S�)Nc����������� ������s.���t�j�}t�j�z �|�|S�t�j|�X�d�S�)N)r,��getdefaulttimeoutsetdefaulttimeout)rb���rc���Z old_timeout)rd���timeoutr ���r!���_socket_timeout��s ����  z@socket_timeout.<locals>._socket_timeout.<locals>._socket_timeoutr ���)rd���r[��)rZ��)rd���r!���r[����s����z'socket_timeout.<locals>._socket_timeoutr ���)rZ��r[��r ���)rZ��r!���socket_timeout��s���� r\��c�������������C���s2���t�jj|�}|j�}tj|}|j�}|jddS�)a9�� Encode auth from a URL suitable for an HTTP header. >>> str(_encode_auth('username%3Apassword')) 'dXNlcm5hbWU6cGFzc3dvcmQ=' Long auth strings should not cause a newline to be inserted. >>> long_auth = 'username:' + 'password'*10 >>> chr(10) in str(_encode_auth(long_auth)) False  r���)r9���r���r;���encodebase64 b64encoder���r4��)rE��Zauth_sZ auth_bytesZ encoded_bytesencodedr ���r ���r!��� _encode_auth��s ����  rb��c���������������@���s(���e�Zd�ZdZdd�Zdd�Zdd�ZdS�) Credentialz: A username/password pair. Use like a namedtuple. c�������������C���s���||�_�||�_d�S�)N)usernamepassword)r|���rd��re��r ���r ���r!���r�����s����zCredential.__init__c�������������c���s���|�j�V��|�jV��d�S�)N)rd��re��)r|���r ���r ���r!���__iter__��s����zCredential.__iter__c�������������C���s ���dt�|��S�)Nz%(username)s:%(password)s)vars)r|���r ���r ���r!���__str__��s����zCredential.__str__N)r���r���r���r���r���rf��rh��r ���r ���r ���r!���rc����s���rc��c���������������@���s0���e�Zd�Zdd�Zedd�Zdd�Zdd�Zd S�) PyPIConfigc�������������C���sP���t�jdddgd}tjj|�|�tjjtjjdd}tjj |rL|�j |�dS�)z% Load from ~/.pypirc rd��re�� repositoryr���~z.pypircN) dictfromkeys configparserRawConfigParserr���rW���rA���ra��� expanduserr���r���)r|���defaultsrcr ���r ���r!���r�����s ���� zPyPIConfig.__init__c����������������s&����fdd�j��D�}tt�j|S�)Nc����������������s ���g�|�]}�j�|d�j�r|qS�)rj��)r���rp���)r[���section)r|���r ���r!���r ����s����z2PyPIConfig.creds_by_repository.<locals>.<listcomp>)sectionsrl��rn���_get_repo_cred)r|���Zsections_with_repositoriesr ���)r|���r!���creds_by_repository��s����zPyPIConfig.creds_by_repositoryc�������������C���s6���|�j�|dj�}|t|�j�|dj�|�j�|dj�fS�)Nrj��rd��re��)r���rp���rc��)r|���rs��repor ���r ���r!���ru����s����zPyPIConfig._get_repo_credc�������������C���s*���x$|�j�j�D�]\}}|j|r |S�q W�dS�)z If the URL indicated appears to be a repository defined in this config, return the credential for that repository. N)rv��itemsr-���)r|���r=���rj��credr ���r ���r!���find_credential��s���� zPyPIConfig.find_credentialN)r���r���r���r���propertyrv��ru��rz��r ���r ���r ���r!���ri����s��� ri��c�������������C���s<��t�jj|�}|\}}}}}}|jdr2tjjd|d krHt|\} } nd} | st�j |�} | rt | } | j |�f} t j d | ��| rdt| �} || ||||f} t�jj| }t�jj|}|jd| �n t�jj|�}|jd t�||}| r8t�jj|j\}}}}}}||kr8|| kr8||||||f} t�jj| |_|S�) z4Open a urllib2 request, handling HTTP authenticationr<��znonnumeric port: ''r$��httpsN*Authenticating as %s for %s (from .pypirc)zBasic Authorizationz User-Agent)r$��r|��)r}��)r9���r���r:���r,���r$��r%��r&��r?��ri��rz��ro���rd��r���r���rb��r@��r���Request add_header user_agentr=���)r=���r���parsedr?���rC��rA���paramsrB���r���rE��addressry��r���r>���r���r���r��s2h2path2Zparam2Zquery2Zfrag2r ���r ���r!���r#�� ��s8����          r#��c�������������C���s ���|�j�d\}}}�|r|nd|�fS�)zNsplituser('user[:passwd]@host[:port]') --> 'user[:passwd]', 'host[:port]'.r;��N) rpartition)rF��rG��delimr ���r ���r!���r?��<��s����r?��c�������������C���s���|�S�)Nr ���)r=���r ���r ���r!��� fix_sf_urlG��s����r��c���������� ���C���s��t�jj|�\}}}}}}t�jj|}tjj|r<t�jj|�S�|j drtjj |rg�}xtj |D�]b} tjj || } | dkrt | d} | j�} W�dQ�R�X�P�ntjj | r| d7�} |jdj| d�qbW�d} | j|�dj |d } d\}}n d\}}} ddi}tj| }t�jj|�||||S�)z7Read a local path, with special support for directoriesr2���z index.htmlrNz<a href="{name}">{name}</a>)r.���zB<html><head><title>{url}{files}r])r=filesOKPath not found Not foundz content-typez text/html)rr)rrr)r9rr:rr8rWrAisfilerr,rrrarrrformatioStringIOrr)r=r?r@rAparamrBrrXrrfilepathrbodyrstatusmessagerZ body_streamr r r!r"Ks,        r")N)N)N)r)ZrsysrWrZrrr,r_rrr=rnr http.clientr$ urllib.parser9urllib.request urllib.error functoolsrr pkg_resourcesrrrrrrr r r r r rrr distutilsrZdistutils.errorsrfnmatchrZsetuptools.wheelrZ setuptools.extern.more_itertoolsrrrGIrqrrHrr<rQ__all__Z_SOCKET_TIMEOUTZ_tmplr version_inforr"rrDrrFrYrrfrjrzr{rrrrVrUrsr\rbrcrorirrr#r?rr"r r r r!s @         !  !  !  &/