
    	^c^                     l   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 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"dS )    N   )_)getattr)encodingerrorloggingutilpycompat	repocacheutilvfs)cborutilprocutilc                   :    e Zd ZdZd Zed             Zd Zd ZdS )channeledoutputz^
    Write data to out in the following format:

    data length (unsigned int),
    data
    c                 "    || _         || _        d S 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d S | j                             t          j        d| j        t          |                    |z              | j                                          d S )N   >cI)r   writestructpackr   lenflush)r   datas     r   r!   zchanneledoutput.write3   sV     	Fv{64<TCCdJKKKr   c                 R    |dv rt          |          t          | j        |          S N)isattyfilenotellseek)AttributeErrorr   r   r   attrs     r   __getattr__zchanneledoutput.__getattr__:   .    777 &&&tx&&&r   N)	__name__
__module____qualname____doc__r   propertyr   r!   r0    r   r   r   r   #   sf            . . X.  ' ' ' ' 'r   r   c                   (    e Zd ZdZdZd Zd Zd ZdS )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                 L    t          ||          | _        || _        || _        d S r   )r   _coutr   	_encodefn)r   r   r   
encodenameencodefns        r   r   zchanneledmessage.__init__N   s%    $S'22
"!r   c                     t          j        |          }|||d<   | j                            |                     |                     d S )Ns   data)r	   byteskwargsr;   r!   r<   )r   r&   optss      r   r!   zchanneledmessage.writeS   sI    #D)) DM
--.....r   c                 ,    t          | j        |          S r   )r   r;   r.   s     r   r0   zchanneledmessage.__getattr__Y   s    tz4(((r   N)r2   r3   r4   r5   
structuredr   r!   r0   r7   r   r   r9   r9   @   sR          J" " "
/ / /) ) ) ) )r   r9   c                   ^    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dS )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                 0    || _         || _        || _        d S r   )in_r   r   )r   rG   r   r   s       r   r   zchanneledinput.__init__l   s    r   c                     d| j         z  S r   r   r   s    r   r   zchanneledinput.nameq   r   r   c                     |dk     rJ| j         }|                     || j                  }|}|r"|                     || j                  }||z  }|"|S |                     || j                  S Nr   )maxchunksize_readr   r   sizesbufs       r   readzchanneledinput.readu   s|    !88 $D

4..AC JJtT\22q   J::dDL111r   c                 N   |sdS |dk    sJ | j                             t          j        d||                     | j                                          | j                            d          }t          j        d|          d         }|sdS | j                            |          S )Nr   r   r          >I)r   r!   r"   r#   r%   rG   rR   unpack)r   rO   r   lengths       r   rM   zchanneledinput._read   s     	3axxxx 	v{67D99:::q!!uf--a0 	)38==(((r   c                    |dk     rj| j         }|                     |d          }|}|rG|                    d          s2|                     |d          }||z  }|r|                    d          2|S |                     |d          S )Nr      L   
)rL   rM   endswithrN   s       r   readlinezchanneledinput.readline   s    !88$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                 @    |                                  }|st          |S r   )r\   StopIteration)r   ls     r   nextzchanneledinput.next   s"    MMOO 	 r   c                 R    |dv rt          |          t          | j        |          S r(   )r-   r   rG   r.   s     r   r0   zchanneledinput.__getattr__   r1   r   N)rI   )r2   r3   r4   r5   rL   r   r6   r   rR   rM   r\   r^   rb   __next__r0   r7   r   r   rE   rE   ]   s        
 
 L  
 . . X.2 2 2 2) ) ) * * * *     H' ' ' ' 'r   rE   s   cborc                 P    d                     t          j        |                     S Nr   )joinr   streamencode)vs    r   <lambda>rj      s    sxx 5a 8 899 r   c                     |                      dd          }|D ]$}t                              |          }|r||fc S %t          j        dd                    |          z            )N	   cmdservers   message-encodingss"   no supported message encodings: %s    )
configlist_messageencodersgetr   Abortrg   )uiencnamesnfs       r   _selectmessageencoderrv      sz    }}\+?@@H    ## 	a4KKK	
+-		(0C0CC  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e
edZd ZdS )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                            dd          dk    r:| j                                        | _        t#          | j        d | j	        	           d | _        |                    d
d          dk    r)t'          |          \  }}t)          |d||          | _        || _        |                    dd          | _        d | _        | j        s0t3          j        t2          j        t2          j                  | _        d S d S )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__   s   ?$$ 	+ kDGDI'DKKDG&**DI+%dD11#D$//	#D$//	!#tT22&tT227>>,//477 gllnnDGt<<<<	99U-..*<<2266NGU(tWeDDDI ')mm2'
 '
