D5805: zeroconf: port to Python 3

indygreg (Gregory Szorc) phabricator at mercurial-scm.org
Sat Feb 2 20:08:59 UTC 2019


indygreg created this revision.
Herald added a subscriber: mercurial-devel.
Herald added a reviewer: hg-reviewers.

REVISION SUMMARY
  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.

REPOSITORY
  rHG Mercurial

REVISION DETAIL
  https://phab.mercurial-scm.org/D5805

AFFECTED FILES
  hgext/zeroconf/__init__.py

CHANGE DETAILS

diff --git a/hgext/zeroconf/__init__.py b/hgext/zeroconf/__init__.py
--- a/hgext/zeroconf/__init__.py
+++ b/hgext/zeroconf/__init__.py
@@ -34,6 +34,7 @@
     encoding,
     extensions,
     hg,
+    pycompat,
     ui as uimod,
 )
 from mercurial.hgweb import (
@@ -55,26 +56,26 @@
     # 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:
         pass
 
     # 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,33 +87,35 @@
     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,
-                                             'path': "/" + path},
+                               properties = {
+                                   'description': pycompat.bytestr(desc),
+                                   'path': pycompat.bytestr(r"/" + path)},
                                address = localip, weight = 0, priority = 0)
     server.registerService(svc)
 
     # 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,
-                                             'path': "/" + path},
+                               properties = {
+                                   'description': pycompat.bytestr(desc),
+                                   'path': pycompat.bytestr(r"/" + path)},
                                address = localip, weight = 0, priority = 0)
     server.registerService(svc)
 
@@ -158,18 +161,18 @@
 
 def getzcpaths():
     ip = getip()
-    if ip.startswith('127.'):
+    if ip.startswith(r'127.'):
         return
     server = Zeroconf.Zeroconf(ip)
     l = listener()
     Zeroconf.ServiceBrowser(server, "_hg._tcp.local.", l)
     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-"):



To: indygreg, #hg-reviewers
Cc: mercurial-devel


More information about the Mercurial-devel mailing list