Ë
    Ûvžj¬  ã                   ó~   — d Z ddlZddlZddlZdZdZdZdZd„ Zd„ Z	d	„ Z
d
„ Zd„ Zeeedfd„Zeefd„Zd„ Zdd„Zd„ Zy)aI  
state uses "poor man's locking": nodejs does not support fcntl (POSIX) or 
LockFileEx (Windows) locking. This module implements a simple locking 
mechanism for nodejs and Python leveraging "mkdir" to create locks. 

Ideas are taken from the node js library "proper-lockfile"
(https://github.com/moxystudio/node-proper-lockfile)
é    Ni¸  é   iô  z~/.ocpvscodec                  ó    — t        t        «      S )úGet the config file)Úresolve_pathÚCONFIG_FILE© ó    úa/workspace/moltex-experiments/.pixi/envs/default/lib/python3.12/site-packages/ocp_vscode/state.pyÚget_config_filer      s   € äœÓ$Ð$r	   c                 ó   — | › d�S )z$Get the lock file for the given filez.lockr   ©Úfiles    r
   Úget_lock_filer      s   € àˆV�5ˆ>Ðr	   c                 óz   — t         j                  j                  t         j                  j                  | «      «      S )z&Resolve the canonical path of the file)ÚosÚpathÚrealpathÚ
expanduserr   s    r
   r   r      s&   € ä�7‰7×ÑœBŸG™G×.Ñ.¨tÓ4Ó5Ð5r	   c                 ó6   — t        j                   «       | z
  |kD  S )zCheck if the lock is stale)Útime)ÚmtimeÚstale_secondss     r
   Úis_lock_staler   #   s   € ä�I‰I‹K˜%Ñ =Ñ0Ð0r	   c                 ó¢   — 	 t        j                  | «       y# t        $ r t        d| › d�«       Y yt        $ r}t        d| › �«      |‚d}~ww xY w)zRemove the lockfileú
Lock file z
 not foundzUnable to remove lock file N)r   ÚrmdirÚFileNotFoundErrorÚprintÚ	ExceptionÚRuntimeError)ÚlockfileÚexs     r
   Úremove_lockr#   (   sT   € ðMÜ
�‰�ÕøÜò 1Ü�
˜8˜* JÐ/Ö0Üò MÜÐ8¸¸
ÐCÓDÈ"ÐLûðMús   ‚ ˜A²AºA	Á	Ac           	      óJ  — 	 t        j                  | «       y# t        $ rå t        d| › d�«       t	        t        j
                  | «      j                  |dz  «      r[t        d| › d�«       	 t        | «       n+# t        $ r Y n t        $ r}t        d| › d�«      |‚d}~ww xY wt        | ||||dz   «       Y y||k  r7t        j                  |dz  «       t        d	«       t        | ||||dz   «       Y yt        d
| › d|› d�«      ‚t        $ r}t        d| › d�«      |‚d}~ww xY w)z#Acquire the lock for the given filer   z already existsiè  z	 is stalez!Unable to remove stale lock file Ú.Né   zRetrying to acquire lockz Unable to acquire lock for file z after z retrieszCannot create lock file )r   ÚmkdirÚFileExistsErrorr   r   ÚstatÚst_mtimer#   r   r   r    Úacquire_lockr   Úsleep)r!   ÚretriesÚinterval_msÚstale_duration_msÚretryr"   s         r
   r+   r+   2   sA  € ð!KÜ
