o ]Lb@s&dZddlmZddlZddlZddlZddlmZddlm Z m Z m Z m Z m Z mZmZddlmZdZdadad d Zd d Zd dZGdddeZddZddZddZddZddZddZ e !e de e !ejdee !ejdee !ejd ee !e d!ee !ed"edS)#adiscover and advertise repositories on the local network The zeroconf extension will advertise :hg:`serve` instances over DNS-SD so that they can be discovered using the :hg:`paths` command without knowing the server's IP address. To allow other people to discover your repository using run :hg:`serve` in your repository:: $ cd test $ hg serve You can discover Zeroconf-enabled repositories by running :hg:`paths`:: $ hg paths zc-test = http://example.com:8000/test )absolute_importN)Zeroconf)dispatchencoding extensionshgpycompatrcutilui)serversships-with-hg-corec Cszttjtj}|d|d}|WStjy Ynwzttdd}d|vr3d}|ds;|WSWntj tj fyKd}Ynwzttjtj}|d|d}|WStjymY|Sw)N)1.0.0.1rr:z 127.0.0.1127.)r r) socketAF_INET SOCK_DGRAMconnect getsocknameerror gethostbyaddr gethostname startswithgaierrorherror)sipdumbipr9/usr/lib/python3/dist-packages/hgext/zeroconf/__init__.pygetip7s6     r!c Cstst}|dr dSt|at|atdd}|d}d||f}tj dt |d|||d|d tddd }t |tj d t |d |||d|d tddd }t |dS) Nr.rz.localz%s-%ss_http._tcp.local.z._http._tcp.local./) descriptionspath)r port propertiesaddressweightpriority_hg._tcp.local.z._hg._tcp.local.) r r!rr inet_atonlocaliprrsplit ServiceInfor bytestrregisterService)namedescpathr%rhostnamehostsvcrrr publishWs>          r7c Cs6|||}|j}z|j}WnEtyR|(}|jp"tj|j}|j ddd d}|j dd} | s9|} Wdn1sCwYt || ||Y|Sw|j ddd dd} |D]6\}}|j } trz| tj|ddtj|}| | d}| dd} | s|} t || ||qb|S)Nswebsprefixr#r$s.hgshgrc)r%reposAttributeError _obtainreporeponameosr3basenamerootr configstripr7copyr use_repo_hgrc readconfigjoin) create_serverr apphttpdr%r9repor1r3r2prefixurrr zc_create_servers8        rLc@s$eZdZddZddZddZdS)listenercCs i|_dSN)found)selfrrr __init__s zlistener.__init__cCs"t||jvr|jt|=dSdSrN)reprrOrPr typer1rrr removeServiceszlistener.removeServicecCs||||jt|<dSrN)getServiceInforOrRrSrrr addServiceszlistener.addServiceN)__name__ __module__ __qualname__rQrUrWrrrr rMs rMccst}|dr dSt|}t}t|d|td||j D](}|j d|j d}dt |j|j|jddf}d|t|fVq(dS) Nrr*r.zhttp://%s:%s%sr3/zc-)r!rrrMServiceBrowsertimesleepcloserOvaluesr1indexr inet_ntoar'r%r&getr r/)rr lvaluer1urlrrr getzcpathss$     ricOsL|dkr|drtD] \}}||kr|Sq ||||g|Ri|SNpathsr]rri)origrPsectionkeyargskwargsr1r3rrr r@s r@cOs.|||g|Ri|}|dkr|t7}|S)Nrk)ri)rmrPrnrprqr9rrr configitemss rrc Os\||||g|Ri|\}}|dkr*|dr*tD]\}} ||kr)| |fSq||fSrjrl) rmrPrnr1rprqoptsubzcnamezcurlrrr configsuboptionss rwcCs0tD]\}}||kr|tjSq||SrN)riencoder)rmsourcer1r3rrr defaultdests rzcCs0z|||||WtrtSStrtwwrN)r ra)rmr optionscmdcmdfuncrrr cleanupafterdispatchs  r~s _runcommandsconfigs configitemssconfigsuboptionss defaultdests create_server)"__doc__ __future__rr=rr_r mercurialrrrrr r r uimodmercurial.hgwebr servermod testedwithr,r!r7rLobjectrMrir@rrrwrzr~ wrapfunctionrrrr s6  $  )"