ó
    Eñi™  ã                  ó¨   • S SK Jr  S SKrS SKrS SKrS SKrS SKJr  S SKJ	r	J
r
JrJr  S SKJr  SSKJr  SSKJrJr  S	rS
rSrSr " S S\5      rS/rg)é    )ÚannotationsN)Úsuppress)ÚEACCESÚEEXISTÚEPERMÚESRCH)ÚPathé   )ÚBaseFileLock)Úensure_directory_existsÚraise_on_not_writable_filei   éW   i   g       @c                  ó¸   • \ rS rSrSrSS jrSS jrSS jr\SS j5       r	\SS j5       r
\SS j5       r\SS	 j5       r\SS
 j5       rSS jrSS jrSS jrSrg)ÚSoftFileLocké   a�  
Portable file lock based on file existence.

Unlike :class:`UnixFileLock <filelock.UnixFileLock>` and :class:`WindowsFileLock <filelock.WindowsFileLock>`, this
lock does not use OS-level locking primitives. Instead, it creates the lock file with ``O_CREAT | O_EXCL`` and
treats its existence as the lock indicator. This makes it work on any filesystem but leaves stale lock files behind
if the process crashes without releasing the lock.

To mitigate stale locks, the lock file contains the PID and hostname of the holding process. On contention, if the
holder is on the same host and its PID no longer exists, the stale lock is broken automatically.

