B
    v9aR  ã            
   @   sÂ   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e  e¡Z	G dd„ dƒZ
ddd„Zddd„Zed	kr¾d
Zyeƒ  d ZW n4 ek
r² Z zede ejd W ddZ[X Y nX e e¡ dS )é    Nc               @   s†   e Zd Zddd„Zdd„ Zdd„ Zd	d
„ Zdd„ Zej	dkrHddd„Z
n
ddd„Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ ZdS ) Ú
EnvBuilderFNc             C   s(   || _ || _|| _|| _|| _|| _d S )N)Úsystem_site_packagesÚclearÚsymlinksÚupgradeÚwith_pipÚprompt)Úselfr   r   r   r   r   r   © r
   ú/usr/lib/python3.7/__init__.pyÚ__init__+   s    zEnvBuilder.__init__c             C   sx   t j |¡}|  |¡}| j}d| _|  |¡ |  |¡ | jrF|  |¡ | j	s`|  
|¡ |  |¡ |rtd| _|  |¡ d S )NFT)ÚosÚpathÚabspathÚensure_directoriesr   Úcreate_configurationÚsetup_pythonr   Ú
_setup_pipr   Úsetup_scriptsÚ
post_setup)r	   Úenv_dirÚcontextZtrue_system_site_packagesr
   r
   r   Úcreate4   s    





zEnvBuilder.createc             C   s`   xZt  |¡D ]L}t j ||¡}t j |¡s6t j |¡rBt  |¡ qt j |¡rt 	|¡ qW d S )N)
r   Úlistdirr   ÚjoinÚislinkÚisfileÚremoveÚisdirÚshutilZrmtree)r	   r   Úfnr
   r
   r   Úclear_directoryN   s    zEnvBuilder.clear_directoryc             C   sœ  dd„ }t j |¡r$| jr$|  |¡ t ¡ }||_t j |¡d |_	| j
d k	rT| j
n|j	}d| |_
||ƒ t j}ttdtjƒ}t j t j |¡¡\}}||_||_||_tjdkrÎd}	d}
t j |d	d
¡}n(d}	d}
t j |ddtjd d…  d
¡}t j ||
¡ |_}||ƒ ||ƒ tjdkrft jdkrftjdkrft j |d¡}t j |¡sft  d|¡ t j ||	¡ |_}|	|_t j ||¡|_||ƒ |S )Nc             S   s@   t j | ¡st  | ¡ n$t j | ¡s0t j | ¡r<td|  ƒ‚d S )NzUnable to create directory %r)r   r   ÚexistsÚmakedirsr   r   Ú
ValueError)Údr
   r
   r   Úcreate_if_needed^   s    z7EnvBuilder.ensure_directories.<locals>.create_if_neededé   z(%s) Ú_base_executableÚwin32ZScriptsZIncludeÚLibzsite-packagesÚbinZincludeÚlibzpython%d.%dé   l        ÚposixÚdarwinZlib64)r   r   r"   r   r!   ÚtypesÚSimpleNamespacer   ÚsplitÚenv_namer   ÚenvironÚgetattrÚsysÚ
executabler   Ú
python_dirZ
python_exeÚplatformr   Úversion_infoZinc_pathÚmaxsizeÚnameÚsymlinkÚbin_pathÚbin_nameÚenv_exe)r	   r   r&   r   r   Úenvr7   ÚdirnameZexenameZbinnameZincpathZlibpathr   Z	link_pathÚbinpathr
   r
   r   r   V   sJ    



zEnvBuilder.ensure_directoriesc          	   C   sz   t j |jd¡ |_}t|dddL}| d|j ¡ | jrBd}nd}| d| ¡ | d	t	j
d d
…  ¡ W d Q R X d S )Nz
pyvenv.cfgÚwzutf-8)Úencodingz
home = %s
ÚtrueZfalsez"include-system-site-packages = %s
zversion = %d.%d.%d
é   )r   r   r   r   Zcfg_pathÚopenÚwriter8   r   r6   r:   )r	   r   r   ÚfZinclr
   r
   r   r   ‹   s    	zEnvBuilder.create_configurationÚntc             C   s~   | j  }|sjy6tj |¡s@|r4t tj |¡|¡ nt ||¡ W n& tk
rh   t d||¡ d}Y nX |rzt	 
||¡ d S )NzUnable to symlink %r to %rT)r   r   r   r   r=   ÚbasenameÚ	ExceptionÚloggerÚwarningr   Úcopyfile)r	   ÚsrcÚdstÚrelative_symlinks_okZ
force_copyr
   r
   r   Úsymlink_or_copyŸ   s    
zEnvBuilder.symlink_or_copyc             C   sZ  t j |¡ot j |¡ }| jr~|s~t j |¡s~y*|rLt  t j |¡|¡ nt  ||¡ d S  tk
r|   t	 
d||¡ Y nX t j t j |¡¡\}}t j t j t¡dd|| ¡}t d¡sÌt j |¡s"| d¡rêd| }|d d… }|dkrød}n|d	krd
}t j t j |¡|| ¡}n|}t j |¡sJ|sFt	 
d|¡ d S t ||¡ d S )NzUnable to symlink %r to %rÚscriptsrK   TZ_déþÿÿÿÚpythonZvenvlauncherZpythonwZvenvwlauncherzUnable to copy %r)r   r   Úlexistsr"   r   r   r=   rL   rM   rN   rO   Úsplitextr   rB   Ú__file__Ú	sysconfigÚis_python_buildr   Úendswithr   rP   )r	   rQ   rR   rS   Zbad_srcrL   ZextZsrcfnr
   r
   r   rT   ²   s:    


c             C   s®  |j }|j}| j}|j}tjdkrš||j|ƒ tj |¡sFt 	|d¡ xNdD ]F}tj 
||¡}tj |¡sL||j|dd tj |¡sLt 	|d¡ qLW n| jrÎdd„ t |¡D ƒ}t d¡rÚdd„ |D ƒ}nd	d
ddg}x:|D ]2}tj 
||¡}tj |¡rà||tj 
||¡ƒ qàW t d¡rªx†t |j¡D ]v\}	}
}d|kr0tj |	¡}tj 
|jd|¡}tj |¡szt |¡ tj 
|	d¡}tj 
|d¡}t ||¡ P q0W d S )NrK   ií  )rW   Zpython3T)rS   c             S   s,   g | ]$}t j t j |¡d  ¡dkr|‘qS )r'   )z.exez.dll)r   r   ÚnormcaserY   )Ú.0rJ   r
   r
   r   ú
<listcomp>û   s    z+EnvBuilder.setup_python.<locals>.<listcomp>c             S   s"   g | ]}t j |¡ d ¡r|‘qS ))rW   Z	vcruntime)r   r   r^   Ú
startswith)r_   rJ   r
   r
   r   r`      s    z
python.exezpython_d.exezpythonw.exezpythonw_d.exezinit.tclr*   )r>   r@   rT   r8   r   r<   r7   r   r   Úchmodr   r"   r   r   r[   r\   rX   ÚwalkrL   r   r#   r   rP   )r	   r   rC   r   ZcopierrB   ÚsuffixÚsuffixesrQ   ÚrootÚdirsÚfilesZtcldirrR   r
   r
   r   r   Ý   sF    





zEnvBuilder.setup_pythonc             C   s$   |j ddddg}tj|tjd d S )Nz-ImZ	ensurepipz	--upgradez--default-pip)Ústderr)r@   Ú
subprocessZcheck_outputZSTDOUT)r	   r   Úcmdr
   r
   r   r     s    
zEnvBuilder._setup_pipc             C   s2   t j t j t¡¡}t j |d¡}|  ||¡ d S )NrU   )r   r   r   rB   rZ   r   Úinstall_scripts)r	   r   r   r
   r
   r   r   "  s    zEnvBuilder.setup_scriptsc             C   s   d S )Nr
   )r	   r   r
   r
   r   r   1  s    zEnvBuilder.post_setupc             C   sJ   |  d|j¡}|  d|j¡}|  d|j¡}|  d|j¡}|  d|j¡}|S )NZ__VENV_DIR__Z__VENV_NAME__Z__VENV_PROMPT__Z__VENV_BIN_NAME__Z__VENV_PYTHON__)Úreplacer   r3   r   r?   r@   )r	   Útextr   r
   r
   r   Úreplace_variables;  s    zEnvBuilder.replace_variablesc             C   s¾  |j }t|ƒ}x¨t |¡D ]˜\}}}||kr`x,|d d … D ]}|dtjfkr>| |¡ q>W qxR|D ]H}	tjdkrŽ|	 d¡rŽ|	 d¡rŽqhtj 	||	¡}
