
    q&fN                        d 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 dZdadad Zd	 Zd
 Z G d d      Zd Zd Zd Zd Zd Zd Z e	j<                  ede        e	j<                  ej                  de        e	j<                  ej                  de        e	j<                  ej                  de        e	j<                  e
de        e	j<                  ede       y)a  discover 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
    N   )Zeroconf)dispatchencoding
extensionshgpycompatrcutilui)servers   ships-with-hg-corec                     	 t        j                   t         j                  t         j                        } | j                  d       | j	                         d   }|S # t         j
                  $ r Y nw xY w	 t        j                  t        j                               d   d   }d|v rd}|j                  d      s|S n+# t         j                  t         j                  f$ r d}Y nw xY w	 t        j                   t         j                  t         j                        } | j                  d       | j	                         d   }|S # t         j
                  $ r Y |S w xY w)N)1.0.0.1r   r      :z	127.0.0.1127.)r   r   )socketAF_INET
SOCK_DGRAMconnectgetsocknameerrorgethostbyaddrgethostname
startswithgaierrorherror)sipdumbips      9/usr/lib/python3/dist-packages/hgext/zeroconf/__init__.pygetipr!   6   s    MM&..&*;*;<			.!]]_Q	<< %%f&8&8&:;A>qA&= F  (M )OOV]]+ MM&..&*;*;<			.!]]_Q	<< Ms8   AA A0/A04AB; ;%C#"C#'AD? ?EEc           
      H   t         sFt               }|j                  d      ry t        j                  |      at        j                  |      a t        j                         j                  d      d   }|dz   }|d| } t        j                  dt        j                  | dz         |||d|z   d	t
        dd
      }t         j                  |       t        j                  dt        j                  | dz         |||d|z   d	t
        dd
      }t         j                  |       y )Nr   .r   z.local-s   _http._tcp.local.z._http._tcp.local.   /)   descriptions   path)r   port
propertiesaddressweightpriority   _hg._tcp.local.z._hg._tcp.local.)r   r!   r   r   	inet_atonlocalipr   r   splitServiceInfor	   bytestrregisterService)namedescpathr'   r   hostnamehostsvcs           r    publishr9   V   s   W== ""2&""2&!!#))#.q1HhD%D 

 445$(4$;?	C 3 

 223$(4$;?	C 3    c                     | ||      }|j                   }	 |j                  }|j                  j                  ddd      j	                  d      dz   }|D ]  \  }}|j                  j                         }	t        j                         r0|	j                  t        j                  j                  |dd             t        j                  j                  |      }
||z   j	                  d      }|	j                  dd      }|s|
}t        |
|||        |S # t        $ r |j                         5 }|j                   xs) t        j                  j                  |j"                        }
|j                  j                  ddd      j	                  d      }|j                  j                  dd      }|s|
}d d d        n# 1 sw Y   nxY wt        
|       Y |S w xY w)Ns   webs   prefixr:   r%   s   .hgs   hgrcr&   )r'   reposr   configstripcopyr
   use_repo_hgrc
readconfigosr5   joinbasenamer9   AttributeError_obtainreporeponameroot)create_serverr   apphttpdr'   r<   prefixrepor5   ur3   r4   s               r    zc_create_serverrO      s   "c"E::D,		 vy#6<<TBTI 		,JD$A##%RWW\\$@A77##D)DTM((.D88FN3DD$d+		, L-  (__ 	$<<>277#3#3DII#>D77>>&)S9??ED77>>&.9D	 	 	 	dD$' L-(s*   D G,BF90	G9G	>GGc                       e Zd Zd Zd Zd Zy)listenerc                     i | _         y N)found)selfs    r    __init__zlistener.__init__   s	    
r:   c                 `    t        |      | j                  v r| j                  t        |      = y y rS   )reprrT   rU   r   typer3   s       r    removeServicezlistener.removeService   s'    :#

4:& $r:   c                 T    |j                  ||      | j                  t        |      <   y rS   )getServiceInforT   rX   rY   s       r    
addServicezlistener.addService   s!    !'!6!6tT!B

4:r:   N)__name__
__module____qualname__rV   r[   r^    r:   r    rQ   rQ      s    'Cr:   rQ   c            	   #   V  K   t               } | j                  d      ry t        j                  |       }t               }t        j                  |d|       t        j                  d       |j                          |j                  j                         D ]  }|j                  d |j                  j                  d       }dt        j                  |j                        d|j                  |j                   j#                  dd      }d	|z   t%        j&                  |      f  y w)
Nr   r,   r      .zhttp://r   r5   /   zc-)r!   r   r   rQ   ServiceBrowsertimesleepcloserT   valuesr3   indexr   	inet_ntoar)   r'   r(   getr	   r1   )r   r   lvaluer3   urls         r    
getzcpathsrr      s     	B	}}Vr"F
AF$6:JJqM
LLN! 3zz2EJJ,,T23U]]+JJ  -

 tmX--c2223s   D'D)c                     |dk(  r,|j                  d      rt               D ]  \  }}||k(  s|c S   | |||g|i |S N   pathsrf   r   rr   )origrU   sectionkeyargskwargsr3   r5   s           r    r=   r=      sQ    (s~~f5$, 	JD$s{	 gs4T4V44r:   c                 D     | ||g|i |}|dk(  r|t               z  }|S )Nru   )rr   )rw   rU   rx   rz   r{   r<   s         r    configitemsr}      s1    w000E(Lr:   c                      | |||g|i |\  }}|dk(  r.|j                  d      rt               D ]  \  }}	||k(  s|	|fc S  ||fS rt   rv   )
rw   rU   rx   r3   rz   r{   optsubzcnamezcurls
             r    configsuboptionsr      sd    D'49$9&9HC(tv6 (\ 	"MFE~cz!	" 8Or:   c                     t               D ]+  \  }}||k(  s|j                  t        j                        c S   | |      S rS   )rr   encoder   )rw   sourcer3   r5   s       r    defaultdestr      s?     l 2
d6>;;x00112 <r:   c                     	  | ||||      t         rt         j                          S S # t         rt         j                          w w xY wrS   )r   rj   )rw   r   optionscmdcmdfuncs        r    cleanupafterdispatchr      s:    Bg.
 LLN 6LLN s	   
( A_runcommandr=   r}   r   r   rI   )__doc__rB   r   rh    r   	mercurialr   r   r   r   r	   r
   r   uimodmercurial.hgwebr   	servermod
testedwithr.   r!   r9   rO   rQ   rr   r=   r}   r   r   r   wrapfunctionrb   r:   r    <module>r      s  & 
      0 #
 

@& RD	C 	C3&5 
  -1E F 
  (F 3 
  - = 
  "46F G 
  M; 7 
  	?4D Er:   