diff hgext3rd/topic/__init__.py @ 6645:4443117fdf94 stable

topic: wrap makebundlerepository() to wrap bundlerepository class (issue6856) Previously we just tried to wrap bundlerepo.bundlerepository class globally, but it looks like in some situations it leads to an infinite recursion or similar issues. This patch tries to fix this by moving the class-wrapping logic inside a function that is used for creating bundlerepository.
author Anton Shestakov <av6@dwimlabs.net>
date Fri, 05 Jan 2024 13:35:27 -0300
parents 94bf2f307b75
children e9650b5616ac 81fe0a498447
line wrap: on
line diff
--- a/hgext3rd/topic/__init__.py	Tue Jan 09 17:01:13 2024 +0100
+++ b/hgext3rd/topic/__init__.py	Fri Jan 05 13:35:27 2024 -0300
@@ -516,6 +516,30 @@
     if tr.changes[b'tns']:
         repo.ui.status(b'topic namespaces affected: %s\n' % b' '.join(sorted(tr.changes[b'tns'])))
 
+def wrapmakebundlerepository(orig, ui, repopath, bundlepath):
+    repo = orig(ui, repopath, bundlepath)
+
+    # We want bundle repos to also have caches for topic extension, because we
+    # want to, for example, see topic and topic namespaces in `hg incoming`
+    # regardless if the bundle repo has topic extension, as long as local repo
+    # has topic enabled.
+    class topicbundlerepo(repo.__class__):
+        @util.propertycache
+        def _tnscache(self):
+            return {}
+
+        @util.propertycache
+        def _topiccache(self):
+            return {}
+
+        def invalidatecaches(self):
+            self._tnscache.clear()
+            self._topiccache.clear()
+            super(topicbundlerepo, self).invalidatecaches()
+
+    repo.__class__ = topicbundlerepo
+    return repo
+
 def uisetup(ui):
     destination.modsetup(ui)
     discovery.modsetup(ui)
@@ -601,27 +625,9 @@
     except (KeyError, AttributeError):
         pass
 
-    server.setupserver(ui)
-
-    # We want bundle repos to also have caches for topic extension, because we
-    # want to, for example, see topic and topic namespaces in `hg incoming`
-    # regardless if the bundle repo has topic extension, as long as local repo
-    # has topic enabled.
-    class topicbundlerepo(bundlerepo.bundlerepository):
-        @util.propertycache
-        def _tnscache(self):
-            return {}
+    extensions.wrapfunction(bundlerepo, 'makebundlerepository', wrapmakebundlerepository)
 
-        @util.propertycache
-        def _topiccache(self):
-            return {}
-
-        def invalidatecaches(self):
-            self._tnscache.clear()
-            self._topiccache.clear()
-            super(topicbundlerepo, self).invalidatecaches()
-
-    bundlerepo.bundlerepository = topicbundlerepo
+    server.setupserver(ui)
 
 def reposetup(ui, repo):
     if not isinstance(repo, localrepo.localrepository):