diff -r 6d73b7ff8f92 -r 2083d1643d69 mercurial/context.py --- a/mercurial/context.py Mon Jun 12 13:56:43 2017 -0700 +++ b/mercurial/context.py Mon Jun 12 13:56:50 2017 -0700 @@ -1742,7 +1742,8 @@ def _poststatusfixup(self, status, fixup): """update dirstate for files that are actually clean""" - if fixup: + poststatus = self._repo.postdsstatus() + if fixup or poststatus: try: oldid = self._repo.dirstate.identity() @@ -1752,15 +1753,20 @@ # taking the lock with self._repo.wlock(False): if self._repo.dirstate.identity() == oldid: - normal = self._repo.dirstate.normal - for f in fixup: - normal(f) - # write changes out explicitly, because nesting - # wlock at runtime may prevent 'wlock.release()' - # after this block from doing so for subsequent - # changing files - tr = self._repo.currenttransaction() - self._repo.dirstate.write(tr) + if fixup: + normal = self._repo.dirstate.normal + for f in fixup: + normal(f) + # write changes out explicitly, because nesting + # wlock at runtime may prevent 'wlock.release()' + # after this block from doing so for subsequent + # changing files + tr = self._repo.currenttransaction() + self._repo.dirstate.write(tr) + + if poststatus: + for ps in poststatus: + ps(self, status) else: # in this case, writing changes out breaks # consistency, because .hg/dirstate was @@ -1770,6 +1776,9 @@ 'identity mismatch\n') except error.LockError: pass + finally: + # Even if the wlock couldn't be grabbed, clear out the list. + self._repo.clearpostdsstatus() def _dirstatestatus(self, match=None, ignored=False, clean=False, unknown=False):