watchman: add the possibility to set the exact watchman binary location
This is necessary to make rolling releases of new watchman versions across
users.
Differential Revision: https://phab.mercurial-scm.org/D5954
--- a/hgext/fsmonitor/__init__.py Fri Mar 15 22:18:35 2019 -0700
+++ b/hgext/fsmonitor/__init__.py Fri Dec 21 17:10:54 2018 +0100
@@ -161,6 +161,9 @@
configitem('fsmonitor', 'blacklistusers',
default=list,
)
+configitem('fsmonitor', 'watchman_exe',
+ default='watchman',
+)
configitem('fsmonitor', 'verbose',
default=True,
)
--- a/hgext/fsmonitor/pywatchman/__init__.py Fri Mar 15 22:18:35 2019 -0700
+++ b/hgext/fsmonitor/pywatchman/__init__.py Fri Dec 21 17:10:54 2018 +0100
@@ -317,7 +317,7 @@
""" local unix domain socket transport """
sock = None
- def __init__(self, sockpath, timeout):
+ def __init__(self, sockpath, timeout, watchman_exe):
self.sockpath = sockpath
self.timeout = timeout
@@ -397,7 +397,7 @@
class WindowsNamedPipeTransport(Transport):
""" connect to a named pipe """
- def __init__(self, sockpath, timeout):
+ def __init__(self, sockpath, timeout, watchman_exe):
self.sockpath = sockpath
self.timeout = int(math.ceil(timeout * 1000))
self._iobuf = None
@@ -563,9 +563,10 @@
proc = None
closed = True
- def __init__(self, sockpath, timeout):
+ def __init__(self, sockpath, timeout, watchman_exe):
self.sockpath = sockpath
self.timeout = timeout
+ self.watchman_exe = watchman_exe
def close(self):
if self.proc:
@@ -579,7 +580,7 @@
if self.proc:
return self.proc
args = [
- 'watchman',
+ self.watchman_exe,
'--sockname={0}'.format(self.sockpath),
'--logfile=/BOGUS',
'--statefile=/BOGUS',
@@ -756,6 +757,7 @@
unilateral = ['log', 'subscription']
tport = None
useImmutableBser = None
+ watchman_exe = None
def __init__(self,
sockpath=None,
@@ -763,10 +765,12 @@
transport=None,
sendEncoding=None,
recvEncoding=None,
- useImmutableBser=False):
+ useImmutableBser=False,
+ watchman_exe=None):
self.sockpath = sockpath
self.timeout = timeout
self.useImmutableBser = useImmutableBser
+ self.watchman_exe = watchman_exe
if inspect.isclass(transport) and issubclass(transport, Transport):
self.transport = transport
@@ -817,7 +821,7 @@
if path:
return path
- cmd = ['watchman', '--output-encoding=bser', 'get-sockname']
+ cmd = [self.watchman_exe, '--output-encoding=bser', 'get-sockname']
try:
args = dict(stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
@@ -858,7 +862,7 @@
if self.sockpath is None:
self.sockpath = self._resolvesockname()
- self.tport = self.transport(self.sockpath, self.timeout)
+ self.tport = self.transport(self.sockpath, self.timeout, self.watchman_exe)
self.sendConn = self.sendCodec(self.tport)
self.recvConn = self.recvCodec(self.tport)
--- a/hgext/fsmonitor/watchmanclient.py Fri Mar 15 22:18:35 2019 -0700
+++ b/hgext/fsmonitor/watchmanclient.py Fri Dec 21 17:10:54 2018 +0100
@@ -82,9 +82,11 @@
try:
if self._watchmanclient is None:
self._firsttime = False
+ watchman_exe = self._ui.configpath('fsmonitor', 'watchman_exe')
self._watchmanclient = pywatchman.client(
timeout=self._timeout,
- useImmutableBser=True)
+ useImmutableBser=True,
+ watchman_exe=watchman_exe)
return self._watchmanclient.query(*watchmanargs)
except pywatchman.CommandError as ex:
if 'unable to resolve root' in ex.msg: