o
    �PÔa5  ã                   @   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mZ d dl	m
Z
 d dlmZmZ d dlmZ d dlmZ d dlmZmZ d dlmZ d d	lmZmZmZmZmZmZ d d
lmZ e  e!¡Z"dZ#dZ$de%de%dee% de%dee% dee% de&de&de&defdd„Z'dede%de%de%dee% de%dee% dee% de&de&defdd„Z(de%de%dee% dee% def
dd„Z)dede&fdd „Z*d!ed"ede&ddfd#d$„Z+d*d%d&„Z,d'e%de%fd(d)„Z-dS )+é    N)ÚPath)Úwhich)ÚListÚNoReturn)Ú	constants)Úpackage_name_from_spec)Ú#TEMP_VENV_EXPIRATION_THRESHOLD_DAYSÚWINDOWS)Úhazard)Ú	PipxErrorÚexec_appÚget_pypackage_bin_pathÚ	pipx_wrapÚrmdirÚrun_pypackage_bin)ÚVenvÚpipx_expired_venvzn'{app}' executable script not found in package '{package_name}'.
Available executable scripts:
    {app_lines}ÚappÚpackage_or_urlÚapp_argsÚpythonÚpip_argsÚ	venv_argsÚ
pypackagesÚverboseÚ	use_cacheÚreturnc	                 C   sp  t j | ¡jr#|  d¡stdƒ‚t d¡ t| ƒ}	t	t
|ƒd|	gƒ nt| ƒr<t tdt› d| › dt| ƒ› d�d	d
�¡ trM| › d�}
t d|
›d�¡ n| }
t| ƒ}| ¡ rft dt
|ƒ› �¡ t||ƒ |rrtdt
|ƒ›d�ƒ‚t||||ƒ}t|ƒ}|j|
 }t|||ƒ | | |
¡rŸt d|› �¡ | | |
|¡ dS t d|› �¡ tt|ƒ|| |
||||||ƒ
 dS )zUInstalls venv to temporary dir (or reuses cache), then runs app from
    package
    z.pyz¯
                pipx will only execute apps from the internet directly if they
                end with '.py'. To run from an SVN, try pipx --spec URL BINARY
                z9Detected url. Downloading and executing as a Python file.z-cz
                z  z: is already on your PATH and installed at
                z2. Downloading and running anyway.
                z    )Úsubsequent_indentú.exeúAssuming app is ú (Windows only)z/Using app in local __pypackages__ directory at z1
            '--pypackages' flag was passed, but zŠ was
            not found. See https://github.com/cs01/pythonloc to learn how to
            install here, or omit the flag.
            zReusing cached venv zvenv location is N)ÚurllibÚparseÚurlparseÚschemeÚendswithr   ÚloggerÚinfoÚ_http_get_requestr   Ústrr   Úwarningr   r
   r	   r   Úexistsr   Ú_get_temporary_venv_pathr   Úbin_pathÚ_prepare_venv_cacheÚhas_appÚrun_appÚ_download_and_runr   )r   r   r   r   r   r   r   r   r   ÚcontentÚapp_filenameÚpypackage_bin_pathÚvenv_dirÚvenvr-   © r7   ú3/usr/lib/python3/dist-packages/pipx/commands/run.pyÚrun$   sr   
ÿ
ÿÿþûÿ

ÿ
ÿÿ
ör9   r5   r3   c
                    s  t | ||	d�}
|
 ||¡ |
jjjd ur|
jjj‰ nt||||	d�‰ |
jˆ ||dddd� |
 ||¡s||
jjj}|ˆ krdt	|ƒdkrd|d }t
d|›d	ˆ ›�ƒ tra|› d
�}t d|›d�¡ n|}n‡ fdd„|D ƒ}ttj|ˆ d |¡d�dd�‚|s„| t  ¡  |
 |||¡ d S )N)r   r   )r   r   FT)Úpackage_namer   r   Úinclude_dependenciesÚinclude_appsÚis_main_packageé   r   zNOTE: running app z from r   r   r    c                 3   s&   � | ]}|› d ˆ › d|› d�V  qdS )z - usage: 'pipx run --spec ú z [arguments?]'Nr7   )Ú.0Úa©r:   r7   r8   Ú	<genexpr>¥   s
   € ÿ
