hgext/fsmonitor/__init__.py
changeset 32334 6e0d1043e8fc
parent 32321 7df259077d4b
child 32335 354329178dee
--- a/hgext/fsmonitor/__init__.py	Fri May 19 13:12:42 2017 +0200
+++ b/hgext/fsmonitor/__init__.py	Thu May 18 12:48:07 2017 -0700
@@ -600,14 +600,25 @@
         self.node = node
         self.distance = distance
         self.partial = partial
+        self._lock = None
 
     def __enter__(self):
+        # We explicitly need to take a lock here, before we proceed to update
+        # watchman about the update operation, so that we don't race with
+        # some other actor.  merge.update is going to take the wlock almost
+        # immediately anyway, so this is effectively extending the lock
+        # around a couple of short sanity checks.
+        self._lock = self.repo.wlock()
         self._state('state-enter')
         return self
 
     def __exit__(self, type_, value, tb):
-        status = 'ok' if type_ is None else 'failed'
-        self._state('state-leave', status=status)
+        try:
+            status = 'ok' if type_ is None else 'failed'
+            self._state('state-leave', status=status)
+        finally:
+            if self._lock:
+                self._lock.release()
 
     def _state(self, cmd, status='ok'):
         if not util.safehasattr(self.repo, '_watchmanclient'):