£Á°èZ¨Ä…–K§‚«“ô4“ÒÙ´dîfUÙÃÅ WKbyÊ¦•êŽ…È®FÒ¿ÊÎóCozá¬S@6{Í:›œêZÌ:Š•_%:¢¾¾~;‘Ã~èŠ©ÊÇí`ÔÑ©úë™µ'5I¿fš×WO%ø9¾«¾DK|€ùÍD”Ýs]nHÕ¶ê×Ó¼ãžªéUWŸÈË%DÒÕ¬ï‘]/Åcx  ‰ï2ß]ä6G[]S£ÔÏ¯rs{úëóµmÒï#UQxo·õÞCe]"±/aÙ&Eã4ú9Jé_ÞåëdãöKë)AÞ                  ¯¹ægƒÛowÐø^d™ý½ßB7áyMä9ÜÖUã
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
<html>
B
    ReΛ                 @   s  d Z ddlZddlZddlZddlZddlZddlZddlZddlZddl	Z	ddl
Z
ddlZddlZddlZddlZddlZddlZddlmZ ddlZddl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# ddl$m%Z% ddl&m'Z' ddl(m)Z) ddl*m+Z+ dd	l,m-Z- e.d
Z/e.dej0Z1e.dZ2e.dej0j3Z4d5 Z6ddddgZ7dZ8dZ9e9j:dj:ej; edZ<dd Z=dd Z>dd Z?dAddZ@dBddZAdCdd ZBdedfd!dZCd"d# ZDe.d$ej0ZEeDd%d& ZFG d'd( d(ZGG d)d* d*eGZHG d+d deZIe.d,jJZKd-d. ZLd/d0 ZMdDd1d2ZNd3d4 ZOG d5d6 d6ZPG d7d8 d8ejQZRejSjTfd9d:ZUd;d< ZVeNe8eUZUd=d> ZWd?d@ ZXdS )Ez#PyPI and direct package downloading    N)wraps)CHECKOUT_DISTDistributionBINARY_DISTnormalize_pathSOURCE_DISTEnvironmentfind_distributions	safe_namesafe_versionto_filenameRequirementDEVELOP_DISTEGG_DIST)log)DistutilsError)	translate)Wheel)unique_everseenz^egg=([-A-Za-z0-9_.+!]+)$zhref\s*=\s*['"]?([^'"> ]+)z<a href="([^"#]+)">([^<]+)</a>\n\s+\(<a (?:title="MD5 hash"\n\s+)href="[^?]+\?:action=show_md5&amp;digest=([0-9a-f]{32})">md5</a>\)z([-+.a-z0-9]{2,}):z.tar.gz .tar.bz2 .tar .zip .tgzPackageIndexdistros_for_urlparse_bdist_wininstinterpret_distro_name   z<setuptools/{setuptools.__version__} Python-urllib/{py_major}z{}.{})Zpy_major
setuptoolsc          
   C   sB   y
t | S  tk
r< } ztd| f |W d d }~X Y nX d S )Nz1Not a URL, existing file, or requirement spec: %r)r   parse
ValueErrorr   )spece r   /builddir/build/BUILDROOT/alt-python37-setuptools-58.3.0-4.el8.x86_64/opt/alt/python37/lib/python3.7/site-packages/setuptools/package_index.pyparse_requirement_arg6   s    

r!   c             C   s   |   }d\}}}|dr|dr8| dd }d}nn|ddrb| d	d
 }| dd }d}nD|dr~| dd }d}n(|ddr| d	d
 }| dd }d}|||fS )z=Return (base,pyversion) or (None,None) for possible .exe name)NNNz.exez
.win32.exeNiwin32z	.win32-pyiiz.win-amd64.exeiz	win-amd64z.win-amd64-pyi)lowerendswith
startswith)namer$   basepy_verplatr   r   r    r   ?   s$    



c       	      C   sx   t j| }|\}}}}}}t j|dd }|dkrX|dkrXt j|dd }d|krp|dd\}}||fS )N/zsourceforge.netdownload#   )urllibr   urlparseunquotesplit)	urlpartsschemeserverpath
parametersqueryfragmentr(   r   r   r    egg_info_for_urlW   s    r=   c             c   sd   t | \}}xt| ||D ]
}|V  qW |r`t|}|r`x$t| |d|tdD ]
}|V  qRW dS )zEYield egg or source distribution objects that might be found at a URLr0   )
precedenceN)r=   distros_for_locationEGG_FRAGMENTmatchr   groupr   )r5   metadatar(   r<   distrA   r   r   r    r   b   s    

c             C   s   | dr|dd }| dr8d|kr8t| ||gS | drxd|krxt|}| s^g S t| |j|jtd dgS | d	rt|\}}}|dk	rt	| |||t
|S x4tD ],}| |r|dt|  }t	| ||S qW g S )
z:Yield egg or source distribution objects based on basenamez.egg.zipNr#   z.egg-z.whlr0   )locationproject_nameversionr>   z.exe)r%   r   from_locationr   is_compatiblerG   rH   r   r   r   r   
EXTENSIONSlen)rF   basenamerC   wheelZwin_baser)   platformextr   r   r    r?   p   s.    



r?   c             C   s   t t| tj| |S )zEYield possible egg or source distribution objects based on a filename)r?   r   osr9   rM   )filenamerC   r   r   r    distros_for_filename   s    rS   c          
   c   s   | d}|s,tdd |dd D r,dS xNtdt|d D ]8}t| |d|d| d||d |||dV  q@W dS )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!
    rE   c             s   s   | ]}t d |V  qdS )z	py\d\.\d$N)rerA   ).0pr   r   r    	<genexpr>   s    z(interpret_distro_name.<locals>.<genexpr>   Nr0   )
py_versionr>   rO   )r4   anyrangerL   r   join)rF   rM   rC   rY   r>   rO   r6   rV   r   r   r    r      s    
$c                s   t   fdd}|S )zs
    Wrap a function returning an iterable such that the resulting iterable
    only ever yields unique items.
    c                 s   t  | |S )N)r   )argskwargs)funcr   r    wrapper   s    zunique_values.<locals>.wrapper)r   )r_   r`   r   )r_   r    unique_values   s    ra   z(<([^>]*\srel\s*=\s*['"]?([^'">]+)[^>]*)>c          	   c   s   xvt |D ]h}| \}}tttj| d}d|ksFd|krx,t	|D ]}t
j| t|dV  qRW qW xHdD ]@}||}|dkr~t	||}|r~t
j| t|dV  q~W dS )zEFind rel="homepage" and rel="download" links in `page`, yielding URLs,Zhomepager-   r0   )z<th>Home Pagez<th>Download URLr,   N)RELfinditergroupssetmapstrstripr$   r4   HREFr1   r   urljoin
htmldecoderB   findsearch)r5   pagerA   tagrelZrelsposr   r   r    find_external_links   s    "

rs   c               @   s(   e Zd ZdZdd Zdd Zdd ZdS )	ContentCheckerzP
    A null content checker that defines the interface for checking content
    c             C   s   dS )z3
        Feed a block of data to the hash.
        Nr   )selfblockr   r   r    feed   s    zContentChecker.feedc             C   s   dS )zC
        Check the hash. Return False if validation fails.
        Tr   )ru   r   r   r    is_valid   s    zContentChecker.is_validc             C   s   dS )zu
        Call reporter with information about the checker (hash name)
        substituted into the template.
        Nr   )ru   reportertemplater   r   r    report   s    zContentChecker.reportN)__name__
__module____qualname____doc__rw   rx   r{   r   r   r   r    rt      s   rt   c               @   sB   e Zd ZedZdd Zedd Zdd Z	dd	 Z
d
d ZdS )HashCheckerzK(?P<hash_name>sha1|sha224|sha384|sha256|sha512|md5)=(?P<expected>[a-f0-9]+)c             C   s   || _ t|| _|| _d S )N)	hash_namehashlibnewhashexpected)ru   r   r   r   r   r    __init__   s    zHashChecker.__init__c             C   s>   t j|d }|st S | j|}|s0t S | f | S )z5Construct a (possibly null) ContentChecker from a URLr,   )r1   r   r2   rt   patternrn   	groupdict)clsr5   r<   rA   r   r   r    from_url  s    zHashChecker.from_urlc             C   s   | j | d S )N)r   update)ru   rv   r   r   r    rw     s    zHashChecker.feedc             C   s   | j  | jkS )N)r   	hexdigestr   )ru   r   r   r    rx     s    zHashChecker.is_validc             C   s   || j  }||S )N)r   )ru   ry   rz   msgr   r   r    r{     s    
zHashChecker.reportN)r|   r}   r~   rT   compiler   r   classmethodr   rw   rx   r{   r   r   r   r    r      s   r   c                   sD  e Zd ZdZdLddZdMd	d
ZdNddZdOddZdd Zdd Z	dd Z
dd Zdd ZdPddZdd ZdQ fdd	Zdd  Zd!d" Zd#d$ Zd%d& Zd'd( ZdRd)d*ZdSd+d,Zd-d. Zd/Zd0d1 Zd2d3 ZdTd4d5Zd6d7 Zd8d9 Zd:d; Zd<d= Zd>d? Z e!dUd@dAZ"dBdC Z#dDdE Z$dFdG Z%dHdI Z&dJdK Z'  Z(S )Vr   z;A distribution index that scans web pages for download URLshttps://pypi.org/simple/*NTc             O   sl   t j| f|| |dd |d   | _i | _i | _i | _td	t
t|j| _g | _tjj| _d S )Nr+   |)r   r   r%   	index_urlscanned_urlsfetched_urlspackage_pagesrT   r   r\   rg   r   rA   allowsto_scanr1   requesturlopenopener)ru   r   hostsZ	ca_bundleZ
verify_sslr]   kwr   r   r    r     s    zPackageIndex.__init__Fc             C   s  || j kr|sdS d| j |< t|s2| | dS tt|}|r\| |sPdS | d| |sn|rn|| jkrtt| j	| dS | |sd| j|< dS | 
d| d| j|< d}| ||| }|dkrdS t|tjjr|jdkr| 
d|j  d| j|j< d|jd	d
 kr(|  dS |j}| }t|tsvt|tjjrXd}n|jdphd}||d}|  x6t|D ](}	tj|t|	 d}
| !|
 qW |"| j#rt$|dddkr| %||}dS )z<Evaluate a URL as a possible download, and maybe retrieve itNTzFound link: %sz
Reading %sz<Download error on %s: %%s -- Some packages may not be found!i  zAuthentication error: %shtmlzcontent-type zlatin-1charsetignorer0   codei  )&r   
URL_SCHEMEprocess_filenamelistr   url_okdebugr   rg   addinfoopen_url
isinstancer1   error	HTTPErrorr   r   r5   headersgetr$   closereadrh   	get_paramdecoderj   rd   r   rk   rl   rB   process_urlr&   r   getattrprocess_index)ru   r5   retrievediststmplfr(   ro   r   rA   linkr   r   r    r   *  sT    





 zPackageIndex.process_urlc             C   s   t j|s| d| d S t j|rb|sbt j|}x(t |D ]}| t j||d qDW t	|}|r| 
d| tt| j| d S )NzNot found: %sTz	Found: %s)rQ   r9   existswarnisdirrealpathlistdirr   r\   rS   r   r   rg   r   )ru   fnnestedr9   itemr   r   r   r    r   _  s    zPackageIndex.process_filenamec             C   sb   t |}|o|d dk}|s8| tj|d r<dS d}|rRt|| n| || d S )Nr0   fileTzN
Note: Bypassing %s (disallowed host; see http://bit.ly/2hrImnY for details).
)	r   rB   r$   r   r1   r   r2   r   r   )ru   r5   fatalsis_filer   r   r   r    r   o  s    zPackageIndex.url_okc             C   s2   t tjj|}dd |D }tt| j| d S )Nc             s   s0   | ](}t |D ]}|d r||fV  qqdS )z	.egg-linkN)rQ   r   r%   )rU   r9   entryr   r   r    rW     s   z.PackageIndex.scan_egg_links.<locals>.<genexpr>)filterrQ   r9   r   r   	itertoolsstarmapscan_egg_link)ru   search_pathdirsZ	egg_linksr   r   r    scan_egg_links|  s    zPackageIndex.scan_egg_linksc          	   C   s   t tj||}ttd ttj|}W d Q R X t	|dkrDd S |\}}x>t
tj||D ](}tjj|f| |_t|_| | q`W d S )NrX   )openrQ   r9   r\   r   r   rg   rh   ri   rL   r	   rF   r   r>   r   )ru   r9   r   Z	raw_lineslinesZegg_pathZ
setup_pathrD   r   r   r    r     s     zPackageIndex.scan_egg_linkc             C   s   d}| | js|S tttjj|t| jd  d}t|dksRd|d krV|S t	|d }t
|d }d| j| i |< t|t|fS )N)NNr+   rX   r/   r0   r   T)r&   r   r   rg   r1   r   r3   rL   r4   r
   r   r   
setdefaultr$   r   )ru   r   ZNO_MATCH_SENTINELr6   pkgverr   r   r    _scan  s    "zPackageIndex._scanc       	   
   C   s   xJt |D ]<}y"| tj|t|d W q tk
rF   Y qX qW | |\}}|sbdS xVt	||D ]H}t
|\}}|dr|s|r|d||f 7 }n
| | | | qnW tdd |S )z#Process the contents of a PyPI pager0   r   z.pyz
#egg=%s-%sc             S   s   d|  ddd S )Nz<a href="%s#md5=%s">%s</a>r0      rX   )rB   )mr   r   r    <lambda>      z,PackageIndex.process_index.<locals>.<lambda>)rj   rd   r   r1   r   rk   rl   rB   r   rs   r=   r%   need_version_infoscan_urlPYPI_MD5sub)	ru   r5   ro   rA   r   r   new_urlr(   fragr   r   r    r     s"    "

zPackageIndex.process_indexc             C   s   |  d| d S )NzPPage at %s links to .py file(s) without version info; an index scan is required.)scan_all)ru   r5   r   r   r    r     s    zPackageIndex.need_version_infoc             G   s:   | j | jkr*|r | j|f|  | d | | j  d S )Nz6Scanning index of all packages (this may take a while))r   r   r   r   r   )ru   r   r]   r   r   r    r     s    zPackageIndex.scan_allc             C   s~   |  | j|j d  | j|js:|  | j|j d  | j|jsR| | x&t| j|jdD ]}|  | qhW d S )Nr+   r   )	r   r   unsafe_namer   r   keyrG   not_found_in_indexr   )ru   requirementr5   r   r   r    find_packages  s    
zPackageIndex.find_packagesc                sR   |    | | x,| |j D ]}||kr.|S | d|| qW tt| ||S )Nz%s does not match %s)prescanr   r   r   superr   obtain)ru   r   	installerrD   )	__class__r   r    r     s    
zPackageIndex.obtainc             C   sL   | | jd|  | sH|  t| td|jjtj	
|f dS )z-
        checker is a ContentChecker
        zValidating %%s checksum for %sz7%s validation failed for %s; possible download problem?N)r{   r   rx   r   rQ   unlinkr   r   r'   r9   rM   )ru   checkerrR   tfpr   r   r    
check_hash  s    

zPackageIndex.check_hashc             C   sR   xL|D ]D}| j dks2t|r2|ds2tt|r>| | q| j | qW dS )z;Add `urls` to the list that will be prescanned for searchesNzfile:)r   r   r&   r   r   r   append)ru   urlsr5   r   r   r    add_find_links  s    


zPackageIndex.add_find_linksc             C   s"   | j rtt| j| j  d| _ dS )z7Scan urls scheduled for prescanning (e.g. --find-links)N)r   r   rg   r   )ru   r   r   r    r     s    zPackageIndex.prescanc             C   s<   | |j  r| jd }}n| jd }}|||j |   d S )Nz#Couldn't retrieve index page for %rz3Couldn't find index page for %r (maybe misspelled?))r   r   r   r   r   )ru   r   methr   r   r   r    r     s    
zPackageIndex.not_found_in_indexc             C   s~   t |tsjt|}|rR| |d||}t|\}}|drN| |||}|S tj	
|rb|S t|}t| ||ddS )a  Locate 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.
        r0   z.pyrF   N)r   r   r   _download_urlrB   r=   r%   	gen_setuprQ   r9   r   r!   r   fetch_distribution)ru   r   tmpdirr7   foundr(   r<   r   r   r    r-     s    

zPackageIndex.downloadc       	         s    d| i d}d
 fdd	}|rH  | ||}|s^|dk	r^|||}|dkrjdk	rx  ||}|dkr|s| ||}|dkrdrdpd| n d| |j|jd	S dS )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.
        zSearching for %sNc                s   |d kr}x|| j  D ]r}|jtkrH sH|krd| d|< q|| ko^|jtkp^ }|r|j}||_tj	
|jr|S qW d S )Nz&Skipping development or system egg: %sr0   )r   r>   r   r   r   r-   rF   download_locationrQ   r9   r   )reqenvrD   testloc)
develop_okru   skippedsourcer   r   r    rm   U  s     z-PackageIndex.fetch_distribution.<locals>.findz:No local packages or working download links found for %s%sza source distribution of r   zBest match: %s)rF   )N)r   r   r   r   r   cloner   )	ru   r   r   
force_scanr   r   Zlocal_indexrD   rm   r   )r   ru   r   r   r   r    r   =  s0    




zPackageIndex.fetch_distributionc             C   s"   |  ||||}|dk	r|jS dS )a3  Obtain 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)r   rF   )ru   r   r   r  r   rD   r   r   r    fetch  s    zPackageIndex.fetchc       
   	   C   s   t |}|r*dd t||dd D p,g }t|dkrtj|}tj||krtj	||}ddl
m} |||st|| |}ttj	|dd2}	|	d|d j|d jtj|d f  W d Q R X |S |rtd	||f ntd
d S )Nc             S   s   g | ]}|j r|qS r   )rH   )rU   dr   r   r    
<listcomp>  s    z*PackageIndex.gen_setup.<locals>.<listcomp>r0   r   )samefilezsetup.pywzIfrom 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.)r@   rA   r   rB   rL   rQ   r9   rM   dirnamer\   Zsetuptools.command.easy_installr  shutilcopy2r   writerG   rH   splitextr   )
ru   rR   r<   r   rA   r   rM   dstr  r   r   r   r    r     s2    

 zPackageIndex.gen_setupi    c          	   C   s  |  d| d }zt|}| |}t|tjjrJtd||j	|j
f |  }d}| j}d}d|kr|d}	ttt|	}| ||||| t|dZ}
xD||}|r|| |
| |d7 }| ||||| qP qW | |||
 W d Q R X |S |r|  X d S )	NzDownloading %szCan't download %s: %s %sr   r,   zcontent-lengthzContent-Lengthwbr0   )r   r   r   r   r   r1   r   r   r   r   r   dl_blocksizeget_allmaxrg   int
reporthookr   r   rw   r  r   r   )ru   r5   rR   fpr   r   blocknumbssizesizesr   rv   r   r   r    _download_to  s:    





zPackageIndex._download_toc             C   s   d S )Nr   )ru   r5   rR   r  Zblksizer  r   r   r    r    s    zPackageIndex.reporthookc          
   C   s  | drt|S yt|| jS  ttjjfk
r } z>ddd |j	D }|r`| 
|| ntd||f |W d d }~X Y n tjjk
r } z|S d }~X Y n tjjk
r } z,|r| 
||j ntd||jf |W d d }~X Y n tjjk
rD } z.|r | 
||j ntd||jf |W d d }~X Y nT tjjtjfk
r } z*|rt| 
|| ntd||f |W d d }~X Y nX d S )Nzfile: c             S   s   g | ]}t |qS r   )rh   )rU   argr   r   r    r    s    z)PackageIndex.open_url.<locals>.<listcomp>z%s %szDownload error for %s: %sz;%s returned a bad status line. The server might be down, %s)r&   
local_openopen_with_authr   r   httpclient
InvalidURLr\   r]   r   r   r1   r   r   URLErrorreasonBadStatusLinelineHTTPExceptionsocket)ru   r5   warningvr   r   r   r    r     s8    
$ zPackageIndex.open_urlc             C   s   t |\}}|r4x&d|kr0|dddd}qW nd}|drN|d d }tj||}|dksn|d	rz| ||S |d
ks|dr| ||S |dr| 	||S |dkrt
jt
j|d S | |d | ||S d S )Nz...\_Z__downloaded__z.egg.zipr#   svnzsvn+gitzgit+zhg+r   rX   T)r=   replacer%   rQ   r9   r\   r&   _download_svn_download_git_download_hgr1   r   url2pathnamer   r2   r   _attempt_download)ru   r7   r5   r   r'   r<   rR   r   r   r    r     s$    


