U
    ;»{j~   ã                   @   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d dlZd dl	m
Z
 d dlmZmZmZmZ d dlmZ d dlmZ d dlmZ d dlmZ d dlmZ d d	lmZ d d
lmZ d dlmZ d dl m!Z! d dl"m#Z# d dl$m%Z% d dl&m'Z'm(Z( d dl)m*Z*m+Z+m,Z, d dl-m.Z.m/Z/m0Z0 e j1dd�Z2e 3e4¡Z5e6e6dœdd„Z7e6e j dœdd„Z8G dd„ dƒZ9e
G dd„ dƒƒZ:e6e;dœdd „Z<e#ej=ee6 d!œd"d#„Z>e9e j eeg ee6 f ee: d$œd%d&„Z?e#ej=dd!œd'd(„Z@dS ))é    N)Ú	dataclass)ÚAnyÚCallableÚDictÚOptional)ÚVersion)Úparse)ÚGroup)Úescape)ÚText)ÚLinkCollector)ÚPackageFinder)Úget_default_environment)ÚSelectionPreferences)Ú
PipSession)ÚWINDOWS)Ú get_best_invocation_for_this_pipÚ#get_best_invocation_for_this_python)Úadjacent_tmp_fileÚcheck_path_ownerÚreplace)ÚExternallyManagedEnvironmentÚcheck_externally_managedÚ
ensure_diré   )Údays)ÚkeyÚreturnc                 C   s   |   ¡ }t |¡ ¡ }|S ©N)ÚencodeÚhashlibÚsha224Ú	hexdigest)r   Z	key_bytesÚname© r$   úB/tmp/pip-install-zsn1f9xv/pip/pip/_internal/self_outdated_check.pyÚ_get_statefile_name(   s    r&   )Úisodater   c                 C   s   t j  |  dd¡¡S )z¥Convert an ISO format string to a date.

    Handles the format 2020-01-22T14:24:01Z (trailing Z)
    which is not supported by older versions of fromisoformat.
    ÚZz+00:00)ÚdatetimeÚfromisoformatr   )r'   r$   r$   r%   Ú_convert_date.   s    r+   c                   @   sX   e Zd Zeddœdd„Zeedœdd„ƒZejee dœd	d
„Z	eejddœdd„Z
dS )ÚSelfCheckStateN)Ú	cache_dirr   c              
   C   sr   i | _ d | _|rntj |dt| jƒ¡| _z*t| jdd��}t 	|¡| _ W 5 Q R X W n t
ttfk
rl   Y nX d S )NZ	selfcheckzutf-8)Úencoding)Ú_stateÚ_statefile_pathÚosÚpathÚjoinr&   r   ÚopenÚjsonÚloadÚOSErrorÚ
ValueErrorÚKeyError)Úselfr-   Ú	statefiler$   r$   r%   Ú__init__8   s      ÿzSelfCheckState.__init__©r   c                 C   s   t jS r   )ÚsysÚprefix)r:   r$   r$   r%   r   I   s    zSelfCheckState.key)Úcurrent_timer   c                 C   sR   | j s
dS d| j krdS d| j kr&dS t| j d ƒ}|| }|tkrHdS | j d S )z7Check if we have a not-outdated version loaded already.NÚ
last_checkÚpypi_version)r/   r+   Ú_WEEK)r:   r@   rA   Ztime_since_last_checkr$   r$   r%   ÚgetM   s    

