[PATCH] hg: always create new localrepository instance

Gregory Szorc gregory.szorc at gmail.com
Sat Sep 12 18:33:54 UTC 2015


# HG changeset patch
# User Gregory Szorc <gregory.szorc at gmail.com>
# Date 1442082716 25200
#      Sat Sep 12 11:31:56 2015 -0700
# Node ID ca4473ede18b892c9b15779829461735a3be8c49
# Parent  efebefe162e98aa79438daaea9aaee47c7de33bb
hg: always create new localrepository instance

cachedlocalrepo.copy() didn't actually create new localrepository
instances. This meant that the new thread isolation code in hgweb wasn't
actually using separate localrepository instances, even though it was
properly using separate cachedlocalrepo instances.

Because the behavior of the API changed, the single caller in hgweb had
to be refactored to always call _webifyrepo() or it may not have used
the proper filter.

I confirmed via print() debugging that id(repo) is in fact different on
each thread. This was not the case before.

For reasons I can't yet explain, this does not fix issue4756. I suspect
there is shared cache somewhere that isn't thread safe.

diff --git a/mercurial/hg.py b/mercurial/hg.py
--- a/mercurial/hg.py
+++ b/mercurial/hg.py
@@ -886,9 +886,14 @@ class cachedlocalrepo(object):
 
         return tuple(state), maxmtime
 
     def copy(self):
-        """Obtain a copy of this class instance."""
-        c = cachedlocalrepo(self._repo)
+        """Obtain a copy of this class instance.
+
+        A new localrepository instance is obtained. The new instance should be
+        completely independent of the original.
+        """
+        repo = repository(self._repo.baseui, self._repo.origroot)
+        c = cachedlocalrepo(repo)
         c._state = self._state
         c.mtime = self.mtime
         return c
diff --git a/mercurial/hgweb/hgweb_mod.py b/mercurial/hgweb/hgweb_mod.py
--- a/mercurial/hgweb/hgweb_mod.py
+++ b/mercurial/hgweb/hgweb_mod.py
@@ -234,13 +234,13 @@ class hgweb(object):
         """
         if self._repos:
             cached = self._repos.pop()
             r, created = cached.fetch()
-            if created:
-                r = self._webifyrepo(r)
         else:
             cached = self._lastrepo.copy()
             r, created = cached.fetch()
+        if created:
+            r = self._webifyrepo(r)
 
         self._lastrepo = cached
         self.mtime = cached.mtime
         try:


More information about the Mercurial-devel mailing list