U
    |e                     @  s   d Z ddlmZ ddlZddlZddlZddlmZmZ ee	Z
dd Zdd Zd	d
 Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Ze	dkre  dS ) z\Implement https://www.python.org/dev/peps/pep-0514/ to discover interpreters - Windows only.    )annotationsN)basicConfig	getLoggerc                 c  s>   d}zt | |V  W n tk
r.   Y q:Y nX |d7 }qd S )Nr      )winregEnumKeyOSError)keyat r   G/tmp/pip-unpacked-wheel-tuxcr54r/virtualenv/discovery/windows/pep514.py	enum_keys   s    
r   c                 C  s.   zt | |d W S  tk
r(   Y d S X d S )Nr   )r   QueryValueExr   )r	   Z
value_namer   r   r   	get_value   s    r   c                  c  s\   t jddddft jddt jdft jddt jdffD ]$\} }}}}t| ||||E d H  q2d S )NHKEY_CURRENT_USERzSoftware\Pythonr   @   HKEY_LOCAL_MACHINE    )r   r   r   ZKEY_WOW64_64KEYZKEY_WOW64_32KEYprocess_set)hive	hive_namer	   flagsdefault_archr   r   r   discover_pythons   s
    r   c              	   c  sl   zRt | |dt j|B 2}t|D ]"}|dkr0q"t||||E d H  q"W 5 Q R X W n tk
rf   Y nX d S )Nr   Z
PyLauncher)r   	OpenKeyExZKEY_READr   process_companyr   )r   r   r	   r   r   root_keycompanyr   r   r   r   '   s    $r   c              	   c  sH   t ||2}t|D ]"}t| ||||}|d k	r|V  qW 5 Q R X d S N)r   r   r   process_tag)r   r   r   r   company_keytagspecr   r   r   r   2   s
    r   c              
   C  s   t ||}t| |||}|d k	r|\}}}	t| ||||}
|
d k	rt| |||}|d k	r|\}}||||
||fW  5 Q R  S W 5 Q R  d S W 5 Q R  d S W 5 Q R  d S Q R X d S r   )r   r   load_version_dataload_arch_dataload_exe)r   r   r    r!   r   tag_keyversionmajorminor_archZexe_dataexeargsr   r   r   r   :   s    
r   c           	      C  s   |  d| d| }zt || d}| t|d}|d krnt|d }|d kr`t|d ntj|d}|d k	rtj|rt|d}||fW  5 Q R  W  5 Q R  W S t|d|  W 5 Q R X W 5 Q R X W n$ tk
r   t| dd	 Y nX d S )
N/z\InstallPathZExecutablePathz#no ExecutablePath or default for itz
python.exeZExecutableArgumentszcould not load exe with value z/InstallPathmissing)	r   r   r   msgospathjoinexistsr   )	r   r   r    r!   key_pathZip_keyr,   ipr-   r   r   r   r%   J   s     


"(r%   c              
   C  sd   t |d}|d k	r`|  d| d| d}z
t|W S  tk
r^ } zt|| W 5 d }~X Y nX |S )NZSysArchitecturer.   z/SysArchitecture)r   
parse_arch
ValueErrorr0   )r   r   r!   r&   r   arch_strr5   Zsys_archr   r   r   r$   _   s    

r$   c                 C  sP   t | tr:td| }|r.ttt| S d|  }n
d| }t|d S )Nz
^(\d+)bit$invalid format zarch is not string: )	
isinstancestrrematchintnextitergroupsr8   )r9   r>   errorr   r   r   r7   j   s    

r7   c                 C  s   t |d|  d| d| df||  d| d| ffD ]L\}}|d k	r8zt|W   S  tk
r } zt|| W 5 d }~X Y q8X q8d S )NZ
SysVersionr.   z/SysVersion)r   parse_versionr8   r0   )r   r   r!   r&   	candidater5   sys_versionr   r   r   r#   u   s    r#   c                 C  sR   t | tr<td| }|r0tdd | D S d|  }n
d| }t|d S )Nz^(\d+)(?:\.(\d+))?(?:\.(\d+))?$c                 s  s"   | ]}|d k	rt |nd V  qd S r   )r?   ).0ir   r   r   	<genexpr>   s     z parse_version.<locals>.<genexpr>r:   zversion is not string: )r;   r<   r=   r>   tuplerB   r8   )version_strr>   rC   r   r   r   rD      s    

rD   c                 C  s   t d| | d S )Nz5PEP-514 violation in Windows Registry at %s error: %s)LOGGERwarning)r2   whatr   r   r   r0      s    r0   c                  C  s,   t   dd t D } tdt|  d S )Nc                 S  s   g | ]}t |qS r   )repr)rG   r"   r   r   r   
<listcomp>   s     z_run.<locals>.<listcomp>
)r   r   printr3   sorted)interpretersr   r   r   _run   s    rU   __main__)__doc__
__future__r   r1   r=   r   loggingr   r   __name__rL   r   r   r   r   r   r   r%   r$   r7   r#   rD   r0   rU   r   r   r   r   <module>   s*   
	