�‰�Õøô ò Ü�
˜8˜* OÐ4Ô5ÜœŸ™ Ó*×3Ñ3Ð5FÈÑ5MÔNÜ�J˜x˜j¨	Ð2Ô3ðä˜HÕ%øÜ$ò ÙÜò Ü"Ø7¸°zÀÐCóàðûðúô ˜ 7¨KÐ9JÈEÐTUÉIÖVà�wŠÜ—
‘
˜;¨Ñ-Ô.ÜÐ0Ô1ÜØ˜g {Ð4EÀuÈqÁyöô #Ø6°x°jÀÈÀyÐPXÐYóð ô ò KÜÐ5°h°Z¸qÐAÓBÈÐJûðKúsR   ‚ ˜AD"Á,A8Á7D"Á8	B ÂD"ÂB ÂBÂB Â D"Â7:D"Ã3D"ÄDÄD"c                 ó4   — t        | «      }t        |||«       y)zLock the given fileN)r   r+   )r   r-   r.   r!   s       r
   Úlockr2   `   s   € ä˜TÓ"€HÜ�˜7 KÕ0r	   c                 ó0   — t        | «      }t        |«       y)zUnlock the given fileN)r   r#   )r   r!   s     r
   Úunlockr4   f   s   € ä˜TÓ"€HÜ�Õr	   c                 óÎ  — t        t        «      }t        |«       	 t        |dd¬«      }|j	                  «       }|dk(  ri }nt        j                  |«      }|j                  «        t        | «      } |j                  | «      €i || <   |€|| = n†|€||    |= n}t        |t        «      r0|j                  t         j"                  j$                  «      ||    |<   n=|D �cg c]+  }|j                  t         j"                  j$                  «      ‘Œ- c}||    |<   	 t        |d	d¬«      5 }|j'                  t        j(                  |d
¬«      «       ddd«       t        |«       y# t        $ r t        |dd¬«      }i }Y �Œ#t        $ r }t        |«       t        d|› d�«      |‚d}~ww xY wc c}w # 1 sw Y   ŒaxY w# t        $ r}t        d|› d�«      |‚d}~ww xY w# t        |«       w xY w)z4Update the config file with the given key/value pairzr+úutf-8©ÚencodingÚ zw+zUnable to open config file r%   NÚwé   )ÚindentzUnable to write config file )r   r   r2   ÚopenÚreadÚjsonÚloadsr   r   r4   r    ÚcloseÚstrÚgetÚ
isinstanceÚrstripr   r   ÚsepÚwriteÚdumps)ÚportÚkeyÚvalueÚconfig_fileÚfdÚconfigr"   Úvs           r
   Úupdate_staterP   l   s·  € ô œ{Ó+€KÜˆÔðQä�+˜t¨gÔ6ˆØ—‘“ˆØ�RŠ<Ø‰Fä—Z‘Z Ó'ˆFð ‡H�H„Jäˆt‹9€DØ‡z�z�$ÓÐØˆˆt‰à
€{Ø�4‰LØ	ˆØ�4‰L˜ÑÜ	�Eœ3Ô	Ø!ŸL™L¬¯©¯©Ó5ˆˆt‰�SÒá<AÓB¹E°q˜QŸX™X¤b§g¡g§k¡kÕ2¸EÑBˆˆt‰�SÑðÜ�+˜s¨WÕ5¸Ø�H‰H”T—Z‘Z ¨qÔ1Ô2÷ 6ô
 	ˆ{Õøô9 ò ä�+˜t¨gÔ6ˆØ‹Üò QÜˆ{ÔÜÐ8¸¸ÀQÐGÓHÈbÐPûðQüò  C÷ 6Ð5ûäò MÜÐ9¸&¸ÀÐCÓDÈ"ÐLûðMûô 	ˆ{Õús_   œ;E Ã0F%ÄF6 Ä#'F*Å
F6 ÅF"Å:F"ÆFÆF"Æ*F3Æ/F6 Æ6	GÆ?GÇGÇG ÇG$c                  óŠ  — t        t        «      } t        | «       	 t        | dd¬«      5 }|j	                  «       }|dk(  ri }nt        j                  |«      }ddd«       t        | «       S # 1 sw Y   ŒxY w# t        $ r@}t        | d«      5 }|j                  d«       ddd«       n# 1 sw Y   nxY wi }Y d}~|S d}~ww xY w)r   Úrr6   r7   r9   Nr:   z{}
)
r   r   r2   r=   r>   r?   r@   r4   r   rG   )rL   rM   rN   r"   s       r
   Ú	get_staterS   ˜   sª   € äœ{Ó+€KÜˆÔðÜ�+˜s¨WÕ5¸Ø—W‘W“YˆFØ˜Š|Ø‘äŸ™ FÓ+�÷ 6ô 	ˆ{Ôð €M÷ 6Ð5ûô ò Ü�+˜sÔ# rØ�H‰H�VÔ÷ $×#Ñ#úàŒà€MûðúsF   œA9 ª.A-ÁA9 Á-A6Á2A9 Á9	CÂB=ÂB)Â 	B=Â)B2	Â.	B=Â=C)NN)Ú__doc__r?   r   r   ÚSTALE_DURATION_MSÚRETRIESÚINTERVAL_MSr   r   r   r   r   r#   r+   r2   r4   rP   rS   r   r	   r
   Ú<module>rX      su   ðñó Û 	Û àÐ Ø
€Ø€Ø€ò%ò
ò
6ò
1ò
Mð ØØ'Ø
ó+Kð\ ¨Kó 1òó)óXr	   