[PATCH 1 of 3] localrepo: add hook point to invalidate everything on each command-server run

Yuya Nishihara yuya at tcha.org
Mon Mar 3 06:50:40 CST 2014


# HG changeset patch
# User Yuya Nishihara <yuya at tcha.org>
# Date 1393843283 -32400
#      Mon Mar 03 19:41:23 2014 +0900
# Node ID ca6451d4deaad5f657763df45dd9619f45a157eb
# Parent  e9b1daa0dd45da91343b1466792b875d24543e09
localrepo: add hook point to invalidate everything on each command-server run

MQ extension will wrap this function to invalidate its state.

repo.invalidate cannot be wrapped for this purpose because qpush obtains
repo.lock in the middle of the operation, triggering repo.invalidate.  Also,
it seems wrong to obtain lock earlier because mq data is non-store parts.

diff --git a/mercurial/commandserver.py b/mercurial/commandserver.py
--- a/mercurial/commandserver.py
+++ b/mercurial/commandserver.py
@@ -188,8 +188,7 @@ class server(object):
         repoui = self.repoui.__class__(self.repoui)
         repoui.copy = copiedui.copy # redo copy protection
         self.repo.ui = self.repo.dirstate._ui = repoui
-        self.repo.invalidate()
-        self.repo.invalidatedirstate()
+        self.repo.invalidateall()
 
         req = dispatch.request(args[:], copiedui, self.repo, self.cin,
                                self.cout, self.cerr)
diff --git a/mercurial/localrepo.py b/mercurial/localrepo.py
--- a/mercurial/localrepo.py
+++ b/mercurial/localrepo.py
@@ -993,6 +993,13 @@ class localrepository(object):
                 pass
         self.invalidatecaches()
 
+    def invalidateall(self):
+        '''Fully invalidates both store and non-store parts, causing the
+        subsequent operation to reread any outside changes.'''
+        # extension should hook this to invalidate its caches
+        self.invalidate()
+        self.invalidatedirstate()
+
     def _lock(self, vfs, lockname, wait, releasefn, acquirefn, desc):
         try:
             l = lockmod.lock(vfs, lockname, 0, releasefn, desc=desc)


More information about the Mercurial-devel mailing list