
    3i*                    .   d Z ddlmZ ddlZddlZddlmZmZ ddlm	Z	m
Z
 ddlmZ ddlmZmZ ddlmZ dd	lmZmZ erdd
lmZ ddlmZ  ej2                  e      Z G d de      Zi Z e       Z G d de      Z G d de      Z  G d de      Z!g dZ"y)z8holds locking functionality that works across processes.    )annotationsN)ABCabstractmethod)contextmanagersuppress)Path)LockRLock)TYPE_CHECKING)FileLockTimeout)Iterator)TracebackTypec                  J     e Zd Zd fdZ	 	 d	 	 	 	 	 d fdZdd fdZ xZS )	_CountedFileLockc                   t         j                  j                  |      }t        t              5  t        j
                  |d       d d d        t        |   |       d| _        t               | _
        y # 1 sw Y   /xY w)NTexist_okr   )ospathdirnamer   OSErrormakedirssuper__init__countr
   thread_safe)self	lock_fileparent	__class__s      G/var/www/opsc/venv/lib/python3.12/site-packages/virtualenv/util/lock.pyr   z_CountedFileLock.__init__   s`    +g 	/KK.	/ 	#
 7	/ 	/s   A66A?c                *   | j                   j                  |dn|      st        | j                        | j                  dk(  r	 t
        |   ||       | xj                  dz  c_        y # t        $ r | j                   j                           w xY w)N)timeoutr      )r   acquirer   r   r   r   BaseExceptionrelease)r   r%   poll_intervalr!   s      r"   r'   z_CountedFileLock.acquire    s    
 ''go7'S$..))::?7 	

a
 !   ((*s   A- -%Bc                    | j                   5  | j                  dkD  r]| j                  dk(  rt        |   |       | xj                  dz  c_        | j                  dk(  r| j                   j                          d d d        y # 1 sw Y   y xY w)Nr   r&   )force)r   r   r   r)   )r   r,   r!   s     r"   r)   z_CountedFileLock.release/   so     	/zzA~::?GO%O0

a
::?$$,,.	/ 	/ 	/s   A-BB)r   strreturnNone)Ng?)r%   zfloat | Noner*   floatr.   r/   F)r,   boolr.   r/   )__name__
__module____qualname__r   r'   r)   __classcell__r!   s   @r"   r   r      s;    # !%#  
	/ /    r   c                      e Zd Zd	dZd
dZddZedd       Ze	 	 	 	 	 	 	 	 dd       Zee	ddd              Z
ee	dd              Zy)PathLockBasec                t    t        |      }|j                         r|j                         | _        y || _        y N)r   existsresolver   )r   folderr   s      r"   r   zPathLockBase.__init__?   s&    F|&*kkmDLLN		r8   c                N    | j                   j                   d| j                   dS )N())r!   r3   r   r   s    r"   __repr__zPathLockBase.__repr__C   s$    ..))*!DII;a88r8   c                >     t        |       | j                  |z        S r<   )typer   )r   others     r"   __truediv__zPathLockBase.__truediv__F   s    tDz$))e+,,r8   c                    t         r<   NotImplementedErrorrC   s    r"   	__enter__zPathLockBase.__enter__I   s    !!r8   c                    t         r<   rJ   r   exc_typeexc_valexc_tbs       r"   __exit__zPathLockBase.__exit__M   s
     "!r8   c                    t         r<   rJ   r   nameno_blocks      r"   lock_for_keyzPathLockBase.lock_for_keyS   
     "!r8   c                    t         r<   rJ   r   rU   s     r"   non_reentrant_lock_for_keyz'PathLockBase.non_reentrant_lock_for_keyX   rX   r8   Nr?   z
str | Pathr.   r/   )r.   r-   )rG   r-   r.   r:   r.   r/   rO   ztype[BaseException] | NonerP   zBaseException | NonerQ   zTracebackType | Noner.   r/   r1   rU   r-   rV   r2   r.   Iterator[None]rU   r-   r.   r`   )r3   r4   r5   r   rD   rH   r   rL   rR   r   rW   r[    r8   r"   r:   r:   >   s    >9- " " "2"=Q"[o"	" "
 "  " "  "r8   r:   c                       e Zd Zd fdZdddZedd       ZddZddZ	 	 	 	 	 	 	 	 ddZ	dddZ
edd       Zeddd	       Zedd
       Z xZS )ReentrantFileLockc                2    t         |   |       d | _        y r<   )r   r   _lock)r   r?   r!   s     r"   r   zReentrantFileLock.__init___   s     
