
    q&f]                     4   d dl Z d dlZd dlZd dlZd dlZd dlZd dlZd dlZddlm	Z	 ddl
mZmZmZmZmZmZmZ ddlmZmZ  G d d      Z G d d	      Z G d
 d      Zdd iZd Z G d d      ZddZ G d d      Zd Zd Z G d d      Z  G d d      Z!y)    N   )_)encodingerrorloggingutilpycompat	repocacheutilvfs)cborutilprocutilc                   2    e Zd ZdZd Zed        Zd Zd Zy)channeledoutputz^
    Write data to out in the following format:

    data length (unsigned int),
    data
    c                      || _         || _        y N)outchannel)selfr   r   s      9/usr/lib/python3/dist-packages/mercurial/commandserver.py__init__zchanneledoutput.__init__*   s        c                      d| j                   z  S Ns   <%c-channel>r   r   s    r   namezchanneledoutput.name.       --r   c           	          |sy | j                   j                  t        j                  d| j                  t        |            |z          | j                   j                          y )N   >cI)r   writestructpackr   lenflush)r   datas     r   r    zchanneledoutput.write2   s@    v{{64<<TCdJKr   c                 L    |dv rt        |      t        | j                  |      S N)isattyfilenotellseek)AttributeErrorgetattrr   r   attrs     r   __getattr__zchanneledoutput.__getattr__9   '    77 &&txx&&r   N)	__name__
__module____qualname____doc__r   propertyr   r    r0    r   r   r   r   "   s*     . .'r   r   c                   &    e Zd ZdZdZd Zd Zd Zy)channeledmessagea	  
    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                 B    t        ||      | _        || _        || _        y r   )r   _coutr   	_encodefn)r   r   r   
encodenameencodefns        r   r   zchanneledmessage.__init__M   s    $S'2
"!r   c                     t        j                  |      }|||d<   | j                  j                  | j	                  |             y )Ns   data)r   byteskwargsr;   r    r<   )r   r%   optss      r   r    zchanneledmessage.writeR   s<    ##D) DM

-.r   c                 .    t        | j                  |      S r   )r-   r;   r.   s     r   r0   zchanneledmessage.__getattr__X   s    tzz4((r   N)r2   r3   r4   r5   
structuredr   r    r0   r7   r   r   r9   r9   ?   s     J"
/)r   r9   c                   V    e Zd ZdZdZd Zed        ZddZd Z	ddZ
d Zd	 ZeZd
 Zy)channeledinputa/  
    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                 .    || _         || _        || _        y r   )in_r   r   )r   rG   r   r   s       r   r   zchanneledinput.__init__k   s    r   c                      d| j                   z  S r   r   r   s    r   r   zchanneledinput.namep   r   r   c                     |dk  rR| j                   }| j                  || j                        }|}|r$| j                  || j                        }||z  }|r$|S | j                  || j                        S Nr   )maxchunksize_readr   r   sizesbufs       r   readzchanneledinput.readt   sp    !8 $$D

4.ACJJtT\\2q  J::dDLL11r   c                 N   |sy|dkD  sJ | j                   j                  t        j                  d||             | j                   j	                          | j
                  j                  d      }t        j                  d|      d   }|sy| j
                  j                  |      S )Nr   r   r         >I)r   r    r!   r"   r$   rG   rQ   unpack)r   rN   r   lengths       r   rL   zchanneledinput._read   s    axx 	v{{67D9:q!uf-a088==((r   c                     |dk  r`| j                   }| j                  |d      }|}|r<|j                  d      s+| j                  |d      }||z  }|r|j                  d      s+|S | j                  |d      S )Nr      L   
)rK   rL   endswithrM   s       r   readlinezchanneledinput.readline   sz    !8$$D

4&AC AJJu-JJtT*q AJJu- J::dD))r   c                     | S r   r7   r   s    r   __iter__zchanneledinput.__iter__   s    r   c                 6    | j                         }|st        |S r   )r[   StopIteration)r   ls     r   nextzchanneledinput.next   s    MMOr   c                 L    |dv rt        |      t        | j                  |      S r'   )r,   r-   rG   r.   s     r   r0   zchanneledinput.__getattr__   r1   r   N))r2   r3   r4   r5   rK   r   r6   r   rQ   rL   r[   r]   ra   __next__r0   r7   r   r   rE   rE   \   sL    
 L
 . .2) * H'r   rE   s   cborc                 J    dj                  t        j                  |             S Nr   )joinr   streamencode)vs    r   <lambda>rj      s    sxx 5 5a 89 r   c                     | j                  dd      }|D ]  }t        j                  |      }|s||fc S  t        j                  ddj                  |      z        )N	   cmdservers   message-encodingss"   no supported message encodings: %s    )
