[PATCH 08 of 10] hg: when testing, warn if repo.ui is passed to a new peer or localrepo

Simon Heimberg simohe at besonet.ch
Tue Jul 16 20:14:49 CDT 2013


Code freeze has passed a long time ago, so let's finally continue this
discussion.

Your proposed solution looks better and much simpler than mine.

But I have some concerns about the handling in commandserver. (see
below)

On Thu, 2013-04-18 at 00:36 -0500, Matt Mackall wrote: 
> On Fri, 2013-03-22 at 02:20 +0100, Simon Heimberg wrote:
> > # HG changeset patch
> > # User Simon Heimberg <simohe at besonet.ch>
> > # Date 1349372803 -7200
> > # Node ID bc3341ad23a61fa0ad272be98cdc00cf11d4b8eb
> > # Parent  edcf5f72fdb5621bf6c1c8074ea66428932f0f96
> > hg: when testing, warn if repo.ui is passed to a new peer or localrepo
> >
> > For not getting the configuration of another repo, baseui has to be used when
> > crating a new repository (or a new peer). Therefore we warn the programmer if
> > the ui of a repo is passed.
> > For not warning normal users, the warning is only printed when we are running
> > in run-tests.py (when TESTTMP is in env), when unittest is loaded (running in a
> > test suite of an other project) or when debugging is enabled.
> 
> Well, I still am not thrilled about this approach, and I don't think the
> changes you've made have made it more palatable. Having the code know
> when it's running inside the test environment is not great.
> 
> Perhaps something like this:
> 
> diff -r 7d31f2e42a8a mercurial/commandserver.py
> --- a/mercurial/commandserver.py	Mon Apr 15 18:57:04 2013 -0300
> +++ b/mercurial/commandserver.py	Thu Apr 18 00:34:21 2013 -0500
> @@ -147,6 +147,7 @@
>          self.ui = repo.baseui
>          self.repo = repo
>          self.repoui = repo.ui
> +        del self.repoui.copy # defeat copy protection

Here we restore the original copy function because it is used later as a
"backup" function. But this change will propagate to all commands
resulting in possibly wrong configuration in unrelaed repos.

I think the simplest approach is to not use ui.copy in commandserver,
but to use the ui constructor instead (what ui.copy also does):

=== (+4,-2) mercurial/commandserver.py ===
@@ -184,7 +184,9 @@
         # persist between requests
         copiedui = self.ui.copy()
         self.repo.baseui = copiedui
-        self.repo.ui = self.repo.dirstate._ui = self.repoui.copy()
+        repoui = self.repoui.__class__(self.repoui) # copy is proteced
+        repoui.copy = self.repoui.copy # protect copying local
configuration
+        self.repo.ui = self.repo.dirstate._ui = repoui
         self.repo.invalidate()
         self.repo.invalidatedirstate()

> 
>          if mode == 'pipe':
>              self.cerr = channeledoutput(sys.stderr, sys.stdout, 'e')
> diff -r 7d31f2e42a8a mercurial/localrepo.py
> --- a/mercurial/localrepo.py	Mon Apr 15 18:57:04 2013 -0300
> +++ b/mercurial/localrepo.py	Thu Apr 18 00:34:21 2013 -0500
> @@ -163,6 +163,8 @@
>          self.opener = self.vfs
>          self.baseui = baseui
>          self.ui = baseui.copy()
> +        self.ui.copy = baseui.copy # prevent copying
> +

Does this mean calling repo.ui.copy() actually calls repo.baseui.copy()?
This should do the trick. Great.
A side effect could be that repo.ui.copy has returns a different class
than repo.ui when an extension only changed this one but not repo.baseui
(like the color extension did). 

> # A list of callback to shape the phase if no data were found.
>          # Callback are in the form: func(repo, roots) --> processed root.
>          # This list it to be filled by extension during repo setup
> 
> 
> This mostly passes tests, though there's an interaction between mq and
> color I'm sure you've noticed. Let's talk about this post-2.6.
> 



More information about the Mercurial-devel mailing list