U
    «ÃT_s  ã                   @   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)ÚchangesÚtargetÚnon_existent_markerÚsaved_valuesÚnameÚ	new_valueÚoriginal_value© r   úA/tmp/pip-unpacked-wheel-8u7dkzi1/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)ÚrootÚctxÚ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/   )r2   r   r   r    Ú	__enter__M   s    zRequirementTracker.__enter__c                 C   s   |   ¡  d S r   )Úcleanup)r2   Úexc_typeÚexc_valÚexc_tbr   r   r    Ú__exit__R   s    zRequirementTracker.__exit__c                 C   s$   t  |j ¡ ¡ ¡ }tj | j|¡S r   )	ÚhashlibÚsha224Úurl_without_fragmentÚencodeÚ	hexdigestr   r'   Újoinr/   )r2   ÚlinkÚ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)rB   r@   ÚopenÚreadÚIOErrorÚerrnoÚENOENTÚLookupErrorr1   r   Úwriter   Úaddr(   r)   r/   )r2   ÚreqÚ
entry_pathÚfpÚcontentsÚeÚmessager   r   r    rK   `   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   ÚunlinkrB   r@   r1   Úremover(   r)   r/   ©r2   rL   r   r   r    rS      s    zRequirementTracker.removec                 C   s,   t | jƒD ]}|  |¡ q
t d| j¡ d S )NzRemoved build tracker: %r)r0   r1   rS   r(   r)   r/   rT   r   r   r    r5   Š   s    zRequirementTracker.cleanupc                 c   s   |   |¡ d V  |  |¡ d S r   )rK   rS   rT   r   r   r    Útrack‘   s    
zRequirementTracker.trackN)Ú__name__Ú
__module__Ú__qualname__r3   r4   r9   rB   rK   rS   r5   Ú
contextlibÚcontextmanagerrU   r   r   r   r    r*   E   s   	r*   )"Ú
__future__r   rY   rG   r:   Úloggingr   Úpip._vendorr   Úpip._internal.utils.temp_dirr   Úpip._internal.utils.typingr   Útypesr   Útypingr   r   r	   r
   r   r   Úpip._internal.req.req_installr   Úpip._internal.models.linkr   Ú	getLoggerrV   r(   rZ   r!   r.   r   r*   r   r   r   r    Ú<module>   s&    