configlist_messageencodersgetr   Abortrg   )uiencnamesnfs       r   _selectmessageencoderrv      sb    }}\+?@H   #a4K ++-		(0CC r   c                   X    e Zd ZdZddZd Zd Zd Zd Zd Z	d	 Z
d
 Zd Ze
edZd Zy)serverzm
    Listens for commands on fin, runs them and writes the output on a channel
    based stream to fout.
    Nc                 ~   t        j                         | _        |r*|j                  | _        || _        |j                  | _        n|| _        d x| _        | _        || _        t        |d      | _	        t        |d      | _
        t        |d      | _        t        ||d      | _        t        |d      | _        | j                  j                  dd      dk(  rA| j                  j!                         | _        t#        | j                  d | j                  	       d | _        |j                  d
d      dk(  r!t'        |      \  }}t)        |d||      | _        || _        |j-                  dd      | _        d | _        | j.                  s8t3        j2                  t2        j4                  t2        j6                        | _        y y )N   d   e   o   I   rrl      log   -)repofp   uis   message-outputs   channel   ms   shutdown-on-interrupt)r   getcwdcwdbaseuirr   r   repoui_prereposetupsr   cdebugcerrcoutrE   cincresultconfigcopysetuploggingcmsgrv   r9   client
configbool_shutdown_on_interrupt_old_inthandlersignalSIGINTSIG_IGN)r   rr   r   finfoutprereposetupsencnameencfns           r   r   zserver.__init__   sc   ??$ kkDGDI''DKDG&**DI+%dD1#D$/	#D$/	!#tT2&tT277>>,/47 ggllnDGt<	99U-.*<226NGU(tWeDDI ')mm2'
#  $**#)==#OD  +r   c                 z    | j                   s/t        j                  t        j                  | j                         yy)z9release and restore resources taken during server sessionN)r   r   r   r   r   s    r   cleanupzserver.cleanup   s(    **MM&--)=)=> +r   c                 R    |sy| j                   j                  |      }|st        |S rf   )r   rQ   EOFError)r   rN   r%   s      r   rL   zserver._read   s+    {{% Nr   c                 z    t        j                  d| j                  d            d   }|sy| j                  |      S )z[read a string from the channel

        format:
        data length (uint32), data
        rT   rS   r   r   )r!   rU   rL   )r   rV   s     r   _readstrzserver._readstr  s6     udjjm4Q7zz&!!r   c                 L    | j                         }|r|j                  d      S g S )z6read a list of NULL separated strings from the channel    )r   split)r   rO   s     r   	_readlistzserver._readlist  s#    MMO775>!Ir   c                    ddl m} | j                  r|j                  |      S 	 t        j                  t        j                  | j
                         |j                  |      t        j                  t        j                  t        j                         S # t        j                  $ r  t        $ r Y nw xY w	 t        j                  t        j                  t        j                         n7# t        j                  t        j                  t        j                         w xY w|j                  j                  t        d             y)Nr   dispatchs   interrupted!
rc   ) r   r   r   r   r   r   r   SignalInterruptKeyboardInterruptrr   r   )r   reqr   s      r   _dispatchcommandzserver._dispatchcommand  s    &&$$S))	9MM&--)=)=>$$S) MM&--8 $$ 	  	
 	
 MM&--8FMM&--8 	Q()*s#   >B B52C, 4B55C, ,4D c           
      &   ddl m} | j                         }| j                  j	                         }|g}| j
                  r|| j
                  _        | j                  j                  | j                        }|j                  |_        |j                  |       |x| j
                  _        | j
                  j                  _        | j
                  j                          |D ]=  }|j                          t        | j                  d      r*|j!                  dddd       ? |j#                  |dd || j
                  | j                  | j$                  | j&                  | j(                  | j*                  	      }	 | j-                  |      d
z  }| j.                  j1                  t3        j4                  dt7        |                   d|v r t9        j:                  | j<                         yy# d|v r t9        j:                  | j<                         w w xY w)zireads 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   rr   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   rr   r   rets	            r   
runcommandzserver.runcommand5  s    	~~ 77<<>j99'DII[[**4;;7F"--FKJJv4::DIIL499--1II##% 	JBMMO 488X.UIw8HI	J GIIHHIIIIII--  	
		#'',s2C LLv{{5#c(;< 4"  x4"  s   9AG* *&Hc                 V    | j                   j                  t        j                         y)z1writes the current encoding to the result channelN)r   r    r   r   s    r   getencodingzserver.getencodingg  s    8,,-r   c                     | j                   j                         d d }|rK| j                  j                  |      }|r ||        |dk7  S t	        j
                  t        d      |z        |dk7  S )Nrc   s   unknown command %sr   )r   r[   capabilitiesrp   r   rq   r   )r   cmdhandlers      r   serveonezserver.serveonek  sp    kk""$Sb)''++C0G cz kk!$9":S"@AAczr   )s
   runcommands   getencodingc                    ddj                  t        | j                              z   }|dz  }|dt        j                  z   z  }|dz  }| j                  r|d| j                  j                  z  z  }|dt        j                         z  z  }t        t        d      r |dz  }|dt        j                  d	      z  z  }| j                  j                  |       	 | j                         r	 | j                         ry	# t        $ r Y y
w xY w)Ns   capabilities: rm   rY   s
   encoding: s   message-encoding: %s
s   pid: %dgetpgids   pgid: %dr   r   )rg   sortedr   r   r   r   getpidr   r   r   r   r    r   r   )r   hellomsgs     r   servezserver.servez  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   !C9 9	DDr   )r2   r3   r4   r5   r   r   rL   r   r   r   r   r   r   r   r   r7   r   r   rx   rx      sH    
,P\?

	"40#d. $.{KLr   rx   c                    | j                  dd      }|syt        | j                  dd            }|dk(  r|rt        j                  ||      }n|dk(  r!t        j                  | j
                  |      }nt        j                  t        j                  |            }| j                  dd      }| j                  dd      }t        j                  t        j                  j                  |            }t        j                   |t        j                  j#                  |      |||      }| h}	|r6|	j%                  |j&                         |	j%                  |j(                         |	D ]  }
|
j+                  d|        y)	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.
    rl   r   Ns	   track-logr   s   max-log-filess   max-log-size)maxfilesmaxsize)r   setrn   r   fileobjectloggerferrr
   abspath
expandpath	configintconfigbytesvfsmodr   r   pathdirname
fileloggerbasenameaddr   rr   	setlogger)rr   r   r   logpathtrackedloggerr   r   r   	targetuisus              r   r   r     s1    iif-G"--l;<G$2--b':	D--bggw?,,tw78<<.>?..?jj12''GGW%
 Idkk"dgg *	L&)*r   c                       e Zd Zd Zd Zd Zy)pipeservicec                      || _         || _        y r   )rr   r   )r   rr   r   rA   s       r   r   zpipeservice.__init__  s    	r   c                      y r   r7   r   s    r   initzpipeservice.init  s    r   c                    | j                   }|j                         5 \  }}t        || j                  ||      }	 |j	                         |j                          cd d d        S # |j                          w xY w# 1 sw Y   y xY wr   )rr   protectedfinoutrx   r   r   r   )r   rr   r   r   svs        r   runzpipeservice.run  sq    WW ! 	[c4DIIsD1Bxxz

	 	
 

	 	s"   A8A#	A8#A55A88BN)r2   r3   r4   r   r   r   r7   r   r   r   r     s    	r   r   c                  X    t        j                  dd       t        j                          y rJ   )r   setpgidrandomseedr7   r   r   _initworkerprocessr     s     JJq! KKMr   c                    |j                  d      }|j                  d      }d }	  ||||||      }	 |j                          |j                          	 |j!                          	 |j!                          y # t        j                  $ r1}| j                  t	        d      |j
                  z         Y d }~rd }~wt        $ r Y t        $ r Y w xY w# |j                          w xY w#  |r|j                  }	nt        |d      }	|	j                  t        j                  t        j                                       xY w# t        $ r Y y w xY w# |j!                          	 |j!                          w # t        $ r Y w w xY wxY w)Nrbwbs
   abort: %s
r{   )makefiler   r   rq   r   messageBrokenPipeErrorr   r   r   r   r    r   
strtolocal	traceback
format_excclose)
rr   r   conncreatecmdserverr   r   r   r   instr   s
             r   _serverequestr    sB   
