U
    Ðvagà  ã                   @   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eƒZG dd„ dƒZdS )é    N)ÚTracebackType)ÚDictÚ	GeneratorÚOptionalÚSetÚTypeÚUnion)ÚLink)ÚInstallRequirement)ÚTempDirectory©NNN)Ú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ƒs’t‚|||< qlX d S ©N)ÚosÚenvironÚobjectÚitemsÚKeyErrorÚ
isinstanceÚstrÚAssertionError)r   ÚtargetZnon_existent_markerZsaved_valuesÚnameZ	new_valueÚoriginal_value© r   ú`/var/www/html/myvenv/lib/python3.8/site-packages/pip/_internal/operations/build/build_tracker.pyÚupdate_env_context_manager   s     

r   )ÚBuildTrackerNN©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_BUILD_TRACKERzbuild-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_build_tracker)   s    

r+   c                   @   s   e Zd ZdZdS )Ú	TrackerIdz:Uniquely identifying string provided to the build tracker.N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r   r   r,   6   s   r,   c                   @   s°   e Zd 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eddœdd„Zeeddœdd„Zddœdd„Zejeeed dœdd„ƒZdS )r   a7  Ensure that an sdist cannot request itself as a setup requirement.

    When an sdist is prepared, it identifies its setup requirements in the
    context of ``BuildTracker.track()``. If a requirement shows up recursively, this
    raises an exception.

    This stops fork bombs embedded in malicious packages.N)r)   r   c                 C   s   || _ i | _t d| j ¡ d S )NzCreated build tracker: %s)Ú_rootÚ_entriesr'   r(   )Úselfr)   r   r   r   Ú__init__C   s    zBuildTracker.__init__r   c                 C   s   t  d| j¡ | S )NzEntered build tracker: %s)r'   r(   r1   )r3   r   r   r   Ú	__enter__H   s    zBuildTracker.__enter__)Úexc_typeÚexc_valÚexc_tbr   c                 C   s   |   ¡  d S r   )Úcleanup)r3   r6   r7   r8   r   r   r   Ú__exit__L   s    zBuildTracker.__exit__)Úkeyr   c                 C   s"   t  | ¡ ¡ ¡ }tj | j|¡S r   )ÚhashlibÚsha224ÚencodeÚ	hexdigestr   r&   Újoinr1   )r3   r;   Úhashedr   r   r   Ú_entry_pathT   s    zBuildTracker._entry_path)Úreqr;   r   c              	   C   sª   |   |¡}z t|ƒ�}| ¡ }W 5 Q R X W n tk
r>   Y nX d |j|¡}t|ƒ‚|| jksdt‚t|ddd��}| 	t
|ƒ¡ W 5 Q R X || j|< t d|| j¡ dS )z,Add an InstallRequirement to build tracking.z{} is already being built: {}Úwzutf-8)ÚencodingzAdded %s to build tracker %rN)rB   ÚopenÚreadÚFileNotFoundErrorÚformatÚlinkÚLookupErrorr2   r   Úwriter   r'   r(   r1   )r3   rC   r;   Z
entry_pathÚfpÚcontentsÚmessager   r   r   ÚaddX   s    


zBuildTracker.addc                 C   s,   t  |  |¡¡ | j|= t d|| j¡ dS )z1Remove an InstallRequirement from build tracking.z Removed %s from build tracker %rN)r   ÚunlinkrB   r2   r'   r(   r1   )r3   rC   r;   r   r   r   Úremoves   s    zBuildTracker.removec                 C   s6   t | j ¡ ƒD ]\}}|  ||¡ qt d| j¡ d S )NzRemoved build tracker: %r)Úlistr2   r   rR   r'   r(   r1   )r3   r;   rC   r   r   r   r9   |   s    zBuildTracker.cleanupr   c                 c   s*   t |ƒ}|  ||¡ dV  |  ||¡ dS )zÙEnsure that `key` cannot install itself as a setup requirement.

        :raises LookupError: If `key` was already provided in a parent invocation of
                             the context introduced by this method.N)r,   rP   rR   )r3   rC   r;   Z
tracker_idr   r   r   Útrack‚   s    zBuildTracker.track)r-   r.   r/   r0   r   r4   r5   r   r   ÚBaseExceptionr   r:   r,   rB   r
   rP   rR   r9   r#   Úcontextmanagerr   rT   r   r   r   r   r   :   s   
û	r   )r#   r<   Úloggingr   Útypesr   Útypingr   r   r   r   r   r   Úpip._internal.models.linkr	   Úpip._internal.req.req_installr
   Úpip._internal.utils.temp_dirr   Ú	getLoggerr-   r'   rV   r   r   r+   r,   r   r   r   r   r   Ú<module>   s    