#  $* 	P#)=#O#OD   	P 	Pr   c                 `    | j         s&t          j        t          j        | j                   dS dS )z9release and restore resources taken during server sessionN)r   r   r   r   r   s    r   cleanupzserver.cleanup   s4    * 	?M&-)=>>>>>	? 	?r   c                 T    |sdS | j                             |          }|st          |S rf   )r   rR   EOFError)r   rO   r&   s      r   rM   zserver._read   s8     	3{%%  	Nr   c                     t          j        d|                     d                    d         }|sdS |                     |          S )z[read a string from the channel

        format:
        data length (uint32), data
        rU   rT   r   r   )r"   rV   rM   )r   rW   s     r   _readstrzserver._readstr	  sC     udjjmm44Q7 	3zz&!!!r   c                 \    |                                  }|r|                    d          S g S )z6read a list of NULL separated strings from the channel    )r   split)r   rP   s     r   	_readlistzserver._readlist  s,    MMOO 	775>>!Ir   c                 N   ddl m} | j        r|                    |          S 	 t          j        t          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                   n.# t          j        t          j        t          j                   w xY w|j
                            t          d                     dS )Nr   dispatchs   interrupted!
rI   ) r   r   r   r   r   r   r   SignalInterruptKeyboardInterruptrr   r   )r   reqr   s      r   _dispatchcommandzserver._dispatchcommand  s   & 	*$$S)))	9M&-)=>>>$$S)) M&-8888 $ 	 	 	  	 	 	
 D	
 M&-8888FM&-8888 	Q())***rs#   8B B"C !B""C +C;c           
         ddl m} |                                 }| j                                        }|g}| j        r|| j        _        | j                            | j                  }|j        |_        |	                    |           |x| j        _        | j        j
        _        | j                                         |D ]H}|                                 t          j        | j        d          s|                    dddd           I|                    |dd         || j        | j        | j        | j        | j        | j        	          }	 |                     |          d
z  }| j                            t5          j        dt9          |                               d|v rt;          j        | j                   dS dS # d|v rt;          j        | j                   w w xY w)zireads a list of   terminated arguments, executes
        and writes the return code to the result channelr   r   s   filenor   s   nonttys   trues   commandserverNr      s   >is   --cwd) r   r   r   rr   r   r   r   r   	__class__appenddirstate_uiinvalidateall
resetstater   safehasattrr   	setconfigrequestr   r   r   r   r   r   r!   r"   r#   intoschdirr   )	r   r   argscopieduiuisr   rr   r   rets	            r   
runcommandzserver.runcommand6  s    	~~ 7<<>>j9 	&'DI[**4;77F"-FKJJv4::DIL49-1I##%%% 	J 	JBMMOOO #DHi88 JUIw8HIIIGIHIII-  	
 	
		#'',,s2C Lv{5#c((;;<<< 4"""""  x4""""  s   AG  G"c                 N    | j                             t          j                   dS )z1writes the current encoding to the result channelN)r   r!   r   r   s    r   getencodingzserver.getencodingh  s!    8,-----r   c                     | j                                         d d         }|rL| j                            |          }|r ||            n$t	          j        t          d          |z            |dk    S )NrI   s   unknown command %sr   )r   r\   capabilitiesrp   r   rq   r   )r   cmdhandlers      r   serveonezserver.serveonel  s    k""$$SbS) 	B'++C00G B k!$9":":S"@AAAczr   )s
   runcommands   getencodingc                    dd                     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          j        t          d          r|dz  }|dt          j
        d	          z  z  }| j                            |           	 |                                 r	 |                                 n# t          $ r Y d
S w xY wd	S )Ns   capabilities: rm   rZ   s
   encoding: s   message-encoding: %s
s   pid: %ds   getpgids   pgid: %dr   r   )rg   sortedr   r   r   r   getpidr   r   r   getpgidr   r!   r   r   )r   hellomsgs     r   servezserver.serve{  s"   $tyy8I1J1J'K'KKEMH$555E9 	G1DI4FFFHJ!2!222B
++ 	4Hbjmm33H 		!!!	--//  --//  	 	 	 11	
 qs   )C7 7
