# HG changeset patch # User Boris Feld # Date 2018-12-21 16:10:54 # Node ID 57264906a9962dc6677fa4cc613beb33f8f212d7 # Parent 21cc92fea2aaf6f36f79a45446ce0e9d1347902c 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 diff --git a/hgext/fsmonitor/__init__.py b/hgext/fsmonitor/__init__.py --- a/hgext/fsmonitor/__init__.py +++ b/hgext/fsmonitor/__init__.py @@ -161,6 +161,9 @@ configitem('fsmonitor', 'timeout', configitem('fsmonitor', 'blacklistusers', default=list, ) +configitem('fsmonitor', 'watchman_exe', + default='watchman', +) configitem('fsmonitor', 'verbose', default=True, ) diff --git a/hgext/fsmonitor/pywatchman/__init__.py b/hgext/fsmonitor/pywatchman/__init__.py --- a/hgext/fsmonitor/pywatchman/__init__.py +++ b/hgext/fsmonitor/pywatchman/__init__.py @@ -317,7 +317,7 @@ class UnixSocketTransport(Transport): """ 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 @@ def _get_overlapped_result_ex_impl(pipe, 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 @@ class CLIProcessTransport(Transport): 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 @@ class CLIProcessTransport(Transport): if self.proc: return self.proc args = [ - 'watchman', + self.watchman_exe, '--sockname={0}'.format(self.sockpath), '--logfile=/BOGUS', '--statefile=/BOGUS', @@ -756,6 +757,7 @@ class client(object): unilateral = ['log', 'subscription'] tport = None useImmutableBser = None + watchman_exe = None def __init__(self, sockpath=None, @@ -763,10 +765,12 @@ class client(object): 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 @@ class client(object): 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 @@ class client(object): 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) diff --git a/hgext/fsmonitor/watchmanclient.py b/hgext/fsmonitor/watchmanclient.py --- a/hgext/fsmonitor/watchmanclient.py +++ b/hgext/fsmonitor/watchmanclient.py @@ -82,9 +82,11 @@ class client(object): 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: