# HG changeset patch # User Boris Feld # Date 1545408654 -3600 # 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 -r 21cc92fea2aa -r 57264906a996 hgext/fsmonitor/__init__.py --- 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, ) diff -r 21cc92fea2aa -r 57264906a996 hgext/fsmonitor/pywatchman/__init__.py --- 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) diff -r 21cc92fea2aa -r 57264906a996 hgext/fsmonitor/watchmanclient.py --- 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: