U
    La-                     @   s  d Z ddlmZmZmZ ddlZddlZddlZddlm	Z	 ddl
mZ ddlZddlmZ ejdkr|dd	lmZ d
d Zn@ddlmZ ddlmZ ddlZddlZG dd deZdd Zdd Zdd Zdd Zdd Zd%ddZG dd deZd&dd Z d'd!d"Z!d(d#d$Z"dS ))z%Management operations for pypiserver.    )absolute_importprint_functionunicode_literalsNLooseVersion)call   )core)   r   Serverc                 C   s   t | S Nr   )url r   5/tmp/pip-unpacked-wheel-8ds7z0ev/pypiserver/manage.pymake_pypi_client   s    r   )	Transport)ServerProxyc                   @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
ProxiedTransportc                 C   s
   || _ d S r   )proxy)selfr   r   r   r   	set_proxy   s    zProxiedTransport.set_proxyc                 C   s(   || _ tjdk rtj}ntj}|| jS )Ni  )realhostsys
hexversionhttplibHTTPHTTPConnectionr   )r   hostZ_http_connectionr   r   r   make_connection   s
    
z ProxiedTransport.make_connectionc                 C   s   | dd| j|f  d S )NPOSTzhttp://%s%s)
putrequestr   )r   
connectionhandlerrequest_bodyr   r   r   send_request'   s     zProxiedTransport.send_requestc                 C   s   | d| j d S )NHost)	putheaderr   )r   r"   r   r   r   r   	send_host+   s    zProxiedTransport.send_hostN)__name__
__module____qualname__r   r   r%   r(   r   r   r   r   r      s   r   c                 C   sN   t  dd}|r>t t |d d }t }|| nd }t| |dS )Nhttp r   r   )	transport)urllib
getproxiesget	splithost	splittyper   r   r   )r   Zhttp_proxy_urlZhttp_proxy_specr.   r   r   r   r   .   s    c                 C   sF   dD ]}|| kr dS q| D ]$}| dr0 dS | dr dS qdS )N)z*cz*@z*bFz*finalT*)
startswith)Zpversionxr   r   r   is_stable_version;   s    

r7   c                 c   s   | D ]}t |jr|V  qd S r   )r7   parsed_version)releasespkgr   r   r   filter_stable_releasesG   s    
r;   c                 C   sL   i }| D ]:}t |j}||kr*|||< q|j|| jkr|||< q| S r   )r	   Znormalize_pkgnamepkgnamer8   values)pkgsZpkgname2latestr6   r<   r   r   r   filter_latest_pkgsM   s    

r?   c                 c   s6   |D ],}t |}|| jkrt j| j|| dV  qd S )N)r<   versionreplaces)r	   parse_versionr8   ZPkgFiler<   )r:   versionsr6   r8   r   r   r   build_releases[   s    

rD   Tc              	   C   s  t  }|rtndd }dd }tt| }tjdt|  t  }td}t	|D ]\}}	|d dkrp|d	 |
|	j}
|
r|t|	|
}d
}z|t|dd d d}W q tk
r   Y qX nd}||	j || qT|d |rtjddt|f  |S )Nc                 S   s   | S r   r   r6   r   r   r   <lambda>f       zfind_updates.<locals>.<lambda>c                 S   s   t j|  t j  d S r   )r   stdoutwriteflush)sr   r   r   rI   h   s    zfind_updates.<locals>.writez'checking %s packages for newer version
zhttps://pypi.org/pypi/(   r   
.c                 S   s   | j S r   )r8   rE   r   r   r   rF   }   rG   keyuez

z"no releases found on pypi for %s

, )setr;   	frozensetr?   r   rH   rI   lenr   	enumerateZpackage_releasesr<   rD   addmax
ValueErrorjoinsorted)pkgsetstable_onlyZno_releasesZfilter_releasesrI   Zlatest_pkgsneed_updatepypicountr:   Zpypi_versionsr9   statusr   r   r   find_updatesd   s<    

rc   c                   @   s*   e Zd ZdZedd ZedddZdS )	PipCmdz$Methods for generating pip commands.c                 c   s2   t | t dk }dD ]
}|V  q|r(dndV  dS )z;Yield an appropriate root command depending on pip version.z10.0)pipz-qinstalldownloadNr   )pip_versionZ
legacy_pippartr   r   r   update_root   s    zPipCmd.update_roothttps://pypi.org/simplec                 c   s<   | D ]
}|V  qdd|d|fD ]
}|V  qd ||V  dS )z Yield an update command for pip.z	--no-depsz-iz-dz{}=={}N)format)Zcmd_rootdestdirpkg_nameZpkg_versionindexri   r   r   r   update   s
    zPipCmd.updateN)rk   )r)   r*   r+   __doc__staticmethodrj   rp   r   r   r   r   rd      s   
 rd   Fc                 C   sb   t d|  ttttj|p0tj	
| jj| j| j}t dd| |s^t| dS )z.Print and optionally execute a package update.z=# update {0.pkgname} from {0.replaces.version} to {0.version}z{}
 N)printrl   tuplerd   rp   rj   re   __version__ospathdirnamerA   fnr<   r@   r[   r   )r:   rm   dry_runcmdr   r   r   update_package   s     
	r}   c                 C   s4   t | |d}t|dd dD ]}t|||d qdS )av  Print and optionally execute pip update commands.

    :param pkgset: the set of currently available packages
    :param str destdir: the destination directory for downloads
    :param dry_run: whether commands should be executed (rather than
        just being printed)
    :param stable_only: whether only stable (non prerelease) updates
        should be considered.
    )r^   c                 S   s   | j S r   r<   rE   r   r   r   rF      rG   zupdate.<locals>.<lambda>rO   )r{   N)rc   r\   r}   )r]   rm   r{   r^   r_   r:   r   r   r   rp      s    
rp   c                    sn   t jdd | D  }t  |rFtt| td|dt  t	 fdd|D }t
|||| d S )Nc                 S   s   g | ]}t |qS r   )r	   listdir).0rr   r   r   
<listcomp>   s     z'update_all_packages.<locals>.<listcomp>z<Skipping update of blacklisted packages (listed in "{}"): {}rS   c                    s   g | ]}|j  kr|qS r   r~   )r   r:   Zskip_packagesr   r   r      s     
 )	itertoolschainrT   r	   
read_linesrt   rl   r[   r\   rU   rp   )rootsrm   r{   r^   Zblacklist_fileZall_packagespackagesr   r   r   update_all_packages   s     r   )T)F)NFT)NFTN)#rq   
__future__r   r   r   r   rw   r   Zdistutils.versionr   
subprocessr   re   r-   r	   version_infoxmlrpc.clientr   r   	xmlrpclibr   r   r   r/   r   r7   r;   r?   rD   rc   objectrd   r}   rp   r   r   r   r   r   <module>   s4   

	
,

