# HG changeset patch # User Gregory Szorc # Date 1549138051 28800 # Node ID fa2071753dc22c4afbd07e8231e31215a577ac00 # Parent 4ebbd7c4a3c5336b8ea547b0da9404e6265174f7 zeroconf: port to Python 3 Since we're using the source transformer on Python 3, calls into Zeroconf and return values from it are generally bytes. But various socket functions require str on Python 3. This commit contains enough changes to coerce test-paths.t into passing on Python 3. I suspect there are still a handful of bugs on Python 3. But the tests do pass. Differential Revision: https://phab.mercurial-scm.org/D5805 diff -r 4ebbd7c4a3c5 -r fa2071753dc2 hgext/zeroconf/__init__.py --- a/hgext/zeroconf/__init__.py Fri Jun 28 16:40:36 2019 -0700 +++ b/hgext/zeroconf/__init__.py Sat Feb 02 12:07:31 2019 -0800 @@ -34,6 +34,7 @@ encoding, extensions, hg, + pycompat, ui as uimod, ) from mercurial.hgweb import ( @@ -55,7 +56,7 @@ # finds external-facing interface without sending any packets (Linux) try: s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) - s.connect(('1.0.0.1', 0)) + s.connect((r'1.0.0.1', 0)) ip = s.getsockname()[0] return ip except socket.error: @@ -64,17 +65,17 @@ # Generic method, sometimes gives useless results try: dumbip = socket.gethostbyaddr(socket.gethostname())[2][0] - if ':' in dumbip: - dumbip = '127.0.0.1' - if not dumbip.startswith('127.'): + if r':' in dumbip: + dumbip = r'127.0.0.1' + if not dumbip.startswith(r'127.'): return dumbip except (socket.gaierror, socket.herror): - dumbip = '127.0.0.1' + dumbip = r'127.0.0.1' # works elsewhere, but actually sends a packet try: s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) - s.connect(('1.0.0.1', 1)) + s.connect((r'1.0.0.1', 1)) ip = s.getsockname()[0] return ip except socket.error: @@ -86,19 +87,19 @@ global server, localip if not server: ip = getip() - if ip.startswith('127.'): + if ip.startswith(r'127.'): # if we have no internet connection, this can happen. return localip = socket.inet_aton(ip) server = Zeroconf.Zeroconf(ip) - hostname = socket.gethostname().split('.')[0] - host = hostname + ".local" - name = "%s-%s" % (hostname, name) + hostname = socket.gethostname().split(r'.')[0] + host = hostname + r".local" + name = r"%s-%s" % (hostname, name) # advertise to browsers svc = Zeroconf.ServiceInfo('_http._tcp.local.', - name + '._http._tcp.local.', + pycompat.bytestr(name + r'._http._tcp.local.'), server = host, port = port, properties = {'description': desc, @@ -108,7 +109,7 @@ # advertise to Mercurial clients svc = Zeroconf.ServiceInfo('_hg._tcp.local.', - name + '._hg._tcp.local.', + pycompat.bytestr(name + r'._hg._tcp.local.'), server = host, port = port, properties = {'description': desc, @@ -158,7 +159,7 @@ def getzcpaths(): ip = getip() - if ip.startswith('127.'): + if ip.startswith(r'127.'): return server = Zeroconf.Zeroconf(ip) l = listener() @@ -166,10 +167,10 @@ time.sleep(1) server.close() for value in l.found.values(): - name = value.name[:value.name.index('.')] - url = "http://%s:%s%s" % (socket.inet_ntoa(value.address), value.port, - value.properties.get("path", "/")) - yield "zc-" + name, url + name = value.name[:value.name.index(b'.')] + url = r"http://%s:%s%s" % (socket.inet_ntoa(value.address), value.port, + value.properties.get(r"path", r"/")) + yield b"zc-" + name, pycompat.bytestr(url) def config(orig, self, section, key, *args, **kwargs): if section == "paths" and key.startswith("zc-"):