o
    $¼"bK  ã                   @   sÞ   d Z ddlmZmZmZ ddlZddlZddlmZm	Z	 ddl
Z
e
jr(ddlZnddl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rmeƒ  dS dS ) z[Implement https://www.python.org/dev/peps/pep-0514/ to discover interpreters - Windows onlyé    )Úabsolute_importÚprint_functionÚunicode_literalsN)ÚbasicConfigÚ	getLoggerc                 c   s:   � d}	 z	t  | |¡V  W n
 ty   Y d S w |d7 }q)Nr   Té   )ÚwinregÚEnumKeyÚOSError)ÚkeyÚat© r   úE/usr/lib/python3/dist-packages/virtualenv/discovery/windows/pep514.pyÚ	enum_keys   s   €ÿûr   c                 C   s(   z	t  | |¡d W S  ty   Y d S w )Nr   )r   ÚQueryValueExr
   )r   Ú
value_namer   r   r   Ú	get_value   s
   ÿr   c                  c   sd   � 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| ||||ƒD ]}|V  q)qd S )NÚHKEY_CURRENT_USERzSoftware\Pythonr   é@   ÚHKEY_LOCAL_MACHINEé    )r   r   r   ÚKEY_WOW64_64KEYÚKEY_WOW64_32KEYÚprocess_set)ÚhiveÚ	hive_namer   ÚflagsÚdefault_archÚspecr   r   r   Údiscover_pythons$   s   €ýÿûr   c                 c   sŠ   � z9t  | |dt j|B ¡�#}t|ƒD ]}|dkrqt||||ƒD ]}|V  q qW d   ƒ W d S 1 s3w   Y  W d S  tyD   Y d S w )Nr   Ú
PyLauncher)r   Ú	OpenKeyExÚKEY_READr   Úprocess_companyr
   )r   r   r   r   r   Úroot_keyÚcompanyr   r   r   r   r   .   s   €ÿý&ÿÿr   c                 c   s`   � t  ||¡�}t|ƒD ]}t| ||||ƒ}|d ur|V  qW d   ƒ d S 1 s)w   Y  d S ©N)r   r!   r   Úprocess_tag)r   r%   r$   r   Úcompany_keyÚtagr   r   r   r   r#   :   s   €€ý"ÿr#   c                 C   sÆ   t  ||¡�S}t| |||ƒ}|d urA|\}}}	t| ||||ƒ}
|
d urIt| |||ƒ}|d urQ|\}}||||
||fW  d   ƒ S W d   ƒ d S W d   ƒ d S W d   ƒ d S 1 s\w   Y  d S r&   )r   r!   Úload_version_dataÚload_arch_dataÚload_exe)r   r%   r(   r)   r   Útag_keyÚversionÚmajorÚminorÚ_ÚarchÚexe_dataÚexeÚargsr   r   r   r'   B   s"   
÷þû"ùr'   c           	   	   C   s>  d  | ||¡}z„t |d  |¡¡�p}|�S t|dƒ}|d u r6t|d ƒ}|d u r-t|dƒ n	tj |tdƒ¡}|d urXtj 	|¡rXt|dƒ}||fW  d   ƒ W  d   ƒ W S t|d  |¡ƒ W d   ƒ n1 sjw   Y  W d   ƒ W d S W d   ƒ W d S 1 s„w   Y  W d S  t
yž   td  |d	¡d
ƒ Y d S w )Nú{}/{}/{}z{}\InstallPathÚExecutablePathz#no ExecutablePath or default for itz
python.exeÚExecutableArgumentsz could not load exe with value {}z{}/{}ÚInstallPathÚmissing)Úformatr   r!   r   ÚmsgÚosÚpathÚjoinÚstrÚexistsr
   )	r   r%   r(   r)   Úkey_pathÚip_keyr4   Úipr5   r   r   r   r,   O   s8   


õÿóÿðÿïþþr,   c              
   C   s`   t |dƒ}|d ur.d | ||¡}zt|ƒW S  ty- } zt||ƒ W Y d }~|S d }~ww |S )NÚSysArchitecturez{}/{}/{}/SysArchitecture)r   r;   Ú
parse_archÚ
ValueErrorr<   )r   r%   r)   r-   r   Úarch_strrB   Úsys_archr   r   r   r+   f   s   

€þr+   c                 C   sX   t | tjƒr!t d| ¡}|rttt| ¡ ƒƒƒS d 	| ¡}t|ƒ‚d 	t
| ƒ¡}t|ƒ‚)Nz
^(\d+)bit$úinvalid format {}zarch is not string: {})Ú
isinstanceÚsixÚstring_typesÚreÚmatchÚintÚnextÚiterÚgroupsr;   ÚreprrG   )rH   rO   Úerrorr   r   r   rF   q   s   
ÿrF   c                 C   s~   t |dƒd | ||¡f|d | ||¡ffD ]'\}}|d ur<zt|ƒW   S  ty; } zt||ƒ W Y d }~qd }~ww qd S )NÚ
SysVersionz{}/{}/{}/SysVersionr6   )r   r;   Úparse_versionrG   r<   )r   r%   r)   r-   Ú	candidaterB   Úsys_versionr   r   r   r*   |   s   þ€ÿýr*   c                 C   sZ   t | tjƒr"t d| ¡}|rtdd„ | ¡ D ƒƒS d | ¡}t	|ƒ‚d t| ƒ¡}t	|ƒ‚)Nz^(\d+)(?:\.(\d+))?(?:\.(\d+))?$c                 s   s$   � | ]}|d urt |ƒnd V  qd S r&   )rP   )Ú.0Úir   r   r   Ú	<genexpr>�   s   €" z parse_version.<locals>.<genexpr>rJ   zversion is not string: {})
rK   rL   rM   rN   rO   ÚtuplerS   r;   rT   rG   )Úversion_strrO   rU   r   r   r   rW   ‰   s   
ÿrW   c                 C   s   t  d | |¡¡ d S )Nz5PEP-514 violation in Windows Registry at {} error: {})ÚLOGGERÚwarningr;   )r>   Úwhatr   r   r   r<   ”   s   r<   c                  C   s:   t ƒ  g } tƒ D ]	}|  t|ƒ¡ qtd t| ƒ¡ƒ d S )NÚ
)r   r   ÚappendrT   Úprintr?   Úsorted)Úinterpretersr   r   r   r   Ú_run˜   s
   
rg   Ú__main__)Ú__doc__Ú
__future__r   r   r   r=   rN   Úloggingr   r   rL   ÚPY3r   Ú_winregÚ__name__r_   r   r   r   r   r#   r'   r,   r+   rF   r*   rW   r<   rg   r   r   r   r   Ú<module>   s4    



ÿ