--
C==D	BT4dMB	HHJ JJL 				JJL) {{ 	7HHQ~&566 	  		 JJL 77D"4.D

8&&y';';'=>?
  		 				JJL 		s   C& A6 C& %D= 6C	'B50C 5CC CC CC C##C& &AD::E =	E	E	E>E/.E>/	E;8E>:E;;E>c                   8    e Zd ZdZdZd Zd Zd Zd Zd Z	d Z
y)	unixservicehandlerzSet 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                     || _         y r   )rr   )r   rr   s     r   r   zunixservicehandler.__init__  s	    r   c                     t        j                  ||       |j                  t        j                         | j
                  j                  t        d      |z         | j
                  j                          y )Ns   listening at %s
)	r
   bindunixsocketlistensocket	SOMAXCONNrr   statusr   r$   )r   sockaddresss      r   
bindsocketzunixservicehandler.bindsocket  sL    D'*F$$%q-.89r   c                 .    t        j                  |       y r   )r   unlink)r   r  s     r   unlinksocketzunixservicehandler.unlinksocket  s    
		'r   c                      y)z9True if server should shut down; checked per pollintervalFr7   r   s    r   
shouldexitzunixservicehandler.shouldexit  s    r   c                      y)z/Called when main process notices new connectionNr7   r   s    r   newconnectionz unixservicehandler.newconnection  s    r   c                 4    t        | j                  ||||      S )zhCreate new command server instance; called in the process that
        serves for the current connection)rx   rr   )r   r   r   r   r   r   s         r   r  z"unixservicehandler.createcmdserver"  s     dggtS$>>r   )r2   r3   r4   r5   pollintervalr   r  r  r  r  r  r7   r   r   r  r    s,     L>?r   r  c                   Z    e Zd ZdZddZd Zd Zd Zd Zd Z	d	 Z
d
 Zd Zd Zd Zd Zy)unixforkingservicezG
    Listens on unix domain socket and forks server per connection
    Nc                 Z   || _         || _        |d   | _        t        t        d      st        j                  t        d            | j                  st        j                  t        d            |xs t        |      | _	        d | _
        d | _        d | _        d | _        t               | _        d | _        |j#                  dd      }|dk  rt        j                  t        d            t%        j&                  ||      | _        t*        j,                  rt/        j0                          y y )	Ns   addressAF_UNIXs   unsupported platforms'   no socket path specified with --addressrl   s   max-repo-cacher   s(   negative max-repo-cache size not allowed)rr   r   r  r   r
  r   rq   r   r  _servicehandler_sock_mainipc
_workeripc_oldsigchldhandlerr   _workerpids_socketunlinkedr   r	   
repoloader_repoloaderr   isdarwinr   gui)r   rr   r   rA   r   maxlens         r   r   zunixforkingservice.__init__-  s    	J'vy)++a 7899||++a JKLL&@*<R*@
"&5#l,=>A:++a KLMM$//F; LLN r   c                 H   t        j                   t         j                        | _        t        j                  t         j                  t         j                        }|\  | _        | _        | j                  j                  | j                  | j                         t        t        d      r#t        j                  t        j                         t        j                  t        j                  | j                        }|| _        d| _        | j$                  j'                          y )NunblocksignalF)r
  r  r  
socketpair
SOCK_DGRAMr  r   r  r  r  r   r   r*  r   SIGCHLD_sigchldhandlerr!  r#  r%  start)r   os     r   r   zunixforkingservice.initF  s    ]]6>>2
 fnnf.?.?@)*&t''

DLLA8_-""6>>2MM&..$*>*>?"#$ r   c                 v    | j                   s-| j                  j                  | j                         d| _         y y )NT)r#  r  r  r  r   s    r   _unlinksocketz unixforkingservice._unlinksocketU  s0    ##  --dll;#'D  $r   c                 r   t        j                   t         j                  | j                         | j                  j	                          | j
                  j	                          | j                  j	                          | j                          | j                  j                          | j                  d       y rJ   )r   r-  r!  r  r   r  r   r2  r%  stop_reapworkersr   s    r   _cleanupzunixforkingservice._cleanupZ  sv    fnnd&=&=>

!r   c                 p    	 | j                          | j                          y # | j                          w xY wr   )	_mainloopr6  r   s    r   r   zunixforkingservice.rund  s$    	NNMMODMMOs   # 5c                    d}| j                   }t        j                         }|j                  | j                  t        j
                  | j                         |j                  | j                  t        j
                  | j                         	 |s"|j                         r| j                          d}|j                  |j                        }|s|rn(G|D ]!  \  }}|j                  |j                  |       # m|j                          y )NFT)timeout)r  	selectorsDefaultSelectorregisterr  
