diff mercurial/localrepo.py @ 50177:2f60cd6442fd

dirstate: only reload the dirstate when it may have changed This reinstall the equivalent of what the `filecache` was doing. However it does it at the dirstate level. There is a double motivation for this: - This avoid duplicating logic with the dirstate "identity" logic. - This increase the lifetime of the `dirstate` object, helping to implement change scoping.
author Pierre-Yves David <pierre-yves.david@octobus.net>
date Wed, 22 Feb 2023 01:08:25 +0100
parents ec769cbc1fa2
children 8bc14ac53a41
line wrap: on
line diff
--- a/mercurial/localrepo.py	Wed Feb 22 01:04:55 2023 +0100
+++ b/mercurial/localrepo.py	Wed Feb 22 01:08:25 2023 +0100
@@ -1465,6 +1465,7 @@
         # - bookmark changes
         self.filteredrevcache = {}
 
+        self._dirstate = None
         # post-dirstate-status hooks
         self._postdsstatus = []
 
@@ -1752,9 +1753,11 @@
 
     @unfilteredpropertycache
     def dirstate(self):
-        # XXX This is known to be missing smarter caching. Check the next
-        # changesets
-        return self._makedirstate()
+        if self._dirstate is None:
+            self._dirstate = self._makedirstate()
+        else:
+            self._dirstate.refresh()
+        return self._dirstate
 
     def _makedirstate(self):
         """Extension point for wrapping the dirstate per-repo."""