r8   c                    t        | j                  | dz        }t        5  |t        vrt	        |      t        |<   t        |   cd d d        S # 1 sw Y   y xY wNz.lock)r-   r   _store_lock_lock_storer   )r   rU   r   s      r"   _create_lockzReentrantFileLock._create_lockc   sR    		tfEN23	 	*+)9))DI&y)	* 	* 	*s   #AAc                    | Tt         5  | j                  5  | j                  dk(  r t        j	                  | j
                  d        d d d        d d d        y y # 1 sw Y   xY w# 1 sw Y   y xY w)Nr   )ri   r   r   rj   popr   locks    r"   	_del_lockzReentrantFileLock._del_lockj   sd     :d.. :::?OODNND9: : : : : : :s"   A$0AA$A!	A$$A-c                :    | j                  | j                         y r<   )rp   rf   rC   s    r"   __del__zReentrantFileLock.__del__q   s    tzz"r8   c                d    | j                         | _        | j                  | j                         y r<   )rk   rf   
_lock_filerC   s    r"   rL   zReentrantFileLock.__enter__t   s"    &&(


#r8   c                ~    | j                  | j                         | j                  | j                         d | _        y r<   )_releaserf   rp   rN   s       r"   rR   zReentrantFileLock.__exit__x   s+     	djj!tzz"
r8   c                h   t        t              5  t        j                  t	        | j
                        d       d d d        	 |j                  d       y # 1 sw Y   xY w# t        $ rF |r t        j                  d|j                         |j                          |j                          Y y w xY w)NTr   g-C6?z/lock file %s present, will block until released)r   r   r   r   r-   r   r'   r   LOGGERdebugr   r)   )r   ro   rV   s      r"   rt   zReentrantFileLock._lock_file   s     g 	7KKDII6	7	LL 		7 	7
  	LLJDNN[LLNLLN	s   +AA" A"AB10B1c                $    | j                          y r<   )r)   rn   s    r"   rv   zReentrantFileLock._release   s    r8   c              #    K   | j                  |      }	 	 | j                  ||       d  | j                  |       	 | j                  |       d }y # | j                  |       w xY w# | j                  |       d }w xY wwr<   )rk   rt   rv   rp   )r   rU   rV   ro   s       r"   rW   zReentrantFileLock.lock_for_key   so       &	$h/d#NN4 D d#NN4 Ds,   B A A( B A%%A( (A==B c              #     K   t        t        | j                  | dz              5  d  d d d        y # 1 sw Y   y xY wwrh   )r   r-   r   rZ   s     r"   r[   z,ReentrantFileLock.non_reentrant_lock_for_key   s9     c$))en"<=> 		 	 	s   %A5	A>Ar\   ) )rU   r-   r.   r   )ro   z_CountedFileLock | Noner.   r/   r]   r^   r1   )ro   r   rV   r2   r.   r/   )ro   r   r.   r/   r_   ra   )r3   r4   r5   r   rk   staticmethodrp   rr   rL   rR   rt   rv   r   rW   r[   r6   r7   s   @r"   rd   rd   ^   s    * : :#$2=Q[o	    
 
  r8   rd   c                  R    e Zd ZddZ	 	 	 	 	 	 	 	 ddZedd	d       Zed
d       Zy)NoOpFileLockc                    t         r<   rJ   rC   s    r"   rL   zNoOpFileLock.__enter__   s    !!r8   c                    t         r<   rJ   rN   s       r"   rR   zNoOpFileLock.__exit__   rX   r8   c              #     K   d  y wr<   rb   rT   s      r"   rW   zNoOpFileLock.lock_for_key   	        c              #     K   d  y wr<   rb   rZ   s     r"   r[   z'NoOpFileLock.non_reentrant_lock_for_key   r   r   Nr]   r^   r1   r_   ra   )r3   r4   r5   rL   rR   r   rW   r[   rb   r8   r"   r   r      sT    ""2"=Q"[o"	"
    r8   r   )r   rd   r   )#__doc__
__future__r   loggingr   abcr   r   
contextlibr   r   pathlibr   	threadingr	   r
   typingr   filelockr   r   collections.abcr   typesr   	getLoggerr3   rx   r   rj   ri   r:   rd   r   __all__rb   r8   r"   <module>r      s    > "  	 # /  !   &(#			8	$!/x !/H f"3 "@E EP< $r8   