U
    
HaV                     @   s   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
mZmZ d dlmZ d dlmZ d dlmZ eeZe jeed ddd	Ze jed
 dddZG dd
 d
ZdS )    N)TracebackType)DictIteratorOptionalSetTypeUnion)Link)InstallRequirement)TempDirectory)changesreturnc               
   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st|||< qlX d S N)osenvironobjectitemsKeyError
isinstancestrAssertionError)r   targetnon_existent_markersaved_valuesname	new_valueoriginal_value r   A/tmp/pip-unpacked-wheel-tx790h60/pip/_internal/req/req_tracker.pyupdate_env_context_manager   s     

r   RequirementTracker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   get
contextlib	ExitStackenter_contextr   pathr   loggerdebugr    )rootctxtrackerr   r   r   get_requirement_tracker)   s    

r.   c                   @   s   e Zd ZeddddZd dddZeee  ee ee	 ddd	d
Z
eedddZeddddZeddddZddddZejeed dddZdS )r    N)r+   r   c                 C   s    || _ t | _td| j  d S )NzCreated build tracker: %s)_rootset_entriesr)   r*   )selfr+   r   r   r   __init__:   s    zRequirementTracker.__init__r!   c                 C   s   t d| j | S )NzEntered build tracker: %s)r)   r*   r/   )r2   r   r   r   	__enter__?   s    zRequirementTracker.__enter__)exc_typeexc_valexc_tbr   c                 C   s   |    d S r   )cleanup)r2   r5   r6   r7   r   r   r   __exit__C   s    zRequirementTracker.__exit__)linkr   c                 C   s$   t |j  }tj| j|S r   )	hashlibsha224url_without_fragmentencode	hexdigestr   r(   joinr/   )r2   r:   hashedr   r   r   _entry_pathK   s    zRequirementTracker._entry_path)reqr   c              	   C   s   |j s
t| |j }z t|}| }W 5 Q R X W n tk
rJ   Y nX d|j |}t||| jksptt|ddd}|	t
| W 5 Q R X | j| td|| j dS )z5Add an InstallRequirement to build tracking.
        z{} is already being built: {}wzutf-8)encodingzAdded %s to build tracker %rN)r:   r   rB   openreadFileNotFoundErrorformatLookupErrorr1   writer   addr)   r*   r/   )r2   rC   
entry_pathfpcontentsmessager   r   r   rL   O   s"    

 zRequirementTracker.addc                 C   s<   |j s
tt| |j  | j| td|| j	 dS )z:Remove an InstallRequirement from build tracking.
        z Removed %s from build tracker %rN)
r:   r   r   unlinkrB   r1   remover)   r*   r/   r2   rC   r   r   r   rR   m   s    
zRequirementTracker.removec                 C   s,   t | jD ]}| | q
td| j d S )NzRemoved build tracker: %r)r0   r1   rR   r)   r*   r/   rS   r   r   r   r8   x   s    zRequirementTracker.cleanupc                 c   s   |  | d V  | | d S r   )rL   rR   rS   r   r   r   track~   s    
zRequirementTracker.track)__name__
__module____qualname__r   r3   r4   r   r   BaseExceptionr   r9   r	   rB   r
   rL   rR   r8   r%   contextmanagerr   rT   r   r   r   r   r    8   s   
)r%   r;   loggingr   typesr   typingr   r   r   r   r   r   pip._internal.models.linkr	   pip._internal.req.req_installr
   pip._internal.utils.temp_dirr   	getLoggerrU   r)   rY   r   r   r.   r    r   r   r   r   <module>   s    