c                óx  • [        U R                  5        [        U R                  5        [        R                  [        R
                  -  [        R                  -  [        R                  -  n[        [        SS 5      =nb  X-  n [        R                  " U R                  XR                  5       5      nU R                  U5        X0R                  l        g ! [         aW  nUR                  [         :X  d)  UR                  ["        :X  a  [$        R&                  S:X  d  e U R)                  5          S nAg S nAff = f)NÚ
O_NOFOLLOWÚwin32)r   Ú	lock_filer   ÚosÚO_WRONLYÚO_CREATÚO_EXCLÚO_TRUNCÚgetattrÚopenÚ
_open_modeÚ_write_lock_infoÚ_contextÚlock_file_fdÚOSErrorÚerrnor   r   ÚsysÚplatformÚ_try_break_stale_lock)ÚselfÚflagsÚ
o_nofollowÚfile_handlerÚ	exceptions        ÚK/home/mande/repo/quber/.venv/lib/python3.13/site-packages/filelock/_soft.pyÚ_acquireÚSoftFileLock._acquire"   së   € Ü" 4§>¡>Ô2Ü §¡Ô/ä�K‰KÜ�j‰jñä�i‰iñô �j‰jñð 	ô "¤" l°DÓ9Ð9ˆJÑFØÑˆEð
	6ÜŸ7š7 4§>¡>°5¿/¹/Ó:KÓLˆLð ×!Ñ! ,Ô/Ø)5�M‰MÕ&øô ó 	)à—‘¤6Ó)¨i¯o©oÄÓ.GÌCÏLÉLÐ\cÓLcàØ×&Ñ&×(Ñ(ûð	)ús   Â/C Ã
D9Ã"AD4Ä4D9c                ó0  • [        [        [        5         [        U R                  5      nUR                  5       nUR                  SS9nUR                  5       R                  5       n[        U5      S;  aD  [        R                  " 5       UR                  -
  [        :¼  a  U R                  5          S S S 5        g US   US   pe[        U5      S:X  a  US   OS nU[        R                  " 5       :w  a
   S S S 5        g [!        U5      nU R#                  U5      (       aP  [$        R&                  S:X  a2  Ub/  [!        U5      n	U R)                  U5      n
U
b  X©:w  a  O S S S 5        g  S S S 5        g U R                  5         S S S 5        g ! , (       d  f       g = f)	Núutf-8©Úencoding>   é   é   r   r
   r3   r2   r   )r   r!   Ú
ValueErrorr	   r   ÚstatÚ	read_textÚstripÚ
splitlinesÚlenÚtimeÚst_mtimeÚ_MALFORMED_LOCK_AGE_THRESHOLDÚ_evict_lock_fileÚsocketÚgethostnameÚintÚ_is_process_aliver#   r$   Ú_get_process_creation_time)r&   Ú	lock_pathÚstat_resultÚcontentÚlinesÚpid_strÚhostnameÚcreation_time_strÚpidÚstoredÚactuals              r+   r%   Ú"SoftFileLock._try_break_stale_lock9   sV  € Ü”gœzÕ*Ü˜TŸ^™^Ó,ˆIØ#Ÿ.™.Ó*ˆKØ×)Ñ)°7Ð)Ð;ˆGØ—M‘M“O×.Ñ.Ó0ˆEä�5‹z Ó'Ü—9’9“; ×!5Ñ!5Ñ5Ô9VÓVØ×)Ñ)Ô+Ø÷ +Ð*ð !& a¡¨%°©(�XÜ,/°«J¸!«O  a¢ÀÐàœ6×-Ò-Ó/Ó/Ø÷ +Ð*ô" �g“,ˆCà×%Ñ% c×*Ñ*Ü—<‘< 7Ó*Ð/@Ñ/LÜ Ð!2Ó3�FØ!×<Ñ<¸SÓA�FØÑ)¨fÓ.>Øà÷5 +Ð*ð8 ÷9 +Ð*ð< ×!Ñ!Ô#÷= +×*Ö*ús%   •BFÂ;9FÃ=AFÅ$FÅ.FÆ
Fc                óÆ   • U R                    S[        R                  " 5        3n[        U R                   5      R	                  U5        [        U5      R                  5         g )Nz.break.)r   r   Úgetpidr	   ÚrenameÚunlink)r&   Ú
break_paths     r+   r=   ÚSoftFileLock._evict_lock_fileZ   sE   € ØŸ™Ð' w¬r¯yªy«{¨mÐ<ˆ
ÜˆT�^‰^Ó×#Ñ# JÔ/ÜˆZÓ×ÑÕ!ó    c                ó¨  • [         R                  S:X  aa  SS KnUR                  R                  nUR                  [        SU 5      nU(       a  UR                  U5        gUR                  5       [        :g  $  [        R                  " U S5        g! [         a8  nUR                  [        :X  a   S nAgUR                  [        :X  a   S nAge S nAff = f)Nr   r   TF)r#   r$   ÚctypesÚwindllÚkernel32ÚOpenProcessÚ_WIN_SYNCHRONIZEÚCloseHandleÚGetLastErrorÚ_WIN_ERROR_INVALID_PARAMETERr   Úkillr!   r"   r   r   )rJ   rV   rX   ÚhandleÚexcs        r+   rA   ÚSoftFileLock._is_process_alive_   s¨   € ä�<‰<˜7Ó"Ûà—}‘}×-Ñ-ˆHØ×)Ñ)Ô*:¸A¸sÓCˆFÞØ×$Ñ$ VÔ,ØØ×(Ñ(Ó*Ô.JÑJÐJð	Ü�GŠG�C˜ŒOð øô ó 	Ø�y‰yœEÓ!ÜØ�y‰yœEÓ!ÜØûð	ús$   Á7B Â
CÂCÂ2CÃCÃCc           	     ó†  • [         R                  S:w  a  gSSKnSSKJn  UR                  R
                  nUR                  [        SU 5      nU(       d  g UR                  5       nUR                  5       nUR                  5       nUR                  5       nUR                  UUR                  U5      UR                  U5      UR                  U5      UR                  U5      5      (       d   UR                  U5        g UR                  U5        UR                  S-  UR                  -  $ ! UR                  U5        f = f)zRReturn the process creation FILETIME as an integer on Windows, ``None`` otherwise.r   Nr   )Úwintypesé    )r#   r$   rV   rc   rW   rX   rY   Ú&_WIN_PROCESS_QUERY_LIMITED_INFORMATIONÚFILETIMEÚGetProcessTimesÚbyrefr[   ÚdwHighDateTimeÚdwLowDateTime)	rJ   rV   rc   rX   r_   ÚcreationÚ	exit_timeÚkernel_timeÚ	user_times	            r+   rB   Ú'SoftFileLock._get_process_creation_timet   s  € ô �<‰<˜7Ó"ØÛÝ#à—=‘=×)Ñ)ˆØ×%Ñ%Ô&LÈaÐQTÓUˆÞØð	)Ø×(Ñ(Ó*ˆHØ ×)Ñ)Ó+ˆIØ"×+Ñ+Ó-ˆKØ ×)Ñ)Ó+ˆIØ×+Ñ+ØØ—‘˜XÓ&Ø—‘˜YÓ'Ø—‘˜[Ó)Ø—‘˜YÓ'÷ñ ð à× Ñ  Õ(ðð × Ñ  Ô(Ø×'Ñ'¨2Ñ-°×1GÑ1GÑGÐGøð × Ñ  Õ(ús   ÁBD- Ä-E c                ó†  • [        [        5         [        R                  " 5        S[        R
                  " 5        S3n[        R                  S:X  a2  [        R                  [        R                  " 5       5      =nb  X S3-  n[        R                  " XR                  5       5        S S S 5        g ! , (       d  f       g = f)NÚ
r   )r   r!   r   rO   r>   r?   r#   r$   r   rB   ÚwriteÚencode)ÚfdÚinfoÚcts      r+   r   ÚSoftFileLock._write_lock_info‘   sƒ   € ä”gÕÜ—i’i“k�] "¤V×%7Ò%7Ó%9Ð$:¸"Ð=ˆDÜ�|‰|˜wÓ&´,×2YÑ2YÔZ\×ZcÒZcÓZeÓ2fÐ,f¨BÑ+sØ˜$˜b˜	Ñ!�Ü�HŠH�RŸ™›Ô'÷	 ×Öús   �BB2Â2
C c                óÞ   •  [        U R                  5      R                  SS9nUR                  5       R	                  5       nU(       a  [        US   5      $  g! [        [        4 a     gf = f)z§
The PID of the process holding this lock, read from the lock file.

:returns: the PID as an integer, or ``None`` if the lock file does not exist or cannot be parsed

r/   r0   r   N)r	   r   r6   r7   r8   r@   r!   r4   )r&   rE   rF   s      r+   rJ   ÚSoftFileLock.pid™   sn   € ð	Ü˜4Ÿ>™>Ó*×4Ñ4¸gÐ4ÐFˆGØ—M‘M“O×.Ñ.Ó0ˆEÞÜ˜5 ™8“}Ð$ð ð øô œÐ$ó 	ØØð	ús   ‚AA ÁA,Á+A,c                óF   • U R                   [        R                  " 5       :H  $ )z‡
Whether this lock is held by the current process.

:returns: ``True`` if the lock file exists and contains the current process's PID

)rJ   r   rO   ©r&   s    r+   Úis_lock_held_by_usÚSoftFileLock.is_lock_held_by_usª   s   € ð �x‰xœ2Ÿ9š9›;Ñ&Ð&rT   c                óœ   • [        [        5         [        U R                  5      R	                  5         SSS5        g! , (       d  f       g= f)zNForcibly break the lock by removing the lock file, regardless of who holds it.N)r   r!   r	   r   rQ   r{   s    r+   Ú
break_lockÚSoftFileLock.break_lock´   s+   € ä”gÕÜ�—‘Ó ×'Ñ'Ô)÷ ×Öús	   �$=½
Ac                óŽ  • U R                   R                  c   e[        R                  " U R                   R                  5        S U R                   l        [        R
                  S:X  a  U R                  5         g [        [        5         [        U R                  5      R                  5         S S S 5        g ! , (       d  f       g = f)Nr   )r   r    r   Úcloser#   r$   Ú_windows_unlink_with_retryr   r!   r	   r   rQ   r{   s    r+   Ú_releaseÚSoftFileLock._release¹   s{   € Ø�}‰}×)Ñ)Ñ5Ð5Ð5Ü
�Š�—‘×+Ñ+Ô,Ø%)ˆ�‰Ô"Ü�<‰<˜7Ó"Ø×+Ñ+Õ-äœ'Õ"Ü�T—^‘^Ó$×+Ñ+Ô-÷ #×"Ö"ús   Â	$B6Â6
Cc                ó:  • SnSn[        U5       H'  n [        U R                  5      R                  5           g    g ! [         aT  nUR
                  [        [        1;  a   S nA  g X1S-
  :  a!  [        R                  " U5        US-  n S nAM   S nAM…  S nAff = f)Né
   gü©ñÒMbP?r
   r2   )
Úranger	   r   rQ   r!   r"   r   r   r:   Úsleep)r&   Úmax_retriesÚretry_delayÚattemptr`   s        r+   rƒ   Ú'SoftFileLock._windows_unlink_with_retryÃ   s„   € ØˆØˆÜ˜[Ö)ˆGð	Ü�T—^‘^Ó$×+Ñ+Ô-ñ ò *øô ó %Ø—9‘9¤V¬U OÓ3ÝØ¨1™_Ó,Ü—J’J˜{Ô+Ø 1Ñ$–Kõ -ûð%ús   ”#<¼
BÁBÁ&#BÂB© N)ÚreturnÚNone)rJ   r@   r�   Úbool)rJ   r@   r�   ú
int | None)rt   r@   r�   r�   )r�   r’   )r�   r‘   )Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__r,   r%   r=   ÚstaticmethodrA   rB   r   ÚpropertyrJ   r|   r   r„   rƒ   Ú__static_attributes__rŽ   rT   r+   r   r      sŒ   † ñô6ô.$ôB"ð
 óó ðð( óHó ðHð8 ó(ó ð(ð óó ðð  ó'ó ð'ô*ô
.÷rT   r   )Ú
__future__r   r   r>   r#   r:   Ú
contextlibr   r"   r   r   r   r   Úpathlibr	   Ú_apir   Ú_utilr   r   rZ   r]   re   r<   r   Ú__all__rŽ   rT   r+   Ú<module>r¡      sY   ðÝ "ã 	Û Û 
Û Ý ß .Ó .Ý å ß FàÐ Ø!Ð Ø)/Ð &Ø #Ð ô}�<ô }ðB ð�rT   