^c.ddlZddlZddlZddlZddlZddlZddlZddlmZddl m Z ddl m Z m Z m Z mZddlmZdZejdZd ZGd d Zd ZdS) N)_)getattr)encodingerrorpycompatutil)procutilc tjtj}tjdr> |dtjdj zz }n#tttf$rYnwxYw|S)a Return a string which is used to differentiate pid namespaces It's useful to detect "dead" processes and remove stale locks with confidence. Typically it's just hostname. On modern linux, we include an extra Linux-specific pid namespace identifier. slinuxs/%xs/proc/self/ns/pid) r strtolocalsocket gethostnamer sysplatform startswithosstatst_inoFileNotFoundErrorPermissionErrorNotADirectoryError)results 0/usr/lib/python3/dist-packages/mercurial/lock.py_getlockprefixrs !3!5!5 6 6F&&x00  frw';<<CC CFF!?4FG    D  MsA&&B?Bc#DKgdi}dfd} dD]5}tt|d}|r||vrtj|||<6 |D]}tj||n#t$rYnwxYwddVd |D]\}}tj||nW#t$rYnKwxYw#d |D]\}}tj||w#t$rYwwxYwxYwrddSdS)a@Block signal interrupt while doing something critical This makes sure that the code block wrapped by this context manager won't be interrupted. For Windows developers: It appears not possible to guard time.sleep() from CTRL_C_EVENT, so please don't use time.sleep() to test if this is working. Fc|ttddks|ttddkrttj)NSIGINT CTRL_C_EVENT)rsignalKeyboardInterruptrSignalInterrupt)nums rraiseinterruptz)_delayedinterrupt..raiseinterrupt=sI '&(D11 1 1SG ND= = 6 6 $ #' 'cPr|dS|dSN)append)r!frame assertedsigsblockedr"s r catchtermz$_delayedinterrupt..catchtermEs;     $ $ $ $ $ N3     r#)s CTRL_C_EVENTsSIGINTsSIGBREAKsSIGHUPsSIGTERMNTr)rr getsignal ValueErroritems) orighandlersr*namer!handlerr(r)r"s @@@r_delayedinterruptr1.sLGL(((        : :D&$--C :s,..$*$4S$9$9 S! # . . c9---- .    D     , 2 2 4 4 , , W c7++++ ,    D    , 2 2 4 4 , , W c7++++ ,    D  (|A'''''((se8CA+*C+ A85C7A88 C/B44 CCD/C87D8 DDDDc fd}t||dg|Rddi| |r|rdnd}d} |sd} n|r|} d} n#tj$r} | |kr||j| j| | kr||j| j|| kr0tjtj| j j | jtj d| dz } Yd} ~ nd} ~ wwxYw| _ j r]d| cxkr j kr.nn+|td  j zn|d j z jr  S) zreturn an acquired lock or raise an a LockHeld exception This function is responsible to issue warnings and or debug messages about the held lock while trying to acquires it.cPd|vrj|dd\}}tdtjjtj|tj|fz}n+tdjtj|fz}||dS)z=issue the usual "waiting on lock" message through any channel:rs5waiting for lock on %s held by process %r on host %r s"waiting for lock on %s held by %r N)splitrrbytestrdesc)printerlockerhostpidmsgls r printwarningztrylock..printwarningws 6>> T1--ID#I (( %% &&CC:;; ((?C  r#rdolockFTrNsgot lock after %d seconds )lock_trylockrLockHelddebugr9warnerrno ETIMEDOUTfilenamer7timesleepdelayr acquirefn) uivfslocknametimeout warntimeoutargskwargsr>debugidx warningidxrKinstr=s @rtrylockrWqs & S(A====U=f==A 5W5qq2HJ ! ! E  JJLLL ~      RXt{333 "" RWdk222%nOT]AFDK JqMMM QJEEEEEE   AGw? % % % %ag % % % % % GGA455? @ @ @ @ HH3ag= > > >{ HsAC'BC""C'cneZdZdZdZ ddZdZdZdZd Z d Z d Z d Z d Z dZdZddZdS)rAaAn advisory lock held by one process to control access to a set of files. Non-cooperating processes or incorrectly written scripts can ignore Mercurial's locking scheme and stomp all over the repository, so don't do that. Typically used via localrepository.lock() to lock the repository store (.hg/store/) or localrepository.wlock() to lock everything else under .hg/.Nr@Tc \||_||_d|_||_||_||_||_|r t|_ntj |_g|_ | |_ |r6||_|jr|dSdSdS)Nr)rNfheldrP releasefnrLr7r1_maybedelayedinterruptr nullcontextmanager postrelease_getpidr;rArK) selfrNfnamerPr\rLr7 signalsafer?s r__init__z lock.__init__s  ""  B*;D ' '*.*AD '<<>>  !DJ~ !      ! ! ! !r#c|Sr%ras r __enter__zlock.__enter__s r#cjtd|||fD}||dS)Nc3K|]}|duV dSr%rf).0as r z lock.__exit__..s&GGAa4iGGGGGGr#)success)allrelease)raexc_type exc_valueexc_tbrns r__exit__z lock.__exit__s?GG(Iv)FGGGGG W %%%%%r#c|jr#tjdtdd|_|dS)Nz$use lock.release instead of del lock)category stacklevelr)r[warningsrEDeprecationWarningrprgs r__del__z lock.__del__sH 9  M6+    DI r#c(tjSr%)r getpidrgs rr`z lock._getpids   r#c2|j} ||j|z S#tj$r_}|dkr$t jd|dkr|dz}Yd}~Ytjt j|j|j |j d}~wwxYw)NTrr) rPrBrrCrIrJrFrGrHr7r9)rarPrVs rrAz lock.locks,   |g-->   a<<JqMMM{{1 HHHHnOT]DIt{  s(B%B!0BBc|jr|xjdz c_dStjtt_dtj|jfz}d}|js;|r8|dz} |5|j||jd|_dddn #1swxYwYn#ttf$r}|j tj krv| }|Yd}~||}|Ctjtj|j|j|j|n+tj|j |j|j|jYd}~nd}~wwxYw|js|8|jsCtjtj|j|j|jddS)Nrs%s:%dr#)r[rA_hostrr;r]rNmakelockrZOSErrorIOErrorrFEEXIST _readlock _testlockrrCEAGAINjoinr7LockUnavailablestrerrorrH)rarOretrywhyr9s rrBz lock._trylock s. 9  IINII F : '))DJtz4844)   QJE 0022""H%%h777 !DI"""""""""""""""W%   9 ,,!^^--F~ !^^F33F)#n!L HMM$&11 I" * / 3<ty*))))  )  2y . dhmmDF33TY   sC'B;;(B/# B;/B33B;6B37B;;F  +F5  T1--ID##   55  4:  5 c((CC   55   C  5ts ..A A"!A"c||s|S t|j|jdzd5|}||s|cdddS|j|jddddS#1swxYwYdS#t j$r|cYSwxYw)Ns.breakr)rP)rrArNrZrunlinkr LockErrorrar9s rrzlock._testlockMs4''// M dh 2A>>> ( ())//77"! ( ( ( ( ( ( ( ('''  ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (    MMM s@B)+B# B)0B B)B  B)#B $B))B=<B=cT|}||S)aoreturn id of locker if lock is valid, else None. If old-style lock, we cannot tell what machine locker is on. with new-style lock, if locker is on this machine, we can see if locker is alive. If locker is on this machine but not alive, we can safely break lock. The lock file is only deleted when None is returned. )rrrs rtestlockz lock.testlock\s%!!~~f%%%r#c|jdkr|xjdzc_dS|jdkrd|_||jkrdS |jr| |j|jnE#t$rYn9wxYw# |j|jw#t$rYwwxYwxYw|jD] }||d|_dSdS)zrelease the lock and execute callback function if any If the lock has been acquired multiple times, the actual release is delayed to the last release call.rrN) r[r`r;r\rNrrZrr_)rarncallbacks rrpz lock.releasejs) 9q== IINIIII Y!^^DI||~~)) >%NN$$$HOODF++++DHOODF++++D!, " "!!!!#D   %^sBB,B BBCB>=C> C C C  C)r@NNNTT)T)__name__ __module__ __qualname____doc__rrdrhrtr{r`rArBrrrrrprfr#rrArAs" E  !!!!:&&&   !!! &&&P   "    & & &$$$$$$r#rAc<|D]}||dSr%)rp)locksrAs rrprps/   LLNNNr#) contextlibrFrrr rIryi18nrrrrrr utilsr rcontextmanagerr1rWrArprfr#rrsF      ?(?(?(D; ; ; |T$T$T$T$T$T$T$T$nr#