zeroconf: fix an invalid argument error on Windows
authorMatt Harbison <matt_harbison@yahoo.com>
Mon, 07 Oct 2024 23:20:09 -0400
changeset 51999 997c9b2069d1
parent 51998 629ecced55a6
child 52000 c76c1c948804
zeroconf: fix an invalid argument error on Windows The idea that pyoxidizer was triggering the problem when standing up the previous incarnation of CI for Windows was misleading- it was a Windows problem in general. See the inline bug link. Unfortunately, there's no commit referenced there, and it looks like OP closed the report himself with the suggested workaround. IOW, very modern python may not work, but it's extremely unlikely that there are any users of this extension, especially on Windows.
hgext/zeroconf/Zeroconf.py
tests/test-hgrc.t
tests/test-paths.t
--- a/hgext/zeroconf/Zeroconf.py	Sat Oct 12 16:55:30 2024 -0400
+++ b/hgext/zeroconf/Zeroconf.py	Mon Oct 07 23:20:09 2024 -0400
@@ -232,6 +232,16 @@
 
 # implementation classes
 
+_SOL_IP = socket.SOL_IP
+
+if pycompat.iswindows:
+    # XXX: Not sure if there are newer versions of python where this would fail,
+    # but apparently socket.SOL_IP used to be 0, and socket.IPPROTO_IP is 0, so
+    # this would work with older versions of python.
+    #
+    # https://github.com/python/cpython/issues/101960
+    _SOL_IP = socket.IPPROTO_IP
+
 
 class DNSEntry:
     """A DNS entry"""
@@ -1419,8 +1429,8 @@
             # work as expected.
             #
             pass
-        self.socket.setsockopt(socket.SOL_IP, socket.IP_MULTICAST_TTL, b"\xff")
-        self.socket.setsockopt(socket.SOL_IP, socket.IP_MULTICAST_LOOP, b"\x01")
+        self.socket.setsockopt(_SOL_IP, socket.IP_MULTICAST_TTL, b"\xff")
+        self.socket.setsockopt(_SOL_IP, socket.IP_MULTICAST_LOOP, b"\x01")
         try:
             self.socket.bind(self.group)
         except Exception:
@@ -1428,7 +1438,7 @@
             # SO_REUSEADDR and SO_REUSEPORT have been set, so ignore it
             pass
         self.socket.setsockopt(
-            socket.SOL_IP,
+            _SOL_IP,
             socket.IP_ADD_MEMBERSHIP,
             socket.inet_aton(_MDNS_ADDR) + socket.inet_aton('0.0.0.0'),
         )
@@ -1844,7 +1854,7 @@
             self.engine.notify()
             self.unregisterAllServices()
             self.socket.setsockopt(
-                socket.SOL_IP,
+                _SOL_IP,
                 socket.IP_DROP_MEMBERSHIP,
                 socket.inet_aton(_MDNS_ADDR) + socket.inet_aton('0.0.0.0'),
             )
--- a/tests/test-hgrc.t	Sat Oct 12 16:55:30 2024 -0400
+++ b/tests/test-hgrc.t	Mon Oct 07 23:20:09 2024 -0400
@@ -304,15 +304,6 @@
   config error at $TESTTMP/.hg/hgrc:3: [broken
   [255]
 
-XXX-PYOXIDIZER Pyoxidizer build have trouble with zeroconf for unclear reason,
-we accept the bad output for now as this is the last thing in the way of
-testing the pyoxidizer build.
-
-#if no-pyoxidizer-in-filesystem
   $ HGRCSKIPREPO=1 hg paths --config extensions.zeroconf=
   foo = $TESTTMP/bar
-#else
-  $ HGRCSKIPREPO=1 hg paths --config extensions.zeroconf=
-  abort: An invalid argument was supplied (known-bad-output !)
-  [255]
-#endif
+
--- a/tests/test-paths.t	Sat Oct 12 16:55:30 2024 -0400
+++ b/tests/test-paths.t	Mon Oct 07 23:20:09 2024 -0400
@@ -140,21 +140,11 @@
 
 zeroconf wraps ui.configitems(), which shouldn't crash at least:
 
-XXX-PYOXIDIZER Pyoxidizer build have trouble with zeroconf for unclear reason,
-we accept the bad output for now as this is the last thing in the way of
-testing the pyoxidizer build.
-
-#if no-pyoxidizer-in-filesystem
   $ hg paths --config extensions.zeroconf=
   dupe = $TESTTMP/b#tip
   dupe:pushurl = https://example.com/dupe
   expand = $TESTTMP/a/$SOMETHING/bar
   insecure = http://foo:***@example.com/
-#else
-  $ hg paths --config extensions.zeroconf=
-  abort: An invalid argument was supplied (known-bad-output !)
-  [255]
-#endif
 
 
   $ cd ..