zPackageIndex._download_urlc             C   s   |  |d d S )NT)r   )ru   r5   r   r   r    r   )  s    zPackageIndex.scan_urlc             C   s6   |  ||}d|dd kr.| |||S |S d S )Nr   zcontent-typer   )r  r   r$   _download_html)ru   r5   rR   r   r   r   r    r3  ,  s    zPackageIndex._attempt_downloadc             C   sl   t |}x@|D ]8}| rtd|rD|  t| | ||S P qW |  t| td| d S )Nz <title>([^- ]+ - )?Revision \d+:zUnexpected HTML page found at )	r   ri   rT   rn   r   rQ   r   r/  r   )ru   r5   r   rR   r   r$  r   r   r    r4  3  s    


zPackageIndex._download_htmlc             C   s  t dt |ddd }d}| drd|krtj|\}}}}}}	|s|drd	|d
d  kr|d
d  d	d\}}t	|\}
}|
rd|
kr|
dd\}}d||f }nd|
 }|}||||||	f}tj
|}| d|| td|||f  |S )Nz"SVN download support is deprecatedr/   r0   r   r   zsvn:@z//r+   rX   :z --username=%s --password=%sz --username=z'Doing subversion checkout from %s to %szsvn checkout%s -q %s %s)warningsr   UserWarningr4   r$   r&   r1   r   r2   
_splituser
urlunparser   rQ   system)ru   r5   rR   credsr7   netlocr9   rV   qr   authhostuserpwr6   r   r   r    r/  B  s&    zPackageIndex._download_svnc             C   sp   t j| \}}}}}|ddd }|ddd }d }d|krR|dd\}}t j||||df} | |fS )N+r0   r,   r/   r   r5  r   )r1   r   urlsplitr4   rsplit
urlunsplit)r5   
pop_prefixr7   r=  r9   r;   r   revr   r   r    _vcs_split_rev_from_urlX  s    z$PackageIndex._vcs_split_rev_from_urlc             C   sl   | ddd }| j|dd\}}| d|| td||f  |d k	rh| d| td	||f  |S )
Nr/   r0   r   T)rG  zDoing git clone from %s to %szgit clone --quiet %s %szChecking out %szgit -C %s checkout --quiet %s)r4   rI  r   rQ   r;  )ru   r5   rR   rH  r   r   r    r0  j  s    
zPackageIndex._download_gitc             C   sl   | ddd }| j|dd\}}| d|| td||f  |d k	rh| d| td	||f  |S )
Nr/   r0   r   T)rG  zDoing hg clone from %s to %szhg clone --quiet %s %szUpdating to %szhg --cwd %s up -C -r %s -q)r4   rI  r   rQ   r;  )ru   r5   rR   rH  r   r   r    r1  z  s    
zPackageIndex._download_hgc             G   s   t j|f|  d S )N)r   r   )ru   r   r]   r   r   r    r     s    zPackageIndex.debugc             G   s   t j|f|  d S )N)r   r   )ru   r   r]   r   r   r    r     s    zPackageIndex.infoc             G   s   t j|f|  d S )N)r   r   )ru   r   r]   r   r   r    r     s    zPackageIndex.warn)r   r   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-   r   r  r   r  r  r  r   r   r   r3  r4  r/  staticmethodrI  r0  r1  r   r   r   __classcell__r   r   )r   r    r     sN    

