o ö]Lb\bã@slddlmZddlZddlZddlZddlZddlZddlZddlZddl Z z ddl Z e j Wne y>ddl mZ YnwddlmZddlmZddlmZmZmZmZmZmZmZddlmZmZGd d „d eƒZGd d „d eƒZ Gd d„deƒZ!ddd„iZ"dd„Z#Gdd„deƒZ$d"dd„Z%Gdd„deƒZ&dd„Z'dd„Z(Gdd„deƒZ)Gd d!„d!eƒZ*dS)#é)Úabsolute_importNé)Ú selectors2)Ú_)Úgetattr)ÚencodingÚerrorÚ loggingutilÚpycompatÚ repocacheÚutilÚvfs)ÚcborutilÚprocutilc@s4eZdZdZdd„Zedd„ƒZdd„Zdd „Zd S) Úchanneledoutputz^ Write data to out in the following format: data length (unsigned int), data cCó||_||_dS©N)ÚoutÚchannel)Úselfrr©rú9/usr/lib/python3/dist-packages/mercurial/commandserver.pyÚ__init__3ó zchanneledoutput.__init__cCó d|jS©Ns <%c-channel>©r©rrrrÚname7ó zchanneledoutput.namecCs6|sdS|j t d|jt|ƒ¡|¡|j ¡dS)Nó>cI)rÚwriteÚstructÚpackrÚlenÚflush)rÚdatarrrr!;s zchanneledoutput.writecCó|dvrt|ƒ‚t|j|ƒS©N)ÚisattyÚfilenoÚtellÚseek)ÚAttributeErrorrr©rÚattrrrrÚ __getattr__Bó zchanneledoutput.__getattr__N) Ú__name__Ú __module__Ú __qualname__Ú__doc__rÚpropertyrr!r0rrrrr+s  rc@s,eZdZdZdZdd„Zdd„Zdd„Zd 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. TcCst||ƒ|_||_||_dSr)rÚ_coutrÚ _encodefn)rrrÚ encodenameÚencodefnrrrrVs  zchanneledmessage.__init__cKs0t |¡}|dur ||d<|j | |¡¡dS)Nsdata)r Ú byteskwargsr8r!r9)rr&Úoptsrrrr![s zchanneledmessage.writecCs t|j|ƒSr)rr8r.rrrr0as zchanneledmessage.__getattr__N)r2r3r4r5Ú structuredrr!r0rrrrr7Hs   r7c@s`eZdZdZdZdd„Zedd„ƒZddd „Zd d „Z dd d „Z dd„Z dd„Z e Z dd„ZdS)Ú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 icCs||_||_||_dSr)Úin_rr)rr@rrrrrrts zchanneledinput.__init__cCrrrrrrrryrzchanneledinput.nameéÿÿÿÿcCsP|dkr!|j}| ||j¡}|}|r| ||j¡}||7}|s|S| ||j¡S©Nr)Ú maxchunksizeÚ_readr©rÚsizeÚsÚbufrrrÚread}sþzchanneledinput.readcCsd|sdS|dks J‚|j t d||¡¡|j ¡|j d¡}t d|¡d}|s,dS|j |¡S)Nórr éó>I)rr!r"r#r%r@rIÚunpack)rrFrÚlengthrrrrDŒs    zchanneledinput._readcCs^|dkr)|j}| |d¡}|}|r'| d¡s'| |d¡}||7}|r'| d¡r|S| |d¡S)NróLó )rCrDÚendswithrErrrÚreadlineœs  þ zchanneledinput.readlinecCs|SrrrrrrÚ__iter__«ózchanneledinput.__iter__cCs| ¡}|st‚|Sr)rRÚ StopIteration)rÚlrrrÚnext®szchanneledinput.nextcCr'r()r-rr@r.rrrr0¶r1zchanneledinput.__getattr__N)rA)r2r3r4r5rCrr6rrIrDrRrSrWÚ__next__r0rrrrr?es     r?scborcCsd t |¡¡S©NrJ)ÚjoinrÚ streamencode)ÚvrrrÚ½sr]cCsD| dd¡}|D]}t |¡}|r||fSqt dd |¡¡‚)Nó cmdserversmessage-encodingss"no supported message encodings: %só )Ú configlistÚ_messageencodersÚgetrÚAbortrZ)ÚuiÚencnamesÚnÚfrrrÚ_selectmessageencoderÁs   ÿ ÿrhc@sleZdZdZddd„Zdd„Zdd„Zd d „Zd d „Zd d„Z dd„Z dd„Z dd„Z e e dœZ dd„ZdS)Úserverzm Listens for commands on fin, runs them and writes the output on a channel based stream to fout. NcCst ¡|_|r|j|_||_|j|_n ||_d|_|_||_t|dƒ|_ t|dƒ|_ t|dƒ|_ t ||dƒ|_ t|dƒ|_|j dd¡dkrV|j ¡|_t|jd|j d d|_| d d ¡d krot|ƒ\}}t|d ||ƒ|_||_| dd¡|_d|_|jsŠt tjtj¡|_dSdS)NódóeóoóIórr^ólogó-)ÚrepoÚfpóuismessage-outputschannelómsshutdown-on-interrupt)rÚgetcwdÚcwdÚbaseuirdrqÚrepouiÚ_prereposetupsrÚcdebugÚcerrÚcoutr?ÚcinÚcresultÚconfigÚcopyÚ setuploggingÚcmsgrhr7ÚclientÚ configboolÚ_shutdown_on_interruptÚ_old_inthandlerÚsignalÚSIGINTÚSIG_IGN)rrdrqÚfinÚfoutÚ prereposetupsÚencnameÚencfnrrrrÒs8         ÿÿzserver.__init__cCs|js t tj|j¡dSdS)z9release and restore resources taken during server sessionN)r…r‡rˆr†rrrrÚcleanupsÿzserver.cleanupcCs |sdS|j |¡}|st‚|SrY)rƒrIÚEOFError)rrFr&rrrrDs  z server._readcCs(t d| d¡¡d}|sdS| |¡S)z[read a string from the channel format: data length (uint32), data rLrKrrJ)r"rMrD)rrNrrrÚ_readstrs zserver._readstrcCs| ¡}|r | d¡SgS)z6read a list of NULL separated strings from the channeló)r‘Úsplit)rrGrrrÚ _readlists zserver._readlistc Csªddlm}|jr| |¡Sz3zt tj|j¡| |¡WWt tjtj¡Stjy/‚t y7YnwWt tjtj¡n t tjtj¡w|j  t dƒ¡dS)Nr©Údispatchs interrupted! rA) Úr–r…r‡rˆr†r‰rÚSignalInterruptÚKeyboardInterruptrdr)rÚreqr–rrrÚ_dispatchcommand$s    ö û$zserver._dispatchcommandc Cs*ddlm}| ¡}|j ¡}|g}|jr7||j_|j |j¡}|j|_|  |¡||j_|jj _ |j  ¡|D]}|  ¡t |jd¡sN| dddd¡q9|j|dd…||j|j|j|j|j|jd }z"| |¡d @}|j t d t|ƒ¡¡Wd |vr‡t |j¡dSdSd |vr”t |j¡ww) zireads a list of terminated arguments, executes and writes the return code to the result channelrr•sfilenorssnonttystrues commandserverN©rŒéÿs>is--cwd) r—r–r”rdr€rqrwrxÚ __class__ÚappendÚdirstateÚ_uiÚ invalidateallÚ resetstater Ú safehasattrr}Ú setconfigÚrequestr|r{r‚ryr›r~r!r"r#ÚintÚosÚchdirrv) rr–ÚargsÚcopieduiÚuisrxrdršÚretrrrÚ runcommand>sD    € ø  ÿÿzserver.runcommandcCs|j tj¡dS)z1writes the current encoding to the result channelN)r~r!rrrrrÚ getencodingpszserver.getencodingcCsP|j ¡dd…}|r$|j |¡}|r||ƒ|dkSt tdƒ|¡‚|dkS)NrAsunknown command %srJ)rƒrRÚ capabilitiesrbrrcr)rÚcmdÚhandlerrrrÚserveonets þzserver.serveone)s runcommands getencodingcCs¾dd t|jƒ¡}|d7}|dtj7}|d7}|jr$|d|jj7}|dt ¡7}t t d¡r?|d7}|dt   d ¡7}|j   |¡z|  ¡rR |  ¡sJWd SWd Sty^Yd Sw) Nscapabilities: r_rPs encoding: smessage-encoding: %s spid: %dsgetpgidspgid: %drr)rZÚsortedr°rr‚rÚgetpidr r¤r¨Úgetpgidr|r!r³r)rÚhellomsgrrrÚserveƒs*   ÿù ûýz server.server)r2r3r4r5rrrDr‘r”r›r®r¯r³r°r¸rrrrriÌs .  2 ric Csè| dd¡}|s dSt| dd¡ƒ}|dkr|rt ||¡}n7|dkr+t |j|¡}n+t t |¡¡}|  dd¡}|  dd¡}t   t j |¡¡}tj|t j |¡|||d}|h} |rg|  |j¡|  |j¡| D]} |  d|¡qidS) záSet 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^roNs track-logrps max-log-filess max-log-size)ÚmaxfilesÚmaxsize)rÚsetr`r ÚfileobjectloggerÚferrr ÚabspathÚ expandpathÚ configintÚ configbytesÚvfsmodr r¨ÚpathÚdirnameÚ fileloggerÚbasenameÚaddrwrdÚ setlogger) rdrqrrÚlogpathÚtrackedÚloggerr¹rºr Ú targetuisÚurrrrs4     û  ÿrc@s$eZdZdd„Zdd„Zdd„ZdS)Ú pipeservicecCrr)rdrq)rrdrqr=rrrrÇrzpipeservice.__init__cCsdSrrrrrrÚinitËrTzpipeservice.initc Csd|j}| ¡!\}}t||j||ƒ}z| ¡W| ¡WdƒS| ¡w1s+wYdSr)rdÚprotectedfinoutrirqr¸r)rrdrŠr‹ÚsvrrrÚrunÎsû ûzpipeservice.runN)r2r3r4rrÏrÒrrrrrÎÆs rÎcCst dd¡t ¡dSrB)r¨ÚsetpgidÚrandomÚseedrrrrÚ_initworkerprocessÚs rÖc Cs˜| d¡}| d¡}d}z›zZ||||||ƒ}zJz| ¡Wn=tjy:}z| tdƒ|j¡WYd}~n%d}~wtyR}z |jtjkrH‚WYd}~n d}~wt yZYnwW|  ¡n|  ¡wWn|rq|j } nt |dƒ} |   t t ¡¡¡‚W| ¡z| ¡WdSty§}z|jtjkrœ‚WYd}~dSd}~ww| ¡z| ¡WwtyË}z |jtjkrÁ‚WYd}~wd}~ww)NÚrbÚwbs abort: %s rk)Úmakefiler¸rrcrÚmessageÚIOErrorÚerrnoÚEPIPEr™rr{rr!rÚ strtolocalÚ tracebackÚ format_excÚclose) rdrqÚconnÚcreatecmdserverrŒrŠr‹rÑÚinstr{rrrÚ _serverequestìsZ    €  ÿ€ ÿ€ ÷  ÿ€ÿý   ÿ€ÿråc@sDeZdZdZdZdd„Zdd„Zdd„Zd d „Zd d „Z d d„Z dS)ÚunixservicehandlerzÍSet 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(). NcCs ||_dSr)rd)rrdrrrrs zunixservicehandler.__init__cCs:t ||¡| tj¡|j tdƒ|¡|j ¡dS)Nslistening at %s ) r ÚbindunixsocketÚlistenÚsocketÚ SOMAXCONNrdÚstatusrr%)rÚsockÚaddressrrrÚ bindsockets  zunixservicehandler.bindsocketcCst |¡dSr)r¨Úunlink)rrírrrÚ unlinksocket#szunixservicehandler.unlinksocketcCódS)z9True if server should shut down; checked per pollintervalFrrrrrÚ shouldexit&szunixservicehandler.shouldexitcCrñ)z/Called when main process notices new connectionNrrrrrÚ newconnection*sz unixservicehandler.newconnectioncCst|j||||ƒS)zhCreate new command server instance; called in the process that serves for the current connection)rird)rrqrârŠr‹rŒrrrrã-sz"unixservicehandler.createcmdserver) r2r3r4r5Ú pollintervalrrîrðròrórãrrrrræs ræc@sreZdZdZddd„Zdd„Zdd„Zd d „Zd d „Zd d„Z dd„Z dd„Z dd„Z dd„Z dd„Zdd„ZdS)ÚunixforkingservicezG Listens on unix domain socket and forks server per connection NcCs¾||_||_|d|_t td¡st tdƒ¡‚|js"t tdƒ¡‚|p't |ƒ|_ d|_ d|_ d|_ d|_tƒ|_d|_| dd¡}|dkrMt tdƒ¡‚t ||¡|_tjr]t ¡dSdS) NsaddresssAF_UNIXsunsupported platforms'no socket path specified with --addressr^smax-repo-cachers(negative max-repo-cache size not allowed)rdrqrír r¤rérrcrræÚ_servicehandlerÚ_sockÚ_mainipcÚ _workeripcÚ_oldsigchldhandlerr»Ú _workerpidsÚ_socketunlinkedrÀr Ú repoloaderÚ _repoloaderr ÚisdarwinrÚgui)rrdrqr=r²Úmaxlenrrrr8s*    ÿzunixforkingservice.__init__cCs~t tj¡|_t tjtj¡}|\|_|_|j |j|j ¡t   t d¡r*t   tj¡t tj|j¡}||_d|_|j ¡dS)Ns unblocksignalF)réÚAF_UNIXr÷Ú socketpairÚ SOCK_DGRAMrørùrörîrír r¤rÚ unblocksignalr‡ÚSIGCHLDÚ_sigchldhandlerrúrürþÚstart)rÚorrrrÏQs   zunixforkingservice.initcCs"|js|j |j¡d|_dSdS)NT)rürörðrírrrrÚ _unlinksocket`s þz unixforkingservice._unlinksocketcCsNt tj|j¡|j ¡|j ¡|j ¡| ¡|j  ¡|  d¡dSrB) r‡rrúr÷rárørùr rþÚstopÚ _reapworkersrrrrÚ_cleanupes    zunixforkingservice._cleanupcCs"z | ¡W| ¡dS| ¡wr)Ú _mainloopr rrrrrÒos zunixforkingservice.runc CsÔd}|j}t ¡}| |jtj|j¡| |jtj|j¡ |s*|  ¡r*|  ¡d}z |j |j d}Wnt yN}z|jtjkrB‚g}WYd}~nd}~ww|sU|rTnq|D] \}}| |j|¡qWq| ¡dS)NFT)Útimeout)röÚ selectorsÚDefaultSelectorÚregisterr÷Ú EVENT_READÚ_acceptnewconnectionrøÚ_handlemainipcròr ÚselectrôÚOSErrorrÜÚ ETIMEDOUTr&Úfileobjrá)rÚexitingÚhÚselectorÚeventsräÚkeyÚ_maskrrrrus: ÿ ÿ  €ú è zunixforkingservice._mainloopc Cs|j}z| ¡\}}Wntjy(}z|jdtjkr#WYd}~dS‚d}~wwt ¡}|rNz|j   dd|¡|j   |¡|  ¡W| ¡dS| ¡wz#| ¡| ¡|j ¡| |¡| ¡|j ¡t d¡WdSz|j jddWt d¡YdSt d¡w)Nrr^sforked worker process (pid=%d) T)Úforcer)röÚacceptrérrªrÜÚEINTRr¨ÚforkrdÚlogrûrÇrórárøÚ _runworkerrùÚ_exitrß)rrìrrrâÚ_addrräÚpidrrrršs<€ý ÿ     z'unixforkingservice._acceptnewconnectionc CsZz| d¡}Wntjy$}z|jdtjkrWYd}~dS‚d}~ww|j |¡dS)z#Process messages sent from a workeri€rN)ÚrecvrérrªrÜr"rþÚload)rrìrrÃrärrrrÀs€ýz!unixforkingservice._handlemainipccCs| tj¡dSr)r r¨ÚWNOHANG)rr‡ÚframerrrrÊsz"unixforkingservice._sigchldhandlerc Cs¨|jrRz t d|¡\}}Wn+ty8}z|jtjkr!WYd}~q|jtjkr(‚|j ¡WYd}~dSd}~ww|dkr?dS|j  dd|¡|j  |¡|jsdSdS)NrArr^sworker process exited (pid=%d) ) rûr¨ÚwaitpidrrÜr"ÚECHILDÚclearrdr$Údiscard)rÚoptionsr(Ú_statusrärrrr Ís"    €ù ñzunixforkingservice._reapworkerscCsRt tj|j¡tƒ|j}zt|j|j||j|j gdWt   ¡dSt   ¡w)Nrœ) r‡rrúrÖrörårdrqrãÚ _reposetupÚgcÚcollect)rrârrrrr%ßsûzunixforkingservice._runworkercsl| ¡sdSG‡fdd„d|jƒ‰ˆ|_|j|_|j |j¡}|dur%dS|j dd|j¡t   ||¡dS)NcseZdZ‡‡fdd„Z‡ZS)z8unixforkingservice._reposetup..unixcmdserverrepocsHtˆ|ƒ ¡z |j |j¡WdStjy#|j dd¡YdSw)Nr^s#failed to send repo root to master ) ÚsuperráÚ _cmdserveripcÚsendÚrootrérrdr$r)ržÚunixcmdserverreporrráós ÿÿz>unixforkingservice._reposetup..unixcmdserverrepo.close)r2r3r4ráÚ __classcell__r©r:)ržrr:òsr:s repocachesrepo from cache: %s ) Úlocalržrùr7rþrbr9rdr$r Ú copycache)rrdrqÚ cachedreporr<rr3îs zunixforkingservice._reposetupr)r2r3r4r5rrÏr r rÒrrrrr r%r3rrrrrõ3s  %&  rõ)NN)+Ú __future__rrÜr4r¨rÔr‡rér"rßrÚ BaseSelectorÚ ImportErrorÚ thirdpartyrÚi18nrr rr—rrr r r r rÂÚutilsrrÚobjectrr7r?rarhrirrÎrÖrårærõrrrrÚsB   ÿ  $ Xÿ  R)%"