##// END OF EJS Templates
fsmonitor: fsmonitor should send wlock notifications to watchman...
Eamonn Kent -
r35314:c67fb3bf default
parent child Browse files
Show More
@@ -161,6 +161,9 b" configitem('fsmonitor', 'timeout',"
161 configitem('fsmonitor', 'blacklistusers',
161 configitem('fsmonitor', 'blacklistusers',
162 default=list,
162 default=list,
163 )
163 )
164 configitem('experimental', 'fsmonitor.transaction_notify',
165 default=False,
166 )
164
167
165 # This extension is incompatible with the following blacklisted extensions
168 # This extension is incompatible with the following blacklisted extensions
166 # and will disable itself when encountering one of these:
169 # and will disable itself when encountering one of these:
@@ -656,14 +659,18 b' class state_update(object):'
656 self.enter()
659 self.enter()
657
660
658 def enter(self):
661 def enter(self):
659 # We explicitly need to take a lock here, before we proceed to update
662 # Make sure we have a wlock prior to sending notifications to watchman.
660 # watchman about the update operation, so that we don't race with
663 # We don't want to race with other actors. In the update case,
661 # some other actor. merge.update is going to take the wlock almost
664 # merge.update is going to take the wlock almost immediately. We are
662 # immediately anyway, so this is effectively extending the lock
665 # effectively extending the lock around several short sanity checks.
663 # around a couple of short sanity checks.
664 if self.oldnode is None:
666 if self.oldnode is None:
665 self.oldnode = self.repo['.'].node()
667 self.oldnode = self.repo['.'].node()
666 self._lock = self.repo.wlock()
668
669 if self.repo.currentwlock() is None:
670 if util.safehasattr(self.repo, 'wlocknostateupdate'):
671 self._lock = self.repo.wlocknostateupdate()
672 else:
673 self._lock = self.repo.wlock()
667 self.need_leave = self._state(
674 self.need_leave = self._state(
668 'state-enter',
675 'state-enter',
669 hex(self.oldnode))
676 hex(self.oldnode))
@@ -784,4 +791,34 b' def reposetup(ui, repo):'
784 orig = super(fsmonitorrepo, self).status
791 orig = super(fsmonitorrepo, self).status
785 return overridestatus(orig, self, *args, **kwargs)
792 return overridestatus(orig, self, *args, **kwargs)
786
793
794 def wlocknostateupdate(self, *args, **kwargs):
795 return super(fsmonitorrepo, self).wlock(*args, **kwargs)
796
797 def wlock(self, *args, **kwargs):
798 l = super(fsmonitorrepo, self).wlock(*args, **kwargs)
799 if not ui.configbool(
800 "experimental", "fsmonitor.transaction_notify"):
801 return l
802 if l.held != 1:
803 return l
804 origrelease = l.releasefn
805
806 def staterelease():
807 if origrelease:
808 origrelease()
809 if l.stateupdate:
810 l.stateupdate.exit()
811 l.stateupdate = None
812
813 try:
814 l.stateupdate = None
815 l.stateupdate = state_update(self, name="hg.transaction")
816 l.stateupdate.enter()
817 l.releasefn = staterelease
818 except Exception as e:
819 # Swallow any errors; fire and forget
820 self.ui.log(
821 'watchman', 'Exception in state update %s\n', e)
822 return l
823
787 repo.__class__ = fsmonitorrepo
824 repo.__class__ = fsmonitorrepo
General Comments 0
You need to be logged in to leave comments. Login now