o
    6‘ði£  ã                   @  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   úk/root/parts/websockify/install/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 )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*   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     