5



		
# 
J
)$
#z!&(#(\d+|x[\da-fA-F]+)|[\w.:-]+);?c             C   s   |  d}t|S )Nr   )rB   r   unescape)rA   whatr   r   r    decode_entity  s    
rN  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&amp;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_subrN  )textr   r   r    rl     s    	rl   c                s    fdd}|S )Nc                s    fdd}|S )Nc           	      s.   t  }t  z
 | |S t | X d S )N)r&  getdefaulttimeoutsetdefaulttimeout)r]   r^   Zold_timeout)r_   timeoutr   r    _socket_timeout  s
    

z@socket_timeout.<locals>._socket_timeout.<locals>._socket_timeoutr   )r_   rT  )rS  )r_   r    rT    s    z'socket_timeout.<locals>._socket_timeoutr   )rS  rT  r   )rS  r    socket_timeout  s    rU  c             C   s2   t j| }| }t|}| }|ddS )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   )r1   r   r3   encodebase64	b64encoder   r.  )r?  Zauth_sZ
auth_bytesZencoded_bytesencodedr   r   r    _encode_auth  s
    
r[  c               @   s(   e Zd ZdZdd Zdd Zdd ZdS )	
Credentialz:
    A username/password pair. Use like a namedtuple.
    c             C   s   || _ || _d S )N)usernamepassword)ru   r]  r^  r   r   r    r     s    zCredential.__init__c             c   s   | j V  | jV  d S )N)r]  r^  )ru   r   r   r    __iter__  s    zCredential.__iter__c             C   s   dt |  S )Nz%(username)s:%(password)s)vars)ru   r   r   r    __str__  s    zCredential.__str__N)r|   r}   r~   r   r   r_  ra  r   r   r   r    r\    s   r\  c               @   s0   e Zd Zdd Zedd Zdd Zdd Zd	S )

