U
    E¸Öhs  ã                   @   sÚ   d dl m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 er 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 d d	lmZ e e¡Zejd
d„ ƒZejdd„ ƒZG dd„ de ƒZ!dS )é    )Úabsolute_importN)Úcontextlib2)ÚTempDirectory)ÚMYPY_CHECK_RUNNING)ÚTracebackType)ÚDictÚIteratorÚOptionalÚSetÚTypeÚUnion)ÚInstallRequirement)ÚLinkc               
   k   s¢   t j}tƒ }i }|  ¡ D ]>\}}z|| ||< W n tk
rL   |||< Y nX |||< qz
d V  W 5 | ¡ D ].\}}||kr„||= qlt|tƒs’t‚|||< qlX d S ©N)ÚosÚenvironÚobjectÚitemsÚKeyErrorÚ
isinstanceÚstrÚAssertionError)ZchangesÚtargetZnon_existent_markerZsaved_valuesÚnameZ	new_valueÚoriginal_value© r   úC./venv/lib/python3.8/site-packages/pip/_internal/req/req_tracker.pyÚupdate_env_context_manager   s     

r   c               
   c   st   t j d¡} t ¡ V}| d krL| tdd¡j} | t| d¡ t	 
d| ¡ t| ƒ}|V  W 5 Q R X W 5 Q R X d S )NÚPIP_REQ_TRACKERzreq-tracker)Úkind)r   z Initialized build tracking at %s)r   r   Úgetr   Ú	ExitStackÚenter_contextr   Úpathr   ÚloggerÚdebugÚRequirementTracker)ÚrootZctxZtrackerr   r   r   Úget_requirement_tracker5   s    
ÿ
r(   c                   @   sR   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	e
jdd„ ƒZdS )r&   c                 C   s    || _ tƒ | _t d| j ¡ d S )NzCreated build tracker: %s)Ú_rootÚsetÚ_entriesr$   r%   )Úselfr'   r   r   r   Ú__init__G   s    zRequirementTracker.__init__c                 C   s   t  d| j¡ | S )NzEntered build tracker: %s)r$   r%   r)   )r,   r   r   r   Ú	__enter__M   s    zRequirementTracker.__enter__c                 C   s   |   ¡  d S r   )Úcleanup)r,   Úexc_typeZexc_valÚexc_tbr   r   r   Ú__exit__R   s    zRequirementTracker.__exit__c                 C   s$   t  |j ¡ ¡ ¡ }tj | j|¡S r   )	ÚhashlibZsha224Zurl_without_fragmentÚencodeZ	hexdigestr   r#   Újoinr)   )r,   ÚlinkZhashedr   r   r   Ú_entry_path[   s    zRequirementTracker._entry_pathc              
   C   sÆ   |   |j¡}z t|ƒ}| ¡ }W 5 Q R X W n0 tk
r\ } z|jtjkrL‚ W 5 d}~X Y nX d|j|f }t|ƒ‚|| jks‚t	‚t|dƒ}| 
t|ƒ¡ W 5 Q R X | j |¡ t d|| j¡ dS )z5Add an InstallRequirement to build tracking.
        Nz%s is already being built: %sÚwzAdded %s to build tracker %r)r7   r6   ÚopenÚreadÚIOErrorÚerrnoÚENOENTÚLookupErrorr+   r   Úwriter   Úaddr$   r%   r)   )r,   ÚreqZ
entry_pathÚfpÚcontentsÚeÚmessager   r   r   r@   `   s    
zRequirementTracker.addc                 C   s2   t  |  |j¡¡ | j |¡ t d|| j¡ dS )z:Remove an InstallRequirement from build tracking.
        z Removed %s from build tracker %rN)	r   Úunlinkr7   r6   r+   Úremover$   r%   r)   ©r,   rA   r   r   r   rG      s    zRequirementTracker.removec                 C   s,   t | jƒD ]}|  |¡ q
t d| j¡ d S )NzRemoved build tracker: %r)r*   r+   rG   r$   r%   r)   rH   r   r   r   r/   Š   s    zRequirementTracker.cleanupc                 c   s   |   |¡ d V  |  |¡ d S r   )r@   rG   rH   r   r   r   Útrack‘   s    
zRequirementTracker.trackN)Ú__name__Ú
__module__Ú__qualname__r-   r.   r2   r7   r@   rG   r/   Ú
contextlibÚcontextmanagerrI   r   r   r   r   r&   E   s   	r&   )"Z
__future__r   rM   r<   r3   Zloggingr   Zpip._vendorr   Zpip._internal.utils.temp_dirr   Zpip._internal.utils.typingr   Útypesr   Útypingr   r   r	   r
   r   r   Zpip._internal.req.req_installr   Zpip._internal.models.linkr   Z	getLoggerrJ   r$   rN   r   r(   r   r&   r   r   r   r   Ú<module>   s&    