||d …  
tj¡dd … }|sÂ|}ntjj	|f|žŽ }tj |¡sêt |¡ tj 	||	¡}t|
dƒ}	|	 ¡ }W d Q R X |
 d¡s~y$| d¡}|  ||¡}| d¡}W n6 tk
r| } zd }t d|
|¡ W d d }~X Y nX |d k	rht|d	ƒ}	|	 |¡ W d Q R X t |
|¡ qhW qW d S )
NÚcommonrK   rW   )z.exez.pdbr-   Úrbzutf-8z+unable to copy script %r, may be binary: %sÚwb)r>   Úlenr   rc   r<   r   ra   r]   r   r   r2   Úsepr"   r#   rH   ÚreadÚdecodero   ÚencodeÚUnicodeErrorrN   rO   rI   r   Zcopymode)r	   r   r   rC   Zplenrf   rg   rh   r%   rJ   Zsrcfilerd   ZdstdirZdstfileÚdataÚer
   r
   r   rl   M  sF    


zEnvBuilder.install_scripts)FFFFFN)F)F)Ú__name__Ú
__module__Ú__qualname__r   r   r!   r   r   r   r<   rT   r   r   r   r   ro   rl   r
   r
   r
   r   r      s    
5

+<	
r   Fc             C   s    t |||||d}| | ¡ d S )N)r   r   r   r   r   )r   r   )r   r   r   r   r   r   Úbuilderr
   r
   r   r   €  s    r   c       	      C   sb  d}t jdk rd}ntt dƒs"d}|s2tdƒ‚n,dd l}|jtddd	}|jd
dddd |jdddddd tj	dkr€d}nd}| 
¡ }|jd|dddd |jd| dddd |jdddddd |jddddd d |jd!d"ddd#d$ |jd%d&d' | | ¡}|jr"|jr"td(ƒ‚t|j|j|j|j|j|jd)}x|jD ]}| |¡ qJW d S )*NT)rG   rG   FÚbase_prefixz.This script is only for use with Python >= 3.3r   zFCreates virtual Python environments in one or more target directories.z|Once an environment has been created, you may wish to activate it, e.g. by sourcing an activate script in its bin directory.)ÚprogÚdescriptionÚepilogrg   ZENV_DIRú+z)A directory to create the environment in.)ÚmetavarÚnargsÚhelpz--system-site-packagesÚ
store_trueÚsystem_sitezDGive the virtual environment access to the system site-packages dir.)ÚdefaultÚactionÚdestr†   rK   z
--symlinksr   z[Try to use symlinks rather than copies, when symlinks are not the default for the platform.z--copiesÚstore_falsez\Try to use copies rather than symlinks, even when symlinks are the default for the platform.z--clearr   zcDelete the contents of the environment directory if it already exists, before environment creation.z	--upgrader   zlUpgrade the environment directory to use this version of Python, assuming Python has been upgraded in-place.z--without-pipr   z]Skips installing or upgrading pip in the virtual environment (pip is bootstrapped by default))r‹   r‰   rŠ   r†   z--promptz;Provides an alternative prompt prefix for this environment.)r†   z1you cannot supply --upgrade and --clear together.)r   r   r   r   r   r   )r6   r:   Úhasattrr$   ÚargparseÚArgumentParserr{   Úadd_argumentr   r<   Úadd_mutually_exclusive_groupÚ
parse_argsr   r   r   rˆ   r   r   r   rg   r   )	ÚargsZ
compatiblerŽ   ÚparserZuse_symlinksÚgroupÚoptionsr~   r%   r
   r
   r   Úmainˆ  s\    










r—   Ú__main__r'   z	Error: %s)Úfile)FFFFN)N)Zloggingr   r   rj   r6   r[   r0   Z	getLoggerr{   rN   r   r   r—   ZrcrM   rz   Úprintri   Úexitr
   r
   r
   r   Ú<module>   s*   
  p 

H$