PyPIConfigc             C   sP   t dddgd}tj| | tjtjdd}tj	|rL| 
| dS )z%
        Load from ~/.pypirc
        r]  r^  
repositoryr   ~z.pypircN)dictfromkeysconfigparserRawConfigParserr   rQ   r9   r\   
expanduserr   r   )ru   defaultsrcr   r   r    r     s
    zPyPIConfig.__init__c                s&    fdd   D }tt j|S )Nc                s    g | ]}  |d  r|qS )rc  )r   ri   )rU   section)ru   r   r    r    s    z2PyPIConfig.creds_by_repository.<locals>.<listcomp>)sectionsre  rg   _get_repo_cred)ru   Zsections_with_repositoriesr   )ru   r    creds_by_repository  s    zPyPIConfig.creds_by_repositoryc             C   s6   |  |d }|t|  |d |  |d fS )Nrc  r]  r^  )r   ri   r\  )ru   rl  repor   r   r    rn    s    zPyPIConfig._get_repo_credc             C   s*   x$| j  D ]\}}||r|S qW dS )z
        If the URL indicated appears to be a repository defined in this
        config, return the credential for that repository.
        N)ro  itemsr&   )ru   r5   rc  credr   r   r    find_credential  s    
zPyPIConfig.find_credentialN)r|   r}   r~   r   propertyro  rn  rs  r   r   r   r    rb    s   	rb  c             C   s<  t j| }|\}}}}}}|dr2tjd|dkrHt|\}	}
nd}	|	st 	| }|rt
|}	|j| f}tjd	|  |	rdt|	 }	||
||||f}t j|}t j|}|d|	 nt j| }|dt ||}|	r8t j|j\}}}}}}||kr8||
kr8||||||f}t j||_|S )
z4Open a urllib2 request, handling HTTP authenticationr6  znonnumeric port: '')r  httpsN*Authenticating as %s for %s (from .pypirc)zBasic Authorizationz
User-Agent)rv  )r1   r   r2   r%   r  r  r   r9  rb  rs  rh   r]  r   r   r[  r:  r   Request
add_header
user_agentr5   )r5   r   parsedr7   r=  r9   paramsr;   r   r?  addressrr  r   r6   r   r   r  s2h2path2Zparam2Zquery2Zfrag2r   r   r    r    s8    

