[PATCH STABLE] localrepo: clear _filecache on rollback (issue3261)

Idan Kamara idankk86 at gmail.com
Wed Feb 15 17:22:04 CST 2012


# HG changeset patch
# User Idan Kamara <idankk86 at gmail.com>
# Date 1329348094 -7200
# Branch stable
# Node ID 96ed1bfd8623e4c63a5fdd690402c9218b5cb2ff
# Parent  ca5e559a338e3419f96bba794e997b2ccd91e3fe
localrepo: clear _filecache on rollback (issue3261)

Files are being replaced by rollback but the corresponding data in localrepo
isn't actually updated for things like bookmarks, phases, etc. Then when
rollback is done, the cache is updated thinking it has the most up-to-date
data, where in fact it is still pre-rollback.

We clear _filecache to force everything to be recreated.

diff --git a/mercurial/localrepo.py b/mercurial/localrepo.py
--- a/mercurial/localrepo.py
+++ b/mercurial/localrepo.py
@@ -1304,6 +1304,9 @@
         # tag cache retrieval" case to work.
         self.invalidatecaches()
 
+        # Discard all cache entries to force reloading everything.
+        self._filecache.clear()
+
     def walk(self, match, node=None):
         '''
         walk recursively through the directory tree or a given
diff --git a/tests/test-commandserver.py b/tests/test-commandserver.py
--- a/tests/test-commandserver.py
+++ b/tests/test-commandserver.py
@@ -200,6 +200,16 @@
     os.system('hg phase -r . -p')
     runcommand(server, ['phase', '-r', '.'])
 
+def rollback(server):
+    readchannel(server)
+    runcommand(server, ['phase', '-r', '.', '-p'])
+    f = open('a', 'ab')
+    f.write('a\n')
+    f.close()
+    runcommand(server, ['commit', '-Am.'])
+    runcommand(server, ['rollback'])
+    runcommand(server, ['phase', '-r', '.'])
+
 if __name__ == '__main__':
     os.system('hg init')
 
@@ -219,3 +229,4 @@
     check(bookmarks)
     check(tagscache)
     check(setphase)
+    check(rollback)
diff --git a/tests/test-commandserver.py.out b/tests/test-commandserver.py.out
--- a/tests/test-commandserver.py.out
+++ b/tests/test-commandserver.py.out
@@ -134,3 +134,14 @@
 3: draft
  runcommand phase -r .
 3: public
+no phases changed
+
+testing rollback:
+
+ runcommand phase -r . -p
+ runcommand commit -Am.
+ runcommand rollback
+repository tip rolled back to revision 3 (undo commit)
+working directory now based on revision 3
+ runcommand phase -r .
+3: public


More information about the Mercurial-devel mailing list