o
    h                     @  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mZ d dlm	Z	 d dl
mZ d dlmZ eeZejdddZejdddZG dd deZG dd dZdS )    )annotationsN)	Generator)TracebackType)InstallRequirement)TempDirectorychangesstrreturnGenerator[None, None, None]c               
   k  s    t j}t }i }|  D ]\}}z|| ||< W n ty&   |||< Y nw |||< qz"d V  W | D ]\}}||u rA||= q5t|tsHJ |||< q5d S | D ]\}}||u r_||= qSt|tsfJ |||< qSw N)osenvironobjectitemsKeyError
isinstancer   )r   targetnon_existent_markersaved_valuesname	new_valueoriginal_value r   _/var/www/html/venv/lib/python3.10/site-packages/pip/_internal/operations/build/build_tracker.pyupdate_env_context_manager   s0   


r   #Generator[BuildTracker, None, None]c               	   c  s    t jd} t C}| d u r'|tddj} |t| d t	
d|  t| }|V  W d    n1 s9w   Y  W d    d S W d    d S 1 sQw   Y  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debugBuildTracker)rootctx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*   7   s    r*   c                   @  sf   e Zd ZdZd"ddZd#dd	Zd$ddZd%ddZd&ddZd&ddZ	d'ddZ
ej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.r&   r   r	   Nonec                 C  s   || _ i | _td| j  d S )NzCreated build tracker: %s)_root_entriesr#   r$   )selfr&   r   r   r   __init__D   s   zBuildTracker.__init__c                 C  s   t d| j | S )NzEntered build tracker: %s)r#   r$   r0   )r2   r   r   r   	__enter__I   s   zBuildTracker.__enter__exc_typetype[BaseException] | Noneexc_valBaseException | Noneexc_tbTracebackType | Nonec                 C  s   |    d S r   )cleanup)r2   r5   r7   r9   r   r   r   __exit__M   s   zBuildTracker.__exit__keyr*   c                 C  s"   t |  }tj| j|S r   )hashlibsha224encode	hexdigestr   r"   joinr0   )r2   r=   hashedr   r   r   _entry_pathU   s   zBuildTracker._entry_pathreqr   c                 C  s   |  |}zt|}| }W d   n1 sw   Y  W n	 ty(   Y nw |j d| }t||| jvs<J t|ddd}|t| W d   n1 sUw   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)rD   openreadFileNotFoundErrorlinkLookupErrorr1   writer   r#   r$   r0   )r2   rE   r=   
entry_pathfpcontentsmessager   r   r   addY   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   unlinkrD   r1   r#   r$   r0   )r2   rE   r=   r   r   r   removet   s   zBuildTracker.removec                 C  s6   t | j D ]
\}}| || qtd| j d S )NzRemoved build tracker: %r)listr1   r   rT   r#   r$   r0   )r2   r=   rE   r   r   r   r;   }   s   zBuildTracker.cleanupr
   c                 c  s,    t |}| || dV  | || dS )zEnsure 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*   rR   rT   )r2   rE   r=   
tracker_idr   r   r   track   s
   zBuildTracker.trackN)r&   r   r	   r/   )r	   r%   )r5   r6   r7   r8   r9   r:   r	   r/   )r=   r*   r	   r   )rE   r   r=   r*   r	   r/   )r	   r/   )rE   r   r=   r   r	   r
   )r+   r,   r-   r.   r3   r4   r<   rD   rR   rT   r;   r   contextmanagerrW   r   r   r   r   r%   ;   s    






	r%   )r   r   r	   r
   )r	   r   )
__future__r   r   r>   loggingr   collections.abcr   typesr   pip._internal.req.req_installr   pip._internal.utils.temp_dirr   	getLoggerr+   r#   rX   r   r)   r   r*   r%   r   r   r   r   <module>   s     