r  c             C   s    |  d\}}} |r|nd| fS )zNsplituser('user[:passwd]@host[:port]')
    --> 'user[:passwd]', 'host[:port]'.r5  N)
rpartition)r@  rA  delimr   r   r    r9  4  s    r9  c             C   s   | S )Nr   )r5   r   r   r    
fix_sf_url?  s    r  c          
   C   s  t j| \}}}}}}t j|}tj|r<t j| S |	drtj
|rg }xt|D ]b}	tj||	}
|	dkrt|
d}| }W dQ R X P ntj
|
r|	d7 }	|dj|	d qbW d}|j| d|d	}d
\}}n
d\}}}ddi}t|}t j| ||||S )z7Read a local path, with special support for directoriesr+   z
index.htmlrNz<a href="{name}">{name}</a>)r'   zB<html><head><title>{url}</title></head><body>{files}</body></html>rV  )r5   files)   OK)i  zPath not foundz	Not foundzcontent-typez	text/html)r1   r   r2   r   r2  rQ   r9   isfiler   r%   r   r   r\   r   r   r   formatioStringIOr   r   )r5   r7   r8   r9   paramr;   r   rR   r  r   filepathr  bodyr   statusmessager   Zbody_streamr   r   r    r  C  s,    


r  )N)N)N)r   )Yr   sysrQ   rT   r  r	  r&  rX  r   r   r7  rg  r   http.clientr  urllib.parser1   urllib.requesturllib.error	functoolsr   r   pkg_resourcesr   r   r   r   r   r   r	   r
   r   r   r   r   r   	distutilsr   distutils.errorsr   fnmatchr   Zsetuptools.wheelr   Z setuptools.extern.more_itertoolsr   r   r@   Irj   r   rA   r   r4   rK   __all__Z_SOCKET_TIMEOUTZ_tmplr  version_inforz  r!   r   r=   r   r?   rS   r   ra   rc   rs   rt   r   r   r   rO  rN  rl   rU  r[  r\  rh  rb  r   r   r  r9  r  r  r   r   r   r    <module>   s   <
	

!
!!     
&/