EVENT_READ_acceptnewconnectionr  _handlemainipcr  r2  selectr  r%   fileobjr   )r   exitinghselectoreventskey_masks          r   r8  zunixforkingservice._mainloopj  s      ,,.JJ	,,d.G.G	
 	MM9//1D1D	
 q||~ ""$__Q^^_<F$ 0
Uh/0 " 	r   c                    | j                   }|j                         \  }}t        j                         }|rZ	 | j                  j                  dd|       | j                  j                  |       |j                          |j                          y 	 |j                          |j                          | j                  j                          | j                  |       |j                          | j                  j                          t        j                  d       y # |j                          w xY w#  	 | j                  j                  d       t        j                  d       Y y # t        j                  d       w xY wxY w)Nrl   s   forked worker process (pid=%d)
r   T)forcer   )r  acceptr   forkrr   logr"  r   r  r   r  
_runworkerr   _exitr   )r   r  rE  rD  r   _addrpids          r   r?  z'unixforkingservice._acceptnewconnection  s     kkme ggi "Es   $$S)!

" 

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

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

""GG%%D%1HHSMBHHSMs1   AD B
D1 D.1F4E'F'E>>Fc                 \    |j                  d      }| j                  j                  |       y)z#Process messages sent from a workeri   N)recvr%  load)r   r  rE  r   s       r   r@  z!unixforkingservice._handlemainipc  s$    yyd#r   c                 B    | j                  t        j                         y r   )r5  r   WNOHANG)r   r   frames      r   r.  z"unixforkingservice._sigchldhandler  s    "**%r   c                 :   | j                   rf	 t        j                  d|      \  }}|dk(  ry | j
                  j                  dd|       | j                   j                  |       | j                   rey y # t        $ r | j                   j	                          Y y w xY w)Nrc   r   rl   s   worker process exited (pid=%d)
)r"  r   waitpidChildProcessErrorclearrr   rM  discard)r   optionsrQ  _statuss       r   r5  zunixforkingservice._reapworkers  s    !zz"g6W
 axGGKK&I3O$$S)  %   &&(s   A4 4#BBc                 Z   t        j                   t         j                  | j                         t                | j                  }	 t        | j                  | j                  ||j                  | j                  g       t        j                          y # t        j                          w xY w)Nr   )r   r-  r!  r   r  r  rr   r   r  
_reposetupgccollect)r   r   rD  s      r   rN  zunixforkingservice._runworker  sq    fnnd&=&=>  				!!#/ JJLBJJLs   9B B*c                 P   |j                         sy  G fdd|j                        |_        | j                  |_        | j                  j                  |j                        }|y |j                  j                  dd|j                         t        j                  ||       y )Nc                   "     e Zd Z fdZ xZS )8unixforkingservice._reposetup.<locals>.unixcmdserverrepoc                     t         |           	 | j                  j                  | j                         y # t
        j                  $ r | j                  j                  dd       Y y w xY w)Nrl   s#   failed to send repo root to master
)	superr   _cmdserveripcsendrootr
  r   rr   rM  )r   r   unixcmdserverrepos    r   r   z>unixforkingservice._reposetup.<locals>.unixcmdserverrepo.close  sW    '46&&++DII6|| GGKK$&Ms   %7 /A)(A))r2   r3   r4   r   __classcell__)r   rk  s   @r   rk  re    s     r   rk  s	   repocaches   repo from cache: %s
)localr   r   rh  r%  rp   rj  rr   rM  r	   	copycache)r   rr   r   
cachedrepork  s       @r   r`  zunixforkingservice._reposetup  s    zz|	 	 +!__%%))$))4
L":DIIFJ-r   r   )r2   r3   r4   r5   r   r   r2  r6  r   r8  r?  r@  r.  r5  rN  r`  r7   r   r   r  r  (  sD    2!(
:"B$
&*.r   r  )NN)"ra  r   r   r;  r   r
  r!   r   i18nr   r   r   r   r   r   r	   r
   r   r   utilsr   r   r   r9   rE   ro   rv   rx   r   r   r   r  r  r  r7   r   r   <module>rr     s    
 	         ' ':) ):T' T'p 9 
N Nb&*R ($ F? ?Dz. z.r   