B
    `;                 @   s   d Z ddlmZmZmZ e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mZmZmZmZmZmZmZ ddlmZ dddZdd Zdd Zdd Zdd Zdd ZdS )zVirtual environment management.    )absolute_importdivisionprint_functionN   )types)EnvironmentConfig)find_pythonSubprocessErrorget_available_python_versionsSUPPORTED_PYTHON_VERSIONSANSIBLE_TEST_DATA_ROOTdisplayremove_tree)run_commandFTc             C   s>  t j|r&tjd||f dd dS t|dd}tdd |d	D }|sRdS |d
krx<t| |D ].}t	| ||||rftjd||f dd dS qfW t
| |||||rtjd||f dd dS tt}xlt| D ]\\}	}
t| |
}|sq|dkr|dkrqt
| |
||||rtjd||	|f dd dS qW dS )zWCreate a virtual environment using venv or virtualenv for the requested Python version.z0Using existing Python %s virtual environment: %sr   )	verbosityTF)requiredc             s   s   | ]}t |V  qd S )N)int).0v r   J/home/dcms/DCMS/lib/python3.7/site-packages/ansible_test/_internal/venv.py	<genexpr>*   s    z-create_virtual_environment.<locals>.<genexpr>.)   r   z6Created Python %s virtual environment using "venv": %sz<Created Python %s virtual environment using "virtualenv": %s)      )   r   r   zICreated Python %s virtual environment using "virtualenv" on Python %s: %s)ospathisdirr   infor   tuplesplititerate_real_pythonsrun_venvrun_virtualenvr
   r   sorteditemsget_virtualenv_version)argsversionr   system_site_packagespippythonpython_versionZreal_pythonZavailable_pythonsZavailable_python_versionZavailable_python_interpreterZvirtualenv_versionr   r   r   create_virtual_environment   s4    
r/   c             c   s   t dd |dD }d}|tjdt| krdtj}t| |}|rZt|tj	
|d}|rd|V  tjdtj	j}|s~dS t||}|sdS ||krdS t| |}|rt|tj	
|d}|r|V  dS )z
    Iterate through available real python interpreters of the requested version.
    The current interpreter will be checked and then the path will be searched.
    c             s   s   | ]}t |V  qd S )N)r   )r   nr   r   r   r   ]   s    z'iterate_real_pythons.<locals>.<genexpr>r   NbinPATH)r!   r"   sysversion_infolen
executableget_python_real_prefixr   r   r   joinenvirongetdefpath)r)   r*   r4   Zcurrent_pythonreal_prefixr   Zfound_pythonr   r   r   r#   X   s,    


r#   c             C   s@   |t jt jtdg}tt| |dddd }|d }|S )z
    Return the real prefix of the specified interpreter or None if the interpreter is not a virtual environment created by 'virtualenv'.
    zvirtualenvcheck.pyT)capturealwaysr   r<   )r   r   r8   r   jsonloadsr   )r)   r   cmdZcheck_resultr<   r   r   r   r7      s    r7   c          
   C   s   |ddg}|r| d |s&| d | | yt| |dd W n> tk
r } z t| | jdkrpt| dS d	}~X Y nX dS )
zRCreate a virtual environment using the 'venv' module. Not available on Python 2.x.z-mZvenvz--system-site-packagesz--without-pipT)r=   r   FN)appendr   r	   r   r   r   error)r)   
run_pythonr+   r,   r   rA   exr   r   r   r$      s    





r$   c          
   C   s   |ddd|g}|r| d |s*| d | | yt| |dd W n> tk
r } z t| | jdkrtt| d	S d
}~X Y nX dS )z;Create a virtual environment using the 'virtualenv' module.z-m
virtualenvz--pythonz--system-site-packagesz--no-pipT)r=   r   FN)rB   r   r	   r   r   r   rC   )r)   rD   Z
env_pythonr+   r,   r   rA   rE   r   r   r   r%      s    





r%   c          
   C   s   yt jS  tk
r   Y nX dt _|dddg}yt| |ddd }W n: tk
r~ } z| jdkrjt| d	}W dd}~X Y nX |ry"td
d |	 
dD t _W n tk
r   Y nX t jS )zIGet the virtualenv version for the given python intepreter, if available.Nz-mrF   z	--versionT)r=   r   r    c             s   s   | ]}t |V  qd S )N)r   )r   r   r   r   r   r      s    z)get_virtualenv_version.<locals>.<genexpr>r   )r(   resultAttributeErrorr   r	   r   r   rC   r!   stripr"   	Exception)r)   r-   rA   stdoutrE   r   r   r   r(      s$    

"r(   )FT)__doc__
__future__r   r   r   type__metaclass__r?   r   r3   rG   r   tconfigr   utilr   r	   r
   r   r   r   r   Zutil_commonr   r/   r#   r7   r$   r%   r(   r   r   r   r   <module>   s    $
 
6(
!