
    6h]                    B   S SK Jr  S SKrS SKrS SKrS SK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JrJrJr  SSKJrJr   " S S5      r " S	 S
5      r " S S5      rSS 0rS r " S S5      rSS jr " S S5      rS r S r! " S S5      r" " S S5      r#g)    )annotationsN   )_)encodingerrorloggingutilpycompat	repocacheutilvfs)cborutilprocutilc                  :    \ rS rSrSrS r\S 5       rS rS r	Sr
g)	channeledoutput#   zN
Write data to out in the following format:

data length (unsigned int),
data
c                    Xl         X l        g N)outchannel)selfr   r   s      9/usr/lib/python3/dist-packages/mercurial/commandserver.py__init__channeledoutput.__init__+   s        c                     SU R                   -  $ Ns   <%c-channel>r   r   s    r   namechanneledoutput.name/       --r   c           	         U(       d  g U R                   R                  [        R                  " SU R                  [        U5      5      U-   5        U R                   R                  5         g )N   >cI)r   writestructpackr   lenflush)r   datas     r   r$   channeledoutput.write3   s@    v{{64<<TCdJKr   c                P    US;   a  [        U5      e[        U R                  U5      $ N)isattyfilenotellseek)AttributeErrorgetattrr   r   attrs     r   __getattr__channeledoutput.__getattr__:   '    77 &&txx&&r   )r   r   N)__name__
__module____qualname____firstlineno____doc__r   propertyr   r$   r5   __static_attributes__ r   r   r   r   #   s*     . .'r   r   c                  .    \ rS rSrSrSrS rS rS rSr	g)	channeledmessage@   z
Write encoded message and metadata to out in the following format:

data length (unsigned int),
encoded message and metadata, as a flat key-value dict.

Each message should have 'type' attribute. Messages of unknown type
should be ignored.
Tc                <    [        X5      U l        X0l        X@l        g r   )r   _coutr   	_encodefn)r   r   r   
encodenameencodefns        r   r   channeledmessage.__init__N   s    $S2
"!r   c                    [         R                  " U5      nUb  XS'   U R                  R                  U R	                  U5      5        g )Ns   data)r	   byteskwargsrD   r$   rE   )r   r)   optss      r   r$   channeledmessage.writeS   s:    ##D) M

-.r   c                .    [        U R                  U5      $ r   )r2   rD   r3   s     r   r5   channeledmessage.__getattr__Y   s    tzz4((r   )rD   rE   r   N)
r8   r9   r:   r;   r<   
structuredr   r$   r5   r>   r?   r   r   rA   rA   @   s     J"
/)r   rA   c                  b    \ rS rSrSrSrS r\S 5       rSS jr	S r
SS jrS	 rS
 r\rS rSrg)channeledinput]   a  
Read data from in_.

Requests for input are written to out in the following format:
channel identifier - 'I' for plain input, 'L' line based (1 byte)
how many bytes to send at most (unsigned int),

The client replies with:
data length (unsigned int), 0 meaning EOF
data
i   c                (    Xl         X l        X0l        g r   )in_r   r   )r   rT   r   r   s       r   r   channeledinput.__init__l   s    r   c                     SU R                   -  $ r   r   r   s    r   r   channeledinput.nameq   r!   r   c                    US:  aZ  U R                   nU R                  XR                  5      nUnU(       a(  U R                  XR                  5      nX2-  nU(       a  M(  U$ U R                  XR                  5      $ Nr   )maxchunksize_readr   r   sizesbufs       r   readchanneledinput.readu   sj    !8 $$D

4.ACJJt\\2 ! J::dLL11r   c                f   U(       d  gUS:  d   eU R                   R                  [        R                  " SX!5      5        U R                   R	                  5         U R
                  R                  S5      n[        R                  " SU5      S   nU(       d  gU R
                  R                  U5      $ )Nr   r   r#         >I)r   r$   r%   r&   r(   rT   r`   unpack)r   r]   r   lengths       r   r[   channeledinput._read   s~    axx 	v{{679:q!uf-a088==((r   c                   US:  at  U R                   nU R                  US5      nUnU(       aK  UR                  S5      (       d5  U R                  US5      nX2-  nU(       a  UR                  S5      (       d  M5  U$ U R                  US5      $ )Nr      L   
)rZ   r[   endswithr\   s       r   readlinechanneledinput.readline   s~    !8$$D

4&AC AJJu--JJtT* AJJu-- J::dD))r   c                    U $ r   r?   r   s    r   __iter__channeledinput.__iter__   s    r   c                @    U R                  5       nU(       d  [        eU$ r   )rl   StopIteration)r   ls     r   nextchanneledinput.next   s    MMOr   c                P    US;   a  [        U5      e[        U R                  U5      $ r,   )r1   r2   rT   r3   s     r   r5   channeledinput.__getattr__   r7   r   )r   rT   r   N))r8   r9   r:   r;   r<   rZ   r   r=   r   r`   r[   rl   ro   rt   __next__r5   r>   r?   r   r   rQ   rQ   ]   sL    
 L
 . .2) * H'r   rQ   s   cborc                L    SR                  [        R                  " U 5      5      $ Nr   )joinr   streamencode)vs    r   <lambda>r      s    sxx 5 5a 89r   c                    U R                  SS5      nU H$  n[        R                  U5      nU(       d  M!  X#4s  $    [        R                  " SSR                  U5      -  5      e)N	   cmdservers   message-encodingss"   no supported message encodings: %s    )
configlist_messageencodersgetr   Abortr|   )uiencnamesnfs       r   _selectmessageencoderr      s]    }}\+?@H  #14K  ++-		(0CC r   c                  b    \ rS rSrSrSS jrS rS rS rS r	S	 r
S
 rS rS r\\S.rS rSrg)server   za
Listens for commands on fin, runs them and writes the output on a channel
based stream to fout.
Nc                   [         R                  " 5       U l        U(       a)  UR                  U l        X l        UR                  U l        OXl        S =U l        U l        XPl        [        US5      U l	        [        US5      U l
        [        US5      U l        [        X4S5      U l        [        US5      U l        U R                  R                  SS5      S:X  a>  U R                  R!                  5       U l        [#        U R                  S U R                  S	9  S U l        UR                  S
S5      S:X  a  ['        U5      u  pg[)        USXg5      U l        X0l        UR-                  SS5      U l        S U l        U R.                  (       d9  [2        R2                  " [2        R4                  [2        R6                  5      U l        g g )N   d   e   o   I   rr      log   -)repofp   uis   message-outputs   channel   ms   shutdown-on-interrupt)r   getcwdcwdbaseuir   r   repoui_prereposetupsr   cdebugcerrcoutrQ   cincresultconfigcopysetuploggingcmsgr   rA   client
configbool_shutdown_on_interrupt_old_inthandlersignalSIGINTSIG_IGN)r   r   r   finfoutprereposetupsencnameencfns           r   r   server.__init__   sU   ??$ kkDGI''DKG&**DI+%dD1#D$/	#D$/	!#T2&tT277>>,/47 ggllnDGt<	99U-.*<226NG(tWDDI ')mm2'
#  $**#)==#OD  +r   c                    U R                   (       d0  [        R                  " [        R                  U R                  5        gg)z9release and restore resources taken during server sessionN)r   r   r   r   r   s    r   cleanupserver.cleanup   s(    **MM&--)=)=> +r   c                f    U(       d  gU R                   R                  U5      nU(       d  [        eU$ r{   )r   r`   EOFError)r   r]   r)   s      r   r[   server._read   s+    {{% Nr   c                    [         R                  " SU R                  S5      5      S   nU(       d  gU R                  U5      $ )zCread a string from the channel

format:
data length (uint32), data
rd   rc   r   r   )r%   re   r[   )r   rf   s     r   _readstrserver._readstr	  s6     udjjm4Q7zz&!!r   c                V    U R                  5       nU(       a  UR                  S5      $ / $ )z6read a list of NULL separated strings from the channel    )r   split)r   r^   s     r   	_readlistserver._readlist  s#    MMO775>!Ir   c                   SSK Jn  U R                  (       a  UR                  U5      $  [        R                  " [        R                  U R
                  5        UR                  U5      [        R                  " [        R                  [        R                  5        $ ! [        R                   a    e [         a     Of = f [        R                  " [        R                  [        R                  5        O8! [        R                  " [        R                  [        R                  5        f = fUR                  R                  [        S5      5        g)Nr   dispatchs   interrupted!
rx   ) r   r   r   r   r   r   r   SignalInterruptKeyboardInterruptr   r   )r   reqr   s      r   _dispatchcommandserver._dispatchcommand  s    &&$$S))	9MM&--)=)=>$$S) MM&--8 $$ 	  	
 	
 MM&--8FMM&--8 	Q()*s#   ?B B>;C6 =B>>C6 65D+c                F   SSK Jn  U R                  5       nU R                  R	                  5       nU/nU R
                  (       a  X0R
                  l        U R                  R                  U R                  5      nUR                  Ul        UR                  U5        U=U R
                  l        U R
                  R                  l        U R
                  R                  5         U HD  nUR                  5         [        U R                  S5      (       a  M0  UR!                  SSSS5        MF     UR#                  USS UU R
                  U R                  U R$                  U R&                  U R(                  U R*                  S	9n U R-                  U5      S
-  nU R.                  R1                  [2        R4                  " S[7        U5      5      5        SU;   a!  [8        R:                  " U R<                  5        gg! SU;   a!  [8        R:                  " U R<                  5        f f = f)zareads a list of   terminated arguments, executes
and writes the return code to the result channelr   r   r.   r   s   nonttys   trues   commandserverNr      s   >is   --cwd)r   r   r   r   r   r   r   r   	__class__appenddirstate_uiinvalidateall
resetstatehasattrr   	setconfigrequestr   r   r   r   r   r   r$   r%   r&   intoschdirr   )	r   r   argscopieduiuisr   r   r   rets	            r   
runcommandserver.runcommand6  s    	~~ 77<<>j99'II[[**4;;7F"--FKJJv4::DIIL499--1II##%BMMO 488X..UIw8HI  GIIHHIIIIII--  	
		#'',s2C LLv{{5#c(;< 4"  x4"  s   AG7 7)H c                V    U R                   R                  [        R                  5        g)z1writes the current encoding to the result channelN)r   r$   r   r   s    r   getencodingserver.getencodingh  s    8,,-r   c                    U R                   R                  5       S S nU(       aQ  U R                  R                  U5      nU(       a  U" U 5        US:g  $ [        R
                  " [        S5      U-  5      eUS:g  $ )Nrx   s   unknown command %sr   )r   rl   capabilitiesr   r   r   r   )r   cmdhandlers      r   serveoneserver.serveonel  sp    kk""$Sb)''++C0G cz kk!$9":S"@AAczr   )s
   runcommands   getencodingc                @   SSR                  [        U R                  5      5      -   nUS-  nUS[        R                  -   -  nUS-  nU R                  (       a  USU R                  R                  -  -  nUS[
        R                  " 5       -  -  n[        [        S5      (       a!  US-  nUS[        R                  " S	5      -  -  nU R                  R                  U5         U R                  5       (       a   U R                  5       (       a  M  g	! [         a     g
f = f)Ns   capabilities: r   rj   s
   encoding: s   message-encoding: %s
s   pid: %dgetpgids   pgid: %dr   r   )r|   sortedr   r   r   r   getpidr   r   r   r   r$   r   r   )r   hellomsgs     r   serveserver.serve{  s    $tyy8I8I1J'KKEMH$5$555E991DII4F4FFFHJ!2222y!!Hbjjm33H 			!	--// --//   	 	s   "+D 
DD)r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   )r8   r9   r:   r;   r<   r   r   r[   r   r   r   r   r   r   r   r   r>   r?   r   r   r   r      sH    
,P\?

	"40#d. $.{KLr   r   c                (   U R                  SS5      nU(       d  g[        U R                  SS5      5      nUS:X  a  U(       a  [        R                  " X$5      nOUS:X  a"  [        R                  " U R
                  U5      nO[        R                  " [        R                  " U5      5      nU R                  SS5      nU R                  SS5      n[        R                  " [        R                  R                  U5      5      n[        R                   " U[        R                  R#                  U5      UUUS9nU 1n	U(       a6  U	R%                  UR&                  5        U	R%                  UR(                  5        U	 H  n
U
R+                  SU5        M     g)	zSet up server logging facility

If cmdserver.log is '-', log messages will be sent to the given fp.
It should be the 'd' channel while a client is connected, and otherwise
is the stderr of the server process.
r   r   Ns	   track-logr   s   max-log-filess   max-log-size)maxfilesmaxsize)r   setr   r   fileobjectloggerferrr   abspath
expandpath	configintconfigbytesvfsmodr   r   pathdirname
fileloggerbasenameaddr   r   	setlogger)r   r   r   logpathtrackedloggerr   r   r   	targetuisus              r   r   r     s*    iif-G"--l;<G$2--b:	D--bggw?,,tw78<<.>?..?jj12''GGW%
 Idkk"dgg	L&) r   c                  &    \ rS rSrS rS rS rSrg)pipeservicei  c                    Xl         X l        g r   )r   r   )r   r   r   rK   s       r   r   pipeservice.__init__  s    	r   c                    g r   r?   r   s    r   initpipeservice.init  s    r   c                   U R                   nUR                  5        u  p#[        XR                  X#5      n UR	                  5       UR                  5         sS S S 5        $ ! UR                  5         f = f! , (       d  f       g = fr   )r   protectedfinoutr   r   r   r   )r   r   r   r   svs        r   runpipeservice.run  sb    WW ![cIIs1Bxxz

 "!
 

 "!s"   A5A A5 A22A55
B)r   r   N)r8   r9   r:   r;   r   r  r  r>   r?   r   r   r	  r	    s    	r   r	  c                 \    [         R                  " SS5        [        R                  " 5         g rY   )r   setpgidrandomseedr?   r   r   _initworkerprocessr    s     JJq! KKMr   c                   UR                  S5      nUR                  S5      nS n U" XXVU5      n UR                  5         UR                  5          UR!                  5          UR!                  5         g ! [        R                   a1  nU R                  [	        S5      UR
                  -  5         S nANsS nAf[         a     N[         a     Nf = f! UR                  5         f = f!   U(       a  UR                  n	O[        US5      n	U	R                  [        R                  " [        R                  " 5       5      5        e = f! [         a     g f = f! UR!                  5          UR!                  5         f ! [         a     f f = f= f)Nrbwbs
   abort: %s
r   )makefiler   r   r   r   messageBrokenPipeErrorr   r   r   r   r$   r   
strtolocal	traceback
format_excclose)
r   r   conncreatecmdserverr   r   r   r  instr   s
             r   _serverequestr&    s>   
--
C==D	BTMB	HHJ JJL 				JJL) {{ 	7HHQ~&566 	  		 JJL 77D"4.D

8&&y';';'=>?
  		 				JJL 		s   
C' A4 C' #E 4C'B4/C 4CC 	CC CC C$$C' 'AEE 
EEF'E87F8
FFFFc                  @    \ rS rSrSrSrS rS rS rS r	S r
S	 rS
rg)unixservicehandleri  zSet of pluggable operations for unix-mode services

Almost all methods except for createcmdserver() are called in the main
process. You can't pass mutable resource back from createcmdserver().
Nc                    Xl         g r   r   )r   r   s     r   r   unixservicehandler.__init__  s    r   c                    [         R                  " X5        UR                  [        R                  5        U R
                  R                  [        S5      U-  5        U R
                  R                  5         g )Ns   listening at %s
)	r   bindunixsocketlistensocket	SOMAXCONNr   statusr   r(   )r   sockaddresss      r   
bindsocketunixservicehandler.bindsocket  sJ    D*F$$%q-.89r   c                0    [         R                  " U5        g r   )r   unlink)r   r3  s     r   unlinksocketunixservicehandler.unlinksocket  s    
		'r   c                    g)z9True if server should shut down; checked per pollintervalFr?   r   s    r   
shouldexitunixservicehandler.shouldexit  s    r   c                    g)z/Called when main process notices new connectionNr?   r   s    r   newconnection unixservicehandler.newconnection   s    r   c                0    [        U R                  XXE5      $ )z`Create new command server instance; called in the process that
serves for the current connection)r   r   )r   r   r#  r   r   r   s         r   r$  "unixservicehandler.createcmdserver#  s     dggt$>>r   r*  )r8   r9   r:   r;   r<   pollintervalr   r4  r8  r;  r>  r$  r>   r?   r   r   r(  r(    s,     L>?r   r(  c                  d    \ rS rSrSrSS jrS rS rS rS r	S	 r
S
 rS rS rS rS rS rSrg)unixforkingservicei)  z?
Listens on unix domain socket and forks server per connection
Nc                   Xl         X l        US   U l        [        [        S5      (       d  [
        R                  " [        S5      5      eU R                  (       d  [
        R                  " [        S5      5      eU=(       d    [        U5      U l	        S U l
        S U l        S U l        S U l        [        5       U l        S U l        UR#                  SS5      nUS:  a  [
        R                  " [        S5      5      e[$        R&                  " X5      U l        [*        R,                  (       a  [.        R0                  " 5         g g )	Ns   addressAF_UNIXs   unsupported platforms'   no socket path specified with --addressr   s   max-repo-cacher   s(   negative max-repo-cache size not allowed)r   r   r3  r   r/  r   r   r   r(  _servicehandler_sock_mainipc
_workeripc_oldsigchldhandlerr   _workerpids_socketunlinkedr   r
   
repoloader_repoloaderr	   isdarwinr   gui)r   r   r   rK   r   maxlens         r   r   unixforkingservice.__init__.  s    	J'vy))++a 7899||++a JKLL&@*<R*@
"&5#l,=>A:++a KLMM$//; LLN r   c                X   [         R                   " [         R                  5      U l        [         R                  " [         R                  [         R                  5      nUu  U l        U l        U R                  R                  U R                  U R                  5        [        [        S5      (       a$  [        R                  " [        R                  5        [        R                  " [        R                  U R                  5      nXl        SU l        U R$                  R'                  5         g )NunblocksignalF)r/  rF  rH  
socketpair
SOCK_DGRAMrI  rJ  rG  r4  r3  r   r   rU  r   SIGCHLD_sigchldhandlerrK  rM  rO  start)r   os     r   r  unixforkingservice.initG  s    ]]6>>2
 fnnf.?.?@)*&t''

DLLA8_--""6>>2MM&..$*>*>?"#$ r   c                    U R                   (       d-  U R                  R                  U R                  5        SU l         g g )NT)rM  rG  r8  r3  r   s    r   _unlinksocket unixforkingservice._unlinksocketV  s0    ##  --dll;#'D  $r   c                t   [         R                   " [         R                  U R                  5        U R                  R	                  5         U R
                  R	                  5         U R                  R	                  5         U R                  5         U R                  R                  5         U R                  S5        g rY   )r   rX  rK  rH  r"  rI  rJ  r^  rO  stop_reapworkersr   s    r   _cleanupunixforkingservice._cleanup[  sv    fnnd&=&=>

!r   c                p     U R                  5         U R                  5         g ! U R                  5         f = fr   )	_mainlooprc  r   s    r   r  unixforkingservice.rune  s$    	NNMMODMMOs   # 5c                B   SnU R                   n[        R                  " 5       nUR                  U R                  [        R
                  U R                  5        UR                  U R                  [        R
                  U R                  5         U(       d'  UR                  5       (       a  U R                  5         SnUR                  UR                  S9nU(       d
  U(       a  O+MY  U H!  u  pVUR                  UR                  U5        M#     M  UR                  5         g )NFT)timeout)rG  	selectorsDefaultSelectorregisterrH  
EVENT_READ_acceptnewconnectionrI  _handlemainipcr;  r^  selectrB  r)   fileobjr"  )r   exitinghselectoreventskey_masks          r   rf  unixforkingservice._mainloopk  s      ,,.JJ	,,d.G.G	
 	MM9//1D1D	
 q||~~ ""$__Q^^_<F$
h/ % " 	r   c                   U R                   nUR                  5       u  pE[        R                  " 5       nU(       aZ   U R                  R                  SSU5        U R                  R                  U5        UR                  5         UR                  5         g  UR                  5         UR                  5         U R                  R                  5         U R                  U5        UR                  5         U R                  R                  5         [        R                  " S5        g ! UR                  5         f = f!    U R                  R                  SS9  [        R                  " S5         g ! [        R                  " S5        f = f= f)Nr   s   forked worker process (pid=%d)
r   T)forcer   )rG  acceptr   forkr   logrL  r  r>  r"  rI  
_runworkerrJ  _exitr   )r   r2  rt  rs  r#  _addrpids          r   rn  'unixforkingservice._acceptnewconnection  s     kkm ggi "Es   $$S)!

" 

##%%

%%' 

""GG%%D%1HHSMBHHSMs1   AD" BD7 "D47F:E+F+FFc                \    UR                  S5      nU R                  R                  U5        g)z#Process messages sent from a workeri   N)recvrO  load)r   r2  rt  r   s       r   ro  !unixforkingservice._handlemainipc  s$    yyd#r   c                B    U R                  [        R                  5        g r   )rb  r   WNOHANG)r   r   frames      r   rY  "unixforkingservice._sigchldhandler  s    "**%r   c                T   U R                   (       am   [        R                  " SU5      u  p#US:X  a  g U R
                  R                  SSU5        U R                   R                  U5        U R                   (       a  Ml  g g ! [         a    U R                   R	                  5          g f = f)Nrx   r   r   s   worker process exited (pid=%d)
)rL  r   waitpidChildProcessErrorclearr   r}  discard)r   optionsr  _statuss       r   rb  unixforkingservice._reapworkers  s    !zz"g6
 axGGKK&I3O$$S)  %   &&(s   B   $B'&B'c                Z   [         R                   " [         R                  U R                  5        [        5         U R                  n [        U R                  U R                  UUR                  U R                  /S9  [        R                  " 5         g ! [        R                  " 5         f = f)Nr   )r   rX  rK  r  rG  r&  r   r   r$  
_reposetupgccollect)r   r#  rs  s      r   r~  unixforkingservice._runworker  sq    fnnd&=&=>  				!!#/ JJLBJJLs   6B B*c                T   UR                  5       (       d  g  " S SUR                  5      nX2l        U R                  Ul        U R                  R                  UR                  5      nUc  g UR                  R                  SSUR                  5        [        R                  " XB5        g )Nc                  (   ^  \ rS rSrU 4S jrSrU =r$ )8unixforkingservice._reposetup.<locals>.unixcmdserverrepoi  c                   > [         TU ]  5          U R                  R                  U R                  5        g ! [
         a    U R                  R                  SS5         g f = f)Nr   s#   failed to send repo root to master
)superr"  _cmdserveripcsendrootOSErrorr   r}  )r   r   s    r   r"  >unixforkingservice._reposetup.<locals>.unixcmdserverrepo.close  sN    &&++DII6 GGKK$&Ms   %7 &A A r?   )r8   r9   r:   r;   r"  r>   __classcell__)r   s   @r   unixcmdserverrepor    s     r   r  s	   repocaches   repo from cache: %s
)localr   rJ  r  rO  r   r  r   r}  r
   	copycache)r   r   r   r  
cachedrepos        r   r  unixforkingservice._reposetup  s}    zz||	 	 +!__%%))$))4
L":DIIFJ-r   )rI  rK  rO  rG  rH  rM  rJ  rL  r3  r   r   r   )r8   r9   r:   r;   r<   r   r  r^  rc  r  rf  rn  ro  rY  rb  r~  r  r>   r?   r   r   rD  rD  )  sD    2!(
:"B$
&*.r   rD  )NN)$
__future__r   r  r   r  rj  r   r/  r%   r   i18nr   r   r   r   r   r	   r
   r   r   r   utilsr   r   r   rA   rQ   r   r   r   r   r	  r  r&  r(  rD  r?   r   r   <module>r     s    # 	 	         ' ':) ):T' T'p 9 
N Nb&*R ($ F? ?Dz. z.r   