
    	^cT                        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           dS )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                  } |                     d           |                                 d         }|S # t           j        $ r Y nw xY w	 t          j        t          j                              d         d         }d|v rd}|                    d          s|S n## t           j	        t           j
        f$ r d}Y nw xY w	 t          j         t           j        t           j                  } |                     d           |                                 d         }|S # t           j        $ r Y nw xY w|S )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   sX   M&.&*;<<			.!!!]]__Q	<   %f&8&:&:;;A>qA&== F  (( 	M	OV]+   M&.&*;<<			.!!!]]__Q	<    Ms8   AA A.-A.2AC C! C!%AD? ?EEc           
      v   t           sMt                      }|                    d          rd S t          j        |          at          j        |          a t          j                                        d          d         }|dz   }|d| } t          j	        dt          j        | dz             |||d|z   d	t
          dd
          }t                               |           t          j	        dt          j        | dz             |||d|z   d	t
          dd
          }t                               |           d S )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   sU    'WW==   	F"2&&"2&&!##))#..q1HhDhh%D 
 4455$(4$;??	 	 	C 3 
 2233$(4$;??	 	 	C 3    c                     | ||          }|j         }	 |j        }|j                            ddd                              d          dz   }|D ]\  }}|j                                        }	t          j                    r4|	                    t          j
                            |dd                     t          j
                            |          }
||z                       d          }|	                    dd          }|s|
}t          |
|||           n# t          $ r |                                5 }|j        p#t          j
                            |j                  }
|j                            ddd                              d          }|j                            dd          }|s|
}d d d            n# 1 swxY w Y   t          |
|||           Y nw xY w|S )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   M"c""E:D,	 vy#66<<TBBTI 		, 		,JD$A#%% BRW\\$@@AAA7##D))DTM((..D88FN33D D$d++++		,  ( ( (__ 	$<>27#3#3DI#>#>D7>>&)S99??EED7>>&.99D 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	dD$'''''(, Ls6   D G8A:F>2G>G	GG	GGc                        e Zd Zd Zd Zd ZdS )listenerc                     i | _         d S N)found)selfs    r    __init__zlistener.__init__   s    


r:   c                 `    t          |          | j        v r| j        t          |          = d S d S rS   )reprrT   rU   r   typer3   s       r    removeServicezlistener.removeService   s3    ::##
4::&&& $#r:   c                 \    |                     ||          | j        t          |          <   d S rS   )getServiceInforT   rX   rY   s       r    
addServicezlistener.addService   s*    !'!6!6tT!B!B
4::r:   N)__name__
__module____qualname__rV   r[   r^    r:   r    rQ   rQ      sF          ' ' 'C C C C Cr:   rQ   c            	   #   N  K   t                      } |                     d          rd S t          j        |           }t                      }t          j        |d|           t          j        d           |                                 |j        	                                D ]}|j
        d |j
                            d                   }dt          j        |j                  d|j        |j                            dd          }d	|z   t%          j        |          fV  d S )
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:::JqMMM
LLNNN!! 3 3z2EJ,,T2223U]++++JJ  ---

 tmX-c22222223 3r:   c                     |dk    r3|                     d          rt                      D ]\  }}||k    r|c S  | |||g|R i |S N   pathsrf   r   rr   )origrU   sectionkeyargskwargsr3   r5   s           r    r=   r=      sp    (s~~f55$,, 	 	JD$s{{ 4gs4T444V444r:   c                 N     | ||g|R i |}|dk    r|t                      z  }|S )Nru   )rr   )rw   rU   rx   rz   r{   r<   s         r    configitemsr}      sA    Dw000000E(Lr:   c                      | |||g|R i |\  }}|dk    r5|                     d          r t                      D ]\  }}	||k    r|	|fc S ||fS rt   rv   )
rw   rU   rx   r3   rz   r{   optsubzcnamezcurls
             r    configsuboptionsr      s    tD'49$999&99HC(tv66 (\\ 	" 	"MFE~~cz!!! 8Or:   c                     t                      D ],\  }}||k    r!|                    t          j                  c S - | |          S rS   )rr   encoder   )rw   sourcer3   r5   s       r    defaultdestr      sP     ll 2 2
d6>>;;x011111 4<<r:   c                     	  | ||||          t           rt                                            S S # t           rt                                            w w xY wrS   )r   rj   )rw   r   optionscmdcmdfuncs        r    cleanupafterdispatchr      sW    tBg..
  	LLNNNN	6 	LLNNNN	s	   1 #As   _runcommands   configs   configitemss   configsuboptionss   defaultdests   create_server)__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 	C 	C 	C 	C 	C 	C3 3 3&5 5 5         
 .2F G G G 
 )V 4 4 4 
 .+ > > > 
 "57G H H H 
 NK 8 8 8 
 	#35E F F F F Fr:   