# HG changeset patch # User Jun Wu # Date 2017-10-12 00:27:21 # Node ID a568a46751b6fc87437b143582f594bfe87451f6 # Parent 021607b4ef49422c1f298e3321418e1632464c0a selectors2: do not use platform.system() `platform.system()` may have a side effect spawning a shell executing `uname -p`, which may print a warning when the current directory is removed: shell-init: error retrieving current directory: getcwd: cannot access parent directories: No such file or directory This patch changes selectors2 to test the `sys.platform` string, which is a much safer way to detect Jython. Jython's `sys.platform` looks like this: Jython 2.7.1 (default:0df7adb1b397, Jun 30 2017, 19:02:43) [OpenJDK 64-Bit Server VM (Oracle Corporation)] on java1.8.0_144 Type "help", "copyright", "credits" or "license" for more information. >>> import sys >>> sys.platform 'java1.8.0_144 ( ==linux2 for targets )' Differential Revision: https://phab.mercurial-scm.org/D1018 diff --git a/mercurial/pycompat.py b/mercurial/pycompat.py --- a/mercurial/pycompat.py +++ b/mercurial/pycompat.py @@ -314,3 +314,5 @@ else: stringio = cStringIO.StringIO maplist = map rawinput = raw_input + +isjython = sysplatform.startswith('java') diff --git a/mercurial/selectors2.py b/mercurial/selectors2.py --- a/mercurial/selectors2.py +++ b/mercurial/selectors2.py @@ -29,12 +29,13 @@ from __future__ import absolute_import import collections import errno import math -import platform import select import socket import sys import time +from . import pycompat + namedtuple = collections.namedtuple Mapping = collections.Mapping @@ -288,7 +289,7 @@ if hasattr(select, "select"): __all__.append('SelectSelector') # Jython has a different implementation of .fileno() for socket objects. - if platform.system() == 'Java': + if pycompat.isjython: class _JythonSelectorMapping(object): """ This is an implementation of _SelectorMapping that is built for use specifically with Jython, which does not provide a hashable @@ -727,7 +728,7 @@ def DefaultSelector(): by eventlet, greenlet, and preserve proper behavior. """ global _DEFAULT_SELECTOR if _DEFAULT_SELECTOR is None: - if platform.system() == 'Java': # Platform-specific: Jython + if pycompat.isjython: _DEFAULT_SELECTOR = JythonSelectSelector elif _can_allocate('kqueue'): _DEFAULT_SELECTOR = KqueueSelector