ÿz$_download_and_run.<locals>.<genexpr>z
    )r   r:   Ú	app_lines)Úwrap_message)r   Úcreate_venvÚpipx_metadataÚmain_packageÚpackager   Úinstall_packager/   ÚappsÚlenÚprintr	   r&   r'   r   ÚAPP_NOT_FOUND_ERROR_MESSAGEÚformatÚjoinÚVENV_EXPIRED_FILENAMEÚtouchr0   )r5   r   r   r3   r   r   r   r   r   r   r6   rK   Úall_appsr7   rB   r8   r1   y   sL   ÿú	


þýú	r1   c                 C   sj   t  ¡ }| |  ¡ ¡ | | ¡ ¡ | d |¡ ¡ ¡ | d |¡ ¡ ¡ | ¡ dd… }ttjƒ| S )a  Computes deterministic path using hashing function on arguments relevant
    to virtual environment's end state. Arguments used should result in idempotent
    virtual environment. (i.e. args passed to app aren't relevant, but args
    passed to venv creation are.)
    Ú r   é   )	ÚhashlibÚsha256ÚupdateÚencoderP   Ú	hexdigestr   r   ÚPIPX_VENV_CACHEDIR)r   r   r   r   ÚmÚvenv_folder_namer7   r7   r8   r,   ¹   s   r,   c                 C   sB   |   ¡ j}t tj ¡  ¡ ¡}|| }dt }||kp | t  	¡ S )Ni€Q )
ÚstatÚst_ctimeÚtimeÚmktimeÚdatetimeÚnowÚ	timetupler   rQ   r+   )r5   Úcreated_time_secÚcurrent_time_secÚageÚexpiration_threshold_secr7   r7   r8   Ú_is_temporary_venv_expiredÊ   s
   
ri   r6   r-   c                 C   s8   | j }|s| ¡ rt dt|ƒ› �¡ t|ƒ tƒ  d S )NzRemoving cached venv )Úrootr+   r&   r'   r)   r   Ú_remove_all_expired_venvs)r6   r-   r   r5   r7   r7   r8   r.   Ò   s
   
r.   c                  C   s<   t tjƒ ¡ D ]} t| ƒrt dt| ƒ› �¡ t| ƒ qd S )NzRemoving expired venv )	r   r   r[   Úiterdirri   r&   r'   r)   r   )r5   r7   r7   r8   rk   Ú   s   €ýrk   Úurlc              
   C   s^   zt j | ¡}|j ¡ pd}| ¡  |¡W S  ty. } ztj	ddd� t
t|ƒƒ‚d }~ww )Nzutf-8zUncaught Exception:T)Úexc_info)r!   ÚrequestÚurlopenÚheadersÚget_content_charsetÚreadÚdecodeÚ	Exceptionr&   Údebugr   r)   )rm   ÚresÚcharsetÚer7   r7   r8   r(   á   s   €þr(   )r   N).rb   rV   Úloggingr`   Úurllib.parser!   Úurllib.requestÚpathlibr   Úshutilr   Útypingr   r   Úpipxr   Úpipx.commands.commonr   Úpipx.constantsr   r	   Úpipx.emojisr
   Ú	pipx.utilr   r   r   r   r   r   Ú	pipx.venvr   Ú	getLoggerÚ__name__r&   rQ   rN   r)   Úboolr9   r1   r,   ri   r.   rk   r(   r7   r7   r7   r8   Ú<module>   sš     
ÿþýüûúùø	÷

öUÿþýüûúùø	÷
ö
õ@ÿÿÿÿ
þ
