3
ûâde  ã               @   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j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 }xJ| jƒ D ]>\}}y|| ||< W n tk
rN   |||< Y nX |||< qW z
d V  W d x:|jƒ D ].\}}||krŠ||= qrt|tƒs˜t‚|||< qrW X d S )N)ÚosÚenvironÚobjectÚitemsÚKeyErrorÚ
isinstanceÚstrÚAssertionError)r   ÚtargetZnon_existent_markerZsaved_valuesÚnameZ	new_valueÚoriginal_value© r   ú</tmp/pip-build-red6nood/pip/pip/_internal/req/req_tracker.pyÚupdate_env_context_manager   s     
r   ÚRequirementTracker)r   c              c   st   t jjdƒ} tjƒ �V}| d krL|jtdd�ƒj} |jt| d�ƒ t	j
d| ƒ t| ƒ�}|V  W d Q R X W d 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ÚctxZ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jd| j ƒ d S )NzCreated build tracker: %s)Ú_rootÚsetÚ_entriesr$   r%   )Úselfr&   r   r   r   Ú__init__7   s    zRequirementTracker.__init__)r   c             C   s   t jd| jƒ | S )NzEntered build tracker: %s)r$   r%   r)   )r,   r   r   r   Ú	__enter__<   s    zRequirementTracker.__enter__)Úexc_typeÚexc_valÚexc_tbr   c             C   s   | j ƒ  d S )N)Úcleanup)r,   r/   r0   r1   r   r   r   Ú__exit__@   s    zRequirementTracker.__exit__)Úlinkr   c             C   s$   t j|jjƒ ƒjƒ }tjj| j|ƒS )N)	ÚhashlibÚsha224Úurl_without_fragmentÚencodeÚ	hexdigestr   r#   Újoinr)   )r,   r4   Úhashedr   r   r   Ú_entry_pathH   s    zRequirementTracker._entry_path)Úreqr   c             C   s¸   |j s
t‚| j|j ƒ}y t|ƒ�}|jƒ }W dQ R X W n tk
rJ   Y nX dj|j |ƒ}t|ƒ‚|| jkspt‚t|ddd��}|j	t
|ƒƒ W dQ R X | jj|ƒ tjd|| jƒ dS )z,Add an InstallRequirement to build tracking.Nz{} is already being built: {}Úwzutf-8)ÚencodingzAdded %s to build tracker %r)r4   r   r<   ÚopenÚreadÚFileNotFoundErrorÚformatÚLookupErrorr+   Úwriter   Úaddr$   r%   r)   )r,   r=   Z
entry_pathÚfpÚcontentsÚmessager   r   r   rF   L   s    

zRequirementTracker.addc             C   s<   |j s
t‚tj| j|j ƒƒ | jj|ƒ tjd|| j	ƒ dS )z1Remove an InstallRequirement from build tracking.z Removed %s from build tracker %rN)
r4   r   r   Úunlinkr<   r+   Úremover$   r%   r)   )r,   r=   r   r   r   rK   h   s    
zRequirementTracker.removec             C   s0   xt | jƒD ]}| j|ƒ qW tjd| jƒ d S )NzRemoved build tracker: %r)r*   r+   rK   r$   r%   r)   )r,   r=   r   r   r   r2   r   s    zRequirementTracker.cleanupc             c   s   | j |ƒ d V  | j|ƒ d S )N)rF   rK   )r,   r=   r   r   r   Útrackx   s    
zRequirementTracker.track)Ú__name__Ú
__module__Ú__qualname__r   r-   r.   r   r   ÚBaseExceptionr   r3   r	   r<   r
   rF   rK   r2   r    Úcontextmanagerr   rL   r   r   r   r   r   6   s   

)r    r5   Úloggingr   Útypesr   Útypingr   r   r   r   r   r   Zpip._internal.models.linkr	   Zpip._internal.req.req_installr
   Zpip._internal.utils.temp_dirr   Ú	getLoggerrM   r$   rQ   r   r   r(   r   r   r   r   r   Ú<module>   s    