zSelfCheckState.get)rB   r@   r   c              	   C   s¤   | j s
d S ttj | j ¡ƒs d S ttj | j ¡ƒ | j| ¡ |dœ}tj	|ddd�}t
| j ƒ�}| | ¡ ¡ W 5 Q R X zt|j| j ƒ W n tk
rž   Y nX d S )N)r   rA   rB   T)ú,ú:)Ú	sort_keysÚ
separators)r0   r   r1   r2   Údirnamer   r   Ú	isoformatr5   Údumpsr   Úwriter   r   r#   r7   )r:   rB   r@   ÚstateÚtextÚfr$   r$   r%   Úset`   s     ûzSelfCheckState.set)Ú__name__Ú
__module__Ú__qualname__Ústrr<   Úpropertyr   r)   r   rD   rP   r$   r$   r$   r%   r,   7   s
   r,   c                   @   s,   e Zd ZU eed< eed< edœdd„ZdS )ÚUpgradePromptÚoldÚnewr=   c              
   C   s\   t rtƒ › d�}ntƒ }d}ttƒ t |› d| j› d| j› d�¡t |› dt|ƒ› d�¡ƒS )Nz -m pipz/[bold][[reset][blue]notice[reset][bold]][reset]z) A new release of pip is available: [red]z[reset] -> [green]z[reset]z To update, run: [green]z install --upgrade pip)	r   r   r   r	   r   Zfrom_markuprW   rX   r
   )r:   Úpip_cmdÚnoticer$   r$   r%   Ú__rich__ˆ   s    ÿÿúzUpgradePrompt.__rich__N)rQ   rR   rS   rT   Ú__annotations__r	   r[   r$   r$   r$   r%   rV   ƒ   s   
rV   )Úpkgr   c                 C   s   t ƒ  | ¡}|dk	od|jkS )zµChecks whether pkg was installed by pip

    This is used not to display the upgrade message when pip is in fact
    installed by system package manager, such as dnf on Fedora.
    NÚpip)r   Úget_distributionÚ	installer)r]   Údistr$   r$   r%   Úwas_installed_by_pipœ   s    rb   )ÚsessionÚoptionsr   c                 C   sL   t j| |dd�}tddd�}tj||d�}| d¡j}|d krBd S t|jƒS )NT)rd   Úsuppress_no_indexF)Úallow_yankedÚallow_all_prereleases)Úlink_collectorÚselection_prefsr^   )r   Úcreater   r   Zfind_best_candidateÚbest_candidaterT   Úversion)rc   rd   rh   ri   Úfinderrk   r$   r$   r%   Ú_get_current_remote_pip_version¦   s"    ýþþrn   )rM   r@   Úlocal_versionÚget_remote_versionr   c                 C   s¢   |   |¡}|d kr:|ƒ }|d kr.t d¡ d S |  ||¡ t|ƒ}t d|¡ t d|¡ tdƒ}t d|¡ |svd S ||k oˆ|j|jk}|ržtt|ƒ|d�S d S )NzNo remote pip version foundzRemote version of pip: %szLocal version of pip:  %sr^   zWas pip installed by pip? %s)rW   rX   )	rD   ÚloggerÚdebugrP   Úparse_versionrb   Úbase_versionrV   rT   )rM   r@   ro   rp   Zremote_version_strÚremote_versionZpip_installed_by_pipÚlocal_version_is_olderr$   r$   r%   Ú_self_version_check_logicÂ   s(    


þrw   c              	   C   s†   t ƒ  d¡}|sdS z
tƒ  W n tk
r4   Y dS X tt|jd�tj tj	j
¡|jt t| |¡d�}|dk	r‚tjd|ddid� dS )	zÛCheck for an update for pip.

    Limit the frequency of checks to once per week. State is stored either in
    the active virtualenv or in the user's USER_CACHE_DIR keyed off the prefix
    of the pip script path.
    r^   N)r-   )rM   r@   ro   rp   z%sZrichT)Úextra)r   r_   r   r   rw   r,   r-   r)   ÚnowÚtimezoneÚutcrl   Ú	functoolsÚpartialrn   rq   Úwarning)rc   rd   Zinstalled_distZupgrade_promptr$   r$   r%   Úpip_self_version_checkä   s&    

  ÿür   )Ar)   r|   r    r5   ÚloggingÚoptparseÚos.pathr1   r>   Zdataclassesr   Útypingr   r   r   r   Zpip._vendor.packaging.versionr   r   rs   Zpip._vendor.rich.consoler	   Zpip._vendor.rich.markupr
   Zpip._vendor.rich.textr   Zpip._internal.index.collectorr   Z"pip._internal.index.package_finderr   Zpip._internal.metadatar   Ú$pip._internal.models.selection_prefsr   Zpip._internal.network.sessionr   Úpip._internal.utils.compatr   Zpip._internal.utils.entrypointsr   r   Úpip._internal.utils.filesystemr   r   r   Úpip._internal.utils.miscr   r   r   Ú	timedeltarC   Ú	getLoggerrQ   rq   rT   r&   r+   r,   rV   Úboolrb   ÚValuesrn   rw   r   r$   r$   r$   r%   Ú<module>   sT   
	L þú"