a
    hbòf  ã                   @   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yJ   |||< Y n0 |||< qzBd V  W | ¡ D ].\}}||u r€||= qht|tƒsŽJ ‚|||< qhn:| ¡ D ].\}}||u rº||= q¢t|tƒsÈJ ‚|||< q¢0 d S ©N)ÚosÚenvironÚobjectÚitemsÚKeyErrorÚ
isinstanceÚstr)r   ÚtargetÚnon_existent_markerÚsaved_valuesÚnameÚ	new_valueÚoriginal_value© r   úZ/home/httpd/docs/test/DocsMgr/lib/python3.9/site-packages/pip/_internal/req/req_tracker.pyÚupdate_env_context_manager   s*    
ûr   ÚRequirementTracker©r   c               	   c   sœ   t j d¡} t ¡ �t}| d u rL| tdd�¡j} | t| d�¡ t	 
d| ¡ t| ƒ�}|V  W d   ƒ n1 sp0    Y  W d   ƒ n1 sŽ0    Y  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__7   s    zRequirementTracker.__init__r    c                 C   s   t  d| j¡ | S )NzEntered build tracker: %s)r(   r)   r.   )r1   r   r   r   Ú	__enter__<   s    zRequirementTracker.__enter__)Úexc_typeÚexc_valÚexc_tbr   c                 C   s   |   ¡  d S r   )Úcleanup)r1   r4   r5   r6   r   r   r   Ú__exit__@   s    zRequirementTracker.__exit__)Úlinkr   c                 C   s$   t  |j ¡ ¡ ¡ }tj | j|¡S r   )	ÚhashlibÚsha224Úurl_without_fragmentÚencodeÚ	hexdigestr   r'   Újoinr.   )r1   r9   Úhashedr   r   r   Ú_entry_pathH   s    zRequirementTracker._entry_path)Úreqr   c                 C   sÞ   |j s
J ‚|  |j ¡}z4t|ƒ�}| ¡ }W d  ƒ n1 s>0    Y  W n ty\   Y n0 d |j |¡}t|ƒ‚|| jvs‚J ‚t|ddd��}| t	|ƒ¡ W d  ƒ n1 s´0    Y  | j 
|¡ t 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)r9   rA   ÚopenÚreadÚFileNotFoundErrorÚformatÚLookupErrorr0   Úwriter   Úaddr(   r)   r.   )r1   rB   Ú
entry_pathÚfpÚcontentsÚmessager   r   r   rK   L   s    

*,zRequirementTracker.addc                 C   s<   |j s
J ‚t |  |j ¡¡ | j |¡ t d|| j¡ dS )z1Remove an InstallRequirement from build tracking.z Removed %s from build tracker %rN)	r9   r   ÚunlinkrA   r0   Úremover(   r)   r.   ©r1   rB   r   r   r   rQ   h   s    
zRequirementTracker.removec                 C   s,   t | jƒD ]}|  |¡ q
t d| j¡ d S )NzRemoved build tracker: %r)r/   r0   rQ   r(   r)   r.   rR   r   r   r   r7   r   s    zRequirementTracker.cleanupc                 c   s   |   |¡ d V  |  |¡ d S r   )rK   rQ   rR   r   r   r   Útrackx   s    
zRequirementTracker.track)Ú__name__Ú
__module__Ú__qualname__r   r2   r3   r   r   ÚBaseExceptionr   r8   r	   rA   r
   rK   rQ   r7   r$   Úcontextmanagerr   rS   r   r   r   r   r   6   s   
û
)r$   r:   Úloggingr   Útypesr   Útypingr   r   r   r   r   r   Úpip._internal.models.linkr	   Zpip._internal.req.req_installr
   Úpip._internal.utils.temp_dirr   Ú	getLoggerrT   r(   rX   r   r   r-   r   r   r   r   r   Ú<module>   s    