DDr   )r2   r3   r4   r5   r   r   rM   r   r   r   r   r   r   r   r   r7   r   r   rx   rx      s         
,P ,P ,P ,P\? ? ?

 
 
	" 	" 	"    40# 0# 0#d. . .   $.{KKL    r   rx   c                    |                      dd          }|sdS t          |                     dd                    }|dk    r|rt          j        ||          }n|dk    rt          j        | j        |          }nt          j        t          j        |                    }| 	                    dd          }| 
                    dd          }t          j        t          j                            |                    }t          j        |t          j                            |          |||          }| h}	|r4|	                    |j                   |	                    |j                   |	D ]}
|
                    d|           dS )	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     s{    iif--G "--l;;<<G$2-b'::	D-bgw??,tw7788<<.>??..??j1122'GW%%
 
 
 I dk"""dg * *	L&))))* *r   c                        e Zd Zd Zd Zd ZdS )pipeservicec                 "    || _         || _        d S r   )rr   r   )r   rr   r   rA   s       r   r   zpipeservice.__init__  s    			r   c                     d S r   r7   r   s    r   initzpipeservice.init  s    r   c                 $   | j         }|                                5 \  }}t          || j        ||          }	 |                                |                                 cd d d            S # |                                 w xY w# 1 swxY w Y   d S r   )rr   protectedfinoutrx   r   r   r   )r   rr   r   r   svs        r   runzpipeservice.run  s    W !! 	[c4DIsD11Bxxzz

	 	 	 	 	 	 	 	
 

	 	 	 	 	 	 	 	 	 	s(   BA,B,BBB	B	N)r2   r3   r4   r   r   r   r7   r   r   r   r     sA            	 	 	 	 	r   r   c                  V    t          j        dd           t          j                     d S rK   )r   setpgidrandomseedr7   r   r   _initworkerprocessr     s'     Jq! KMMMMMr   c                 b   |                     d          }|                     d          }d }	  ||||||          }	 |                                 n\# t          j        $ r4}|                     t	          d          |j        z             Y d }~nd }~wt          $ r Y nt          $ r Y nw xY w|                                 n# |                                 w xY wnX#  |r|j	        }	nt          |d          }	|	                    t          j        t          j                                          xY w	 |                                 	 |                                 d S # t          $ r Y d S w xY w# |                                 	 |                                 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    s   
--

C==D	B_T4dMBB	HHJJJJ { 	7 	7 	7HHQ~&&566666666 	 	 	D  	 	 	D	 JJLLLLBJJLLLLL  	/7DD"4..D

8&y';'='=>>???  				JJLLLLL 	 	 	DD	 				JJLLLL 	 	 	D	s   C A C B,"*BC B,C  	B,)C +B,,C /C CC E3 AD33E3 E" "
E0/E03F.	FF.
F+(F.*F++F.c                   :    e Zd ZdZdZd Zd Zd Zd Zd Z	d Z
dS )	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                     || _         d S r   )rr   )r   rr   s     r   r   zunixservicehandler.__init__  s    r   c                     t          j        ||           |                    t          j                   | j                            t          d          |z             | j                                         d S )Ns   listening at %s
)	r   bindunixsocketlistensocket	SOMAXCONNrr   statusr   r%   )r   sockaddresss      r   
bindsocketzunixservicehandler.bindsocket  s_    D'***F$%%%q-..8999r   c                 .    t          j        |           d S r   )r   unlink)r   r  s     r   unlinksocketzunixservicehandler.unlinksocket  s    
	'r   c                     dS )z9True if server should shut down; checked per pollintervalFr7   r   s    r   
shouldexitzunixservicehandler.shouldexit  s    ur   c                     dS )z/Called when main process notices new connectionNr7   r   s    r   newconnectionz unixservicehandler.newconnection   s      r   c                 2    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     dgtS$>>>r   )r2   r3   r4   r5   pollintervalr   r  r  r  r  r  r7   r   r   r  r    s          L        > > >? ? ? ? ?r   r  c                   \    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dS )unixforkingservicezG
    Listens on unix domain socket and forks server per connection
    Nc                    || _         || _        |d         | _        t          j        t
          d          s!t          j        t          d                    | j        s!t          j        t          d                    |pt          |          | _
        d | _        d | _        d | _        d | _        t                      | _        d | _        |                    dd          }|dk     r!t          j        t          d                    t'          j        ||          | _        t,          j        rt1          j                     d S d S )	Ns   addresss   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
  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'
33 	:+a 788999| 	M+a JKKLLL&@*<R*@*@
"&55#l,=>>A::+a KLLMMM$/F;;  	LNNNNN	 	r   c                    t          j         t           j                  | _        t          j        t           j        t           j                  }|\  | _        | _        | j                            | j        | j	                   t          j        t          d          rt          j        t          j                   t          j        t          j        | j                  }|| _        d| _        | j                                         d S )Ns   unblocksignalF)r
  AF_UNIXr  
socketpair
SOCK_DGRAMr  r  r  r  r  r   r   r   unblocksignalr   SIGCHLD_sigchldhandlerr   r"  r$  start)r   os     r   r   zunixforkingservice.initG  s    ]6>22
 fnf.?@@)*&t''
DLAAAH&677 	3"6>222M&.$*>??"#$     r   c                 d    | j         s(| j                            | j                   d| _         d S d S )NT)r"  r  r  r  r   s    r   _unlinksocketz unixforkingservice._unlinksocketV  s>    # 	( --dl;;;#'D   	( 	(r   c                 h   t          j         t           j        | j                   | j                                         | j                                         | j                                         |                                  | j        	                                 | 
                    d           d S rK   )r   r-  r   r  r   r  r  r2  r$  stop_reapworkersr   s    r   _cleanupzunixforkingservice._cleanup[  s    fnd&=>>>
!r   c                     	 |                                   |                                  d S # |                                  w xY wr   )	_mainloopr6  r   s    r   r   zunixforkingservice.rune  s:    	NNMMOOOOODMMOOOOs	   , Ac                    d}| j         }t          j                    }|                    | j        t          j        | j                   |                    | j        t          j        | j                   	 |s*|	                                r| 
                                 d}|                    |j                  }|s|rn%N|D ] \  }}|                    |j        |           !q|                                 d S )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._mainloopk  s    ,..J	,d.G	
 	
 	
 	M9/1D	
 	
 	
	0 q||~~  ""$$$__Q^_<<F  $ 0 0
Uh////!	0" 	r   c                 2   | j         }|                                \  }}t          j                    }|rz	 | j                            dd|           | j                            |           |                                 |	                                 d S # |	                                 w xY w	 |	                                 |	                                 | j
        	                                 |                     |           |	                                 | j        	                                 t          j        d           d S #  	 | j                            d           t          j        d           Y d S # 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  sg    kkmme gii 	" "Es    $$S)))!!!



"   

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

%%'''""G%%D%111HSMMMMMMBHSMMMMs1   A
B B+/BE FE=&F=FFc                 d    |                     d          }| j                            |           dS )z#Process messages sent from a workeri   N)recvr$  load)r   r  rE  r   s       r   r@  z!unixforkingservice._handlemainipc  s0    yyd#####r   c                 D    |                      t          j                   d S r   )r5  r   WNOHANG)r   r   frames      r   r.  z"unixforkingservice._sigchldhandler  s    "*%%%%%r   c                 *   | j         r	 t          j        d|          \  }}n*# t          $ r | j                                          Y d S w xY w|dk    rd S | j                            dd|           | j                             |           | j         d S d S )NrI   r   rl   s   worker process exited (pid=%d)
)r!  r   waitpidChildProcessErrorclearrr   rM  discard)r   optionsrQ  _statuss       r   r5  zunixforkingservice._reapworkers  s     	*!z"g66WW$    &&((( axxGKK&I3OOO$$S)))  	* 	* 	* 	* 	*s   " #A	A	c                 "   t          j         t           j        | j                   t                       | j        }	 t          | j        | j        ||j        | j	        g           t          j                     d S # 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  s    fnd&=>>> 			!#/    JLLLLLBJLLLLs   )A9 9Bc                 6   |                                 sd S  G fdd|j                  |_        | j        |_        | j                            |j                  }|d S |j                            dd|j                   t          j
        ||           d S )Nc                   "     e Zd Z fdZ xZS )8unixforkingservice._reposetup.<locals>.unixcmdserverrepoc                     t          |                                            	 | j                            | j                   d S # t
          j        $ r | j                            dd           Y d S 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  s    '..44666&++DI66666|   GKK$&M     s   A *A43A4)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|| 	F	 	 	 	 	 	 	 	 	 	 +!_%))$)44
FL":DIFF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  )  s            2! ! !( ( (
      :" " "B$ $ $
& & &* * *  . . . . .r   r  )NN)#ra  r   r   r;  r   r
  r"   r   i18nr   r	   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' T' T' T' T' T' T'p 99 
  N N N N N N N Nb&* &* &* &*R       (  $     F? ? ? ? ? ? ? ?Dz. z. z. z. z. z. z. z. z. z.r   