B
    ãUvgB	  ã               @   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 e 	e
¡ZG dd„ deƒZdS )é    )Úabsolute_importN)ÚTempDirectoryc               @   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 )ÚRequirementTrackerc             C   st   t j d¡| _| jd krTtddd�| _| j ¡  | jj | _t jd< t 	d| j¡ nd | _t 	d| j¡ t
ƒ | _d S )NÚPIP_REQ_TRACKERFzreq-tracker)ÚdeleteÚkindzCreated requirements tracker %rz Re-using requirements tracker %r)ÚosÚenvironÚgetÚ_rootr   Ú	_temp_dirÚcreateÚpathÚloggerÚdebugÚsetÚ_entries)Úself© r   ú>/tmp/pip-install-r_9ig3yj/pip/pip/_internal/req/req_tracker.pyÚ__init__   s    

zRequirementTracker.__init__c             C   s   | S )Nr   )r   r   r   r   Ú	__enter__   s    zRequirementTracker.__enter__c             C   s   |   ¡  d S )N)Úcleanup)r   Úexc_typeÚexc_valÚexc_tbr   r   r   Ú__exit__   s    zRequirementTracker.__exit__c             C   s$   t  |j ¡ ¡ ¡ }tj | j|¡S )N)	ÚhashlibÚsha224Úurl_without_fragmentÚencodeÚ	hexdigestr   r   Újoinr   )r   ÚlinkÚhashedr   r   r   Ú_entry_path"   s    zRequirementTracker._entry_pathc             C   sÄ   |j }t|ƒ}|  |¡}y,t|ƒ�}td|| ¡ f ƒ‚W d Q R X W nz tk
r¾ } z\|jtjkrd‚ || j	ksrt
‚t|dƒ�}| |¡ W d Q R X | j	 |¡ t d|| j¡ W d d }~X Y nX d S )Nz%s is already being built: %sÚwzAdded %s to build tracker %r)r#   Ústrr%   ÚopenÚLookupErrorÚreadÚIOErrorÚerrnoÚENOENTr   ÚAssertionErrorÚwriteÚaddr   r   r   )r   Úreqr#   ÚinfoÚ
entry_pathÚfpÚer   r   r   r0   &   s    

zRequirementTracker.addc             C   s6   |j }| j |¡ t |  |¡¡ t d|| j¡ d S )Nz Removed %s from build tracker %r)	r#   r   Úremover   Úunlinkr%   r   r   r   )r   r1   r#   r   r   r   r6   8   s    zRequirementTracker.removec             C   sR   xt | jƒD ]}|  |¡ qW | jd k	}|r6| j ¡  t d|rDdnd| j¡ d S )Nz%s build tracker %rÚRemovedÚCleaned)r   r   r6   r   r   r   r   r   )r   r1   r6   r   r   r   r   >   s    


zRequirementTracker.cleanupc             c   s   |   |¡ d V  |  |¡ d S )N)r0   r6   )r   r1   r   r   r   ÚtrackH   s    
zRequirementTracker.trackN)Ú__name__Ú
__module__Ú__qualname__r   r   r   r%   r0   r6   r   Ú
contextlibÚcontextmanagerr:   r   r   r   r   r      s   
r   )Ú
__future__r   r>   r,   r   Úloggingr   Úpip._internal.utils.temp_dirr   Ú	getLoggerr;   r   Úobjectr   r   r   r   r   Ú<module>   s   
