changeset 6298:b4f9b7e468ee stable

topic: invalidate the topic cache when branchcache is invalidated The branchmap is cleared in the superclass function, but I didn't see any sign that this is ever cleared. This fixes an issue in TortoiseHg where stale topic labels appear in certain cases, such as if a commit has a topic and is stripped, and an unrelated commit is pulled in from a remote repo. Additionally, it fixes an issue with the topic display in TortoiseHg and cmdserver when using `hg rollback`. In the new test, the result of the command that applies `topic2` without this fix was: 6 d (topic2) 5 c (topic2) 4 b (topic1) 0 a () The tie in was that rev 4 used to be `topic1` before the rollback. Also note that without the fix, the final log command printed the following, even though it showed no signs of `topic1`, and nothing should have changed: active topic 'topic1' grew its first changeset (see 'hg help topics' for more information)
author Matt Harbison <matt_harbison@yahoo.com>
date Tue, 04 Oct 2022 16:52:23 -0400
parents 2b30ff6c8e82
children 2cfae49c6c34
files hgext3rd/topic/__init__.py tests/test-check-sdist.t tests/test-cmdserver.t
diffstat 3 files changed, 121 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/hgext3rd/topic/__init__.py	Thu Jul 14 16:39:49 2022 +0400
+++ b/hgext3rd/topic/__init__.py	Tue Oct 04 16:52:23 2022 -0400
@@ -541,6 +541,10 @@
                                                       start=start,
                                                       closed=closed)
 
+        def invalidatecaches(self):
+            self._topiccache.clear()
+            super(topicrepo, self).invalidatecaches()
+
         def invalidatevolatilesets(self):
             # XXX we might be able to move this to something invalidated less often
             super(topicrepo, self).invalidatevolatilesets()
--- a/tests/test-check-sdist.t	Thu Jul 14 16:39:49 2022 +0400
+++ b/tests/test-check-sdist.t	Tue Oct 04 16:52:23 2022 -0400
@@ -35,7 +35,7 @@
 
   $ tar -tzf hg-evolve-*.tar.gz | sed 's|^hg-evolve-[^/]*/||' | sort > files
   $ wc -l files
-  357 files
+  358 files
   $ fgrep debian files
   tests/test-check-debian.t
   $ fgrep __init__.py files
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/test-cmdserver.t	Tue Oct 04 16:52:23 2022 -0400
@@ -0,0 +1,116 @@
+#require no-rhg no-chg
+
+XXX-RHG this test hangs if `hg` is really `rhg`. This was hidden by the use of
+`alias hg=rhg` by run-tests.py. With such alias removed, this test is revealed
+buggy. This need to be resolved sooner than later.
+
+XXX-CHG this test hangs if `hg` is really `chg`. This was hidden by the use of
+`alias hg=chg` by run-tests.py. With such alias removed, this test is revealed
+buggy. This need to be resolved sooner than later.
+
+  $ . "$TESTDIR/testlib/topic_setup.sh"
+
+#if windows
+  $ PYTHONPATH="$RUNTESTDIR/../contrib;$PYTHONPATH"
+#else
+  $ PYTHONPATH="$RUNTESTDIR/../contrib:$PYTHONPATH"
+#endif
+  $ export PYTHONPATH
+
+typical client does not want echo-back messages, so test without it:
+
+  $ grep -v '^promptecho ' < $HGRCPATH >> $HGRCPATH.new
+  $ mv $HGRCPATH.new $HGRCPATH
+
+  $ hg init repo
+  $ cd repo
+
+  $ touch a
+  $ hg ci -Am 'a'
+  adding a
+  $ touch b
+  $ hg ci -Am 'b'
+  adding b
+  $ touch c
+  $ hg ci -Am 'c'
+  adding c
+  $ touch d
+  $ hg ci -Am 'd'
+  adding d
+
+Ensure that topics are not left around for stale revisions.
+
+  >>> from hgclient import check, readchannel, runcommand
+  >>> @check
+  ... def checkruncommand(server):
+  ...     # hello block
+  ...     readchannel(server)
+  ... 
+  ...     # Initial case
+  ...     runcommand(server, [b'log', b'-T', b'{rev} {desc} ({topic})\n'])
+  ... 
+  ...     # first topic
+  ...     runcommand(server, [b'topic', b'topic1', b'-r', b'.'])
+  ... 
+  ...     # Current state
+  ...     runcommand(server, [b'log', b'-T', b'{rev} {desc} ({topic})\n'])
+  ... 
+  ...     # status quo ante
+  ...     runcommand(server, [b'rollback', b'--config', b'ui.rollback=True'])
+  ... 
+  ...     # Current state
+  ...     runcommand(server, [b'log', b'-T', b'{rev} {desc} ({topic})\n'])
+  ... 
+  ...     # second topic
+  ...     runcommand(server, [b'topic', b'topic2', b'-r', b'(.^^)::'])
+  ... 
+  ...     # Current state
+  ...     runcommand(server, [b'log', b'-T', b'{rev} {desc} ({topic})\n'])
+  ... 
+  ...     # status quo ante
+  ...     runcommand(server, [b'rollback', b'--config', b'ui.rollback=True'])
+  ... 
+  ...     # Current state
+  ...     runcommand(server, [b'log', b'-T', b'{rev} {desc} ({topic})\n'])
+  *** runcommand log -T {rev} {desc} ({topic})
+  
+  3 d ()
+  2 c ()
+  1 b ()
+  0 a ()
+  *** runcommand topic topic1 -r .
+  switching to topic topic1
+  changed topic on 1 changesets to "topic1"
+  *** runcommand log -T {rev} {desc} ({topic})
+  
+  4 d (topic1)
+  2 c ()
+  1 b ()
+  0 a ()
+  *** runcommand rollback --config ui.rollback=True
+  repository tip rolled back to revision 3 (undo rewrite-topics)
+  working directory now based on revision 3
+  *** runcommand log -T {rev} {desc} ({topic})
+  
+  3 d ()
+  2 c ()
+  1 b ()
+  0 a ()
+  *** runcommand topic topic2 -r (.^^)::
+  switching to topic topic2
+  changed topic on 3 changesets to "topic2"
+  *** runcommand log -T {rev} {desc} ({topic})
+  
+  6 d (topic2)
+  5 c (topic2)
+  4 b (topic2)
+  0 a ()
+  *** runcommand rollback --config ui.rollback=True
+  repository tip rolled back to revision 3 (undo rewrite-topics)
+  working directory now based on revision 3
+  *** runcommand log -T {rev} {desc} ({topic})
+  
+  3 d ()
+  2 c ()
+  1 b ()
+  0 a ()