ui: factor out ui.load() to create a ui without loading configs (API)
authorYuya Nishihara <yuya@tcha.org>
Sat, 22 Oct 2016 14:35:10 +0900
changeset 30559 d83ca854fa21
parent 30557 cbeb54ec0481
child 30560 783016005122
ui: factor out ui.load() to create a ui without loading configs (API) This allows us to write doctests depending on a ui object, but not on global configs. ui.load() is a class method so we can do wsgiui.load(). All ui() calls but for doctests are replaced with ui.load(). Some of them could be changed to not load configs later.
contrib/benchmarks/__init__.py
contrib/simplemerge
doc/check-seclevel.py
doc/gendoc.py
mercurial/dispatch.py
mercurial/hgweb/hgweb_mod.py
mercurial/hgweb/hgwebdir_mod.py
mercurial/hgweb/webcommands.py
mercurial/ui.py
tests/dummysmtpd.py
tests/hghave.py
tests/test-ancestor.py
tests/test-basic.t
tests/test-bisect.t
tests/test-clone.t
tests/test-commit-interactive-curses.t
tests/test-commit-multiple.t
tests/test-commit.t
tests/test-context.py
tests/test-duplicateoptions.py
tests/test-filecache.py
tests/test-filelog.py
tests/test-hgweb-auth.py
tests/test-hgwebdir-paths.py
tests/test-http-branchmap.t
tests/test-propertycache.py
tests/test-revlog-ancestry.py
tests/test-status-inprocess.py
tests/test-symlink-os-yes-fs-no.py
tests/test-trusted.py
tests/test-ui-color.py
tests/test-ui-config.py
tests/test-ui-verbosity.py
tests/test-walkrepo.py
--- a/contrib/benchmarks/__init__.py	Wed Nov 30 19:23:04 2016 +0000
+++ b/contrib/benchmarks/__init__.py	Sat Oct 22 14:35:10 2016 +0900
@@ -50,7 +50,7 @@
 
 def runperfcommand(reponame, command, *args, **kwargs):
     os.environ["HGRCPATH"] = os.environ.get("ASVHGRCPATH", "")
-    ui = uimod.ui()
+    ui = uimod.ui.load()
     repo = hg.repository(ui, os.path.join(reposdir, reponame))
     perfext = extensions.load(ui, 'perfext',
                               os.path.join(basedir, 'contrib', 'perf.py'))
--- a/contrib/simplemerge	Wed Nov 30 19:23:04 2016 +0000
+++ b/contrib/simplemerge	Sat Oct 22 14:35:10 2016 +0900
@@ -54,7 +54,7 @@
         sys.exit(0)
     if len(args) != 3:
             raise ParseError(_('wrong number of arguments'))
-    sys.exit(simplemerge.simplemerge(ui.ui(), *args, **opts))
+    sys.exit(simplemerge.simplemerge(ui.ui.load(), *args, **opts))
 except ParseError as e:
     sys.stdout.write("%s: %s\n" % (sys.argv[0], e))
     showhelp()
--- a/doc/check-seclevel.py	Wed Nov 30 19:23:04 2016 +0000
+++ b/doc/check-seclevel.py	Sat Oct 22 14:35:10 2016 +0900
@@ -158,7 +158,7 @@
 
     (options, args) = optparser.parse_args()
 
-    ui = uimod.ui()
+    ui = uimod.ui.load()
     ui.setconfig('ui', 'verbose', options.verbose, '--verbose')
     ui.setconfig('ui', 'debug', options.debug, '--debug')
 
--- a/doc/gendoc.py	Wed Nov 30 19:23:04 2016 +0000
+++ b/doc/gendoc.py	Sat Oct 22 14:35:10 2016 +0900
@@ -217,7 +217,7 @@
     if len(sys.argv) > 1:
         doc = sys.argv[1]
 
-    ui = uimod.ui()
+    ui = uimod.ui.load()
     if doc == 'hg.1.gendoc':
         showdoc(ui)
     else:
--- a/mercurial/dispatch.py	Wed Nov 30 19:23:04 2016 +0000
+++ b/mercurial/dispatch.py	Sat Oct 22 14:35:10 2016 +0900
@@ -101,7 +101,7 @@
 
     try:
         if not req.ui:
-            req.ui = uimod.ui()
+            req.ui = uimod.ui.load()
         if '--traceback' in req.args:
             req.ui.setconfig('ui', 'traceback', 'on', '--traceback')
 
--- a/mercurial/hgweb/hgweb_mod.py	Wed Nov 30 19:23:04 2016 +0000
+++ b/mercurial/hgweb/hgweb_mod.py	Sat Oct 22 14:35:10 2016 +0900
@@ -224,7 +224,7 @@
             if baseui:
                 u = baseui.copy()
             else:
-                u = uimod.ui()
+                u = uimod.ui.load()
             r = hg.repository(u, repo)
         else:
             # we trust caller to give us a private copy
@@ -467,4 +467,3 @@
         return repo.filtered(viewconfig)
     else:
         return repo.filtered('served')
-
--- a/mercurial/hgweb/hgwebdir_mod.py	Wed Nov 30 19:23:04 2016 +0000
+++ b/mercurial/hgweb/hgwebdir_mod.py	Sat Oct 22 14:35:10 2016 +0900
@@ -136,7 +136,7 @@
         if self.baseui:
             u = self.baseui.copy()
         else:
-            u = uimod.ui()
+            u = uimod.ui.load()
             u.setconfig('ui', 'report_untrusted', 'off', 'hgwebdir')
             u.setconfig('ui', 'nontty', 'true', 'hgwebdir')
             # displaying bundling progress bar while serving feels wrong and may
--- a/mercurial/hgweb/webcommands.py	Wed Nov 30 19:23:04 2016 +0000
+++ b/mercurial/hgweb/webcommands.py	Sat Oct 22 14:35:10 2016 +0900
@@ -1302,7 +1302,7 @@
         return tmpl('helptopics', topics=topics, title=topicname,
                     subindex=True)
 
-    u = webutil.wsgiui()
+    u = webutil.wsgiui.load()
     u.verbose = True
 
     # Render a page from a sub-topic.
--- a/mercurial/ui.py	Wed Nov 30 19:23:04 2016 +0000
+++ b/mercurial/ui.py	Sat Oct 22 14:35:10 2016 +0900
@@ -96,6 +96,12 @@
 
 class ui(object):
     def __init__(self, src=None):
+        """Create a fresh new ui object if no src given
+
+        Use uimod.ui.load() to create a ui which knows global and user configs.
+        In most cases, you should use ui.copy() to create a copy of an existing
+        ui object.
+        """
         # _buffers: used for temporary capture of output
         self._buffers = []
         # 3-tuple describing how each buffer in the stack behaves.
@@ -138,12 +144,18 @@
 
             # shared read-only environment
             self.environ = os.environ
-            # we always trust global config files
-            for f in scmutil.rcpath():
-                self.readconfig(f, trust=True)
 
             self.httppasswordmgrdb = urlreq.httppasswordmgrwithdefaultrealm()
 
+    @classmethod
+    def load(cls):
+        """Create a ui and load global and user configs"""
+        u = cls()
+        # we always trust global config files
+        for f in scmutil.rcpath():
+            u.readconfig(f, trust=True)
+        return u
+
     def copy(self):
         return self.__class__(self)
 
--- a/tests/dummysmtpd.py	Wed Nov 30 19:23:04 2016 +0000
+++ b/tests/dummysmtpd.py	Sat Oct 22 14:35:10 2016 +0900
@@ -37,7 +37,7 @@
         if not pair:
             return
         conn, addr = pair
-        ui = uimod.ui()
+        ui = uimod.ui.load()
         try:
             # wrap_socket() would block, but we don't care
             conn = sslutil.wrapserversocket(conn, ui, certfile=self._certfile)
--- a/tests/hghave.py	Wed Nov 30 19:23:04 2016 +0000
+++ b/tests/hghave.py	Sat Oct 22 14:35:10 2016 +0900
@@ -449,7 +449,7 @@
 @check("defaultcacerts", "can verify SSL certs by system's CA certs store")
 def has_defaultcacerts():
     from mercurial import sslutil, ui as uimod
-    ui = uimod.ui()
+    ui = uimod.ui.load()
     return sslutil._defaultcacerts(ui) or sslutil._canloaddefaultcerts
 
 @check("defaultcacertsloaded", "detected presence of loaded system CA certs")
@@ -462,7 +462,7 @@
     if not has_sslcontext():
         return False
 
-    ui = uimod.ui()
+    ui = uimod.ui.load()
     cafile = sslutil._defaultcacerts(ui)
     ctx = ssl.create_default_context()
     if cafile:
--- a/tests/test-ancestor.py	Wed Nov 30 19:23:04 2016 +0000
+++ b/tests/test-ancestor.py	Sat Oct 22 14:35:10 2016 +0900
@@ -218,7 +218,7 @@
     '+3*3/*2*2/*4*4/*4/2*4/2*2',
 ]
 def test_gca():
-    u = uimod.ui()
+    u = uimod.ui.load()
     for i, dag in enumerate(dagtests):
         repo = hg.repository(u, 'gca%d' % i, create=1)
         cl = repo.changelog
--- a/tests/test-basic.t	Wed Nov 30 19:23:04 2016 +0000
+++ b/tests/test-basic.t	Sat Oct 22 14:35:10 2016 +0900
@@ -34,7 +34,7 @@
 
   $ cat <<EOF > update_to_rev0.py
   > from mercurial import ui, hg, commands
-  > myui = ui.ui()
+  > myui = ui.ui.load()
   > repo = hg.repository(myui, path='.')
   > commands.update(myui, repo, rev=0)
   > EOF
--- a/tests/test-bisect.t	Wed Nov 30 19:23:04 2016 +0000
+++ b/tests/test-bisect.t	Sat Oct 22 14:35:10 2016 +0900
@@ -456,7 +456,7 @@
   > #!/usr/bin/env python
   > import sys
   > from mercurial import ui, hg
-  > repo = hg.repository(ui.ui(), '.')
+  > repo = hg.repository(ui.ui.load(), '.')
   > if repo['.'].rev() < 6:
   >     sys.exit(1)
   > EOF
--- a/tests/test-clone.t	Wed Nov 30 19:23:04 2016 +0000
+++ b/tests/test-clone.t	Sat Oct 22 14:35:10 2016 +0900
@@ -515,7 +515,7 @@
 
   $ cat <<EOF > simpleclone.py
   > from mercurial import ui, hg
-  > myui = ui.ui()
+  > myui = ui.ui.load()
   > repo = hg.repository(myui, 'a')
   > hg.clone(myui, {}, repo, dest="ua")
   > EOF
@@ -528,7 +528,7 @@
 
   $ cat <<EOF > branchclone.py
   > from mercurial import ui, hg, extensions
-  > myui = ui.ui()
+  > myui = ui.ui.load()
   > extensions.loadall(myui)
   > repo = hg.repository(myui, 'a')
   > hg.clone(myui, {}, repo, dest="ua", branch=["stable",])
--- a/tests/test-commit-interactive-curses.t	Wed Nov 30 19:23:04 2016 +0000
+++ b/tests/test-commit-interactive-curses.t	Sat Oct 22 14:35:10 2016 +0900
@@ -325,7 +325,7 @@
   $ chunkselectorinterface() {
   > python <<EOF
   > from mercurial import hg, ui, parsers;\
-  > repo = hg.repository(ui.ui(), ".");\
+  > repo = hg.repository(ui.ui.load(), ".");\
   > print repo.ui.interface("chunkselector")
   > EOF
   > }
--- a/tests/test-commit-multiple.t	Wed Nov 30 19:23:04 2016 +0000
+++ b/tests/test-commit-multiple.t	Sat Oct 22 14:35:10 2016 +0900
@@ -92,7 +92,7 @@
   > def printfiles(repo, rev):
   >     print "revision %s files: %s" % (rev, repo[rev].files())
   > 
-  > repo = hg.repository(ui.ui(), '.')
+  > repo = hg.repository(ui.ui.load(), '.')
   > assert len(repo) == 6, \
   >        "initial: len(repo): %d, expected: 6" % len(repo)
   > 
--- a/tests/test-commit.t	Wed Nov 30 19:23:04 2016 +0000
+++ b/tests/test-commit.t	Sat Oct 22 14:35:10 2016 +0900
@@ -609,7 +609,7 @@
   $ cat > evil-commit.py <<EOF
   > from mercurial import ui, hg, context, node
   > notrc = u".h\u200cg".encode('utf-8') + '/hgrc'
-  > u = ui.ui()
+  > u = ui.ui.load()
   > r = hg.repository(u, '.')
   > def filectxfn(repo, memctx, path):
   >     return context.memfilectx(repo, path, '[hooks]\nupdate = echo owned')
@@ -633,7 +633,7 @@
   $ cat > evil-commit.py <<EOF
   > from mercurial import ui, hg, context, node
   > notrc = "HG~1/hgrc"
-  > u = ui.ui()
+  > u = ui.ui.load()
   > r = hg.repository(u, '.')
   > def filectxfn(repo, memctx, path):
   >     return context.memfilectx(repo, path, '[hooks]\nupdate = echo owned')
@@ -651,7 +651,7 @@
   $ cat > evil-commit.py <<EOF
   > from mercurial import ui, hg, context, node
   > notrc = "HG8B6C~2/hgrc"
-  > u = ui.ui()
+  > u = ui.ui.load()
   > r = hg.repository(u, '.')
   > def filectxfn(repo, memctx, path):
   >     return context.memfilectx(repo, path, '[hooks]\nupdate = echo owned')
--- a/tests/test-context.py	Wed Nov 30 19:23:04 2016 +0000
+++ b/tests/test-context.py	Sat Oct 22 14:35:10 2016 +0900
@@ -7,7 +7,7 @@
     ui as uimod,
 )
 
-u = uimod.ui()
+u = uimod.ui.load()
 
 repo = hg.repository(u, 'test1', create=1)
 os.chdir('test1')
--- a/tests/test-duplicateoptions.py	Wed Nov 30 19:23:04 2016 +0000
+++ b/tests/test-duplicateoptions.py	Sat Oct 22 14:35:10 2016 +0900
@@ -21,7 +21,7 @@
 
 hgrc.close()
 
-u = uimod.ui()
+u = uimod.ui.load()
 extensions.loadall(u)
 
 globalshort = set()
--- a/tests/test-filecache.py	Wed Nov 30 19:23:04 2016 +0000
+++ b/tests/test-filecache.py	Sat Oct 22 14:35:10 2016 +0900
@@ -141,7 +141,7 @@
 def test_filecache_synced():
     # test old behavior that caused filecached properties to go out of sync
     os.system('hg init && echo a >> a && hg ci -qAm.')
-    repo = hg.repository(uimod.ui())
+    repo = hg.repository(uimod.ui.load())
     # first rollback clears the filecache, but changelog to stays in __dict__
     repo.rollback()
     repo.commit('.')
--- a/tests/test-filelog.py	Wed Nov 30 19:23:04 2016 +0000
+++ b/tests/test-filelog.py	Sat Oct 22 14:35:10 2016 +0900
@@ -13,7 +13,7 @@
     ui as uimod,
 )
 
-myui = uimod.ui()
+myui = uimod.ui.load()
 repo = hg.repository(myui, path='.', create=True)
 
 fl = repo.file('foobar')
--- a/tests/test-hgweb-auth.py	Wed Nov 30 19:23:04 2016 +0000
+++ b/tests/test-hgweb-auth.py	Sat Oct 22 14:35:10 2016 +0900
@@ -15,7 +15,7 @@
     def interactive(self):
         return False
 
-origui = myui()
+origui = myui.load()
 
 def writeauth(items):
     ui = origui.copy()
--- a/tests/test-hgwebdir-paths.py	Wed Nov 30 19:23:04 2016 +0000
+++ b/tests/test-hgwebdir-paths.py	Sat Oct 22 14:35:10 2016 +0900
@@ -15,7 +15,7 @@
 
 webdir = os.path.realpath('.')
 
-u = uimod.ui()
+u = uimod.ui.load()
 hg.repository(u, 'a', create=1)
 hg.repository(u, 'b', create=1)
 os.chdir('b')
--- a/tests/test-http-branchmap.t	Wed Nov 30 19:23:04 2016 +0000
+++ b/tests/test-http-branchmap.t	Sat Oct 22 14:35:10 2016 +0900
@@ -81,7 +81,7 @@
   > sys.stdout = StdoutWrapper(sys.stdout)
   > sys.stderr = StdoutWrapper(sys.stderr)
   > 
-  > myui = ui.ui()
+  > myui = ui.ui.load()
   > repo = hg.repository(myui, 'a')
   > commands.serve(myui, repo, stdio=True, cmdserver=False)
   > EOF
--- a/tests/test-propertycache.py	Wed Nov 30 19:23:04 2016 +0000
+++ b/tests/test-propertycache.py	Sat Oct 22 14:35:10 2016 +0900
@@ -46,7 +46,7 @@
 # these tests on the real object to detect regression.
 repopath = os.path.join(os.environ['TESTTMP'], 'repo')
 assert subprocess.call(['hg', 'init', repopath]) == 0
-ui = uimod.ui()
+ui = uimod.ui.load()
 repo = hg.repository(ui, path=repopath).unfiltered()
 
 
--- a/tests/test-revlog-ancestry.py	Wed Nov 30 19:23:04 2016 +0000
+++ b/tests/test-revlog-ancestry.py	Sat Oct 22 14:35:10 2016 +0900
@@ -6,7 +6,7 @@
     ui as uimod,
 )
 
-u = uimod.ui()
+u = uimod.ui.load()
 
 repo = hg.repository(u, 'test1', create=1)
 os.chdir('test1')
--- a/tests/test-status-inprocess.py	Wed Nov 30 19:23:04 2016 +0000
+++ b/tests/test-status-inprocess.py	Sat Oct 22 14:35:10 2016 +0900
@@ -7,7 +7,7 @@
     ui as uimod,
 )
 
-u = uimod.ui()
+u = uimod.ui.load()
 
 print('% creating repo')
 repo = localrepo.localrepository(u, '.', create=True)
--- a/tests/test-symlink-os-yes-fs-no.py	Wed Nov 30 19:23:04 2016 +0000
+++ b/tests/test-symlink-os-yes-fs-no.py	Sat Oct 22 14:35:10 2016 +0900
@@ -17,7 +17,7 @@
 if not getattr(os, "symlink", False):
     sys.exit(80) # SKIPPED_STATUS defined in run-tests.py
 
-u = uimod.ui()
+u = uimod.ui.load()
 # hide outer repo
 hg.peer(u, {}, '.', create=True)
 
@@ -48,10 +48,10 @@
     fp.close()
 
 # reload repository
-u = uimod.ui()
+u = uimod.ui.load()
 repo = hg.repository(u, 'test0')
 commands.status(u, repo)
 
 # try cloning a repo which contains symlinks
-u = uimod.ui()
+u = uimod.ui.load()
 hg.clone(u, {}, BUNDLEPATH, 'test1')
--- a/tests/test-trusted.py	Wed Nov 30 19:23:04 2016 +0000
+++ b/tests/test-trusted.py	Sat Oct 22 14:35:10 2016 +0900
@@ -66,7 +66,7 @@
     print('# %s user, %s group%s' % (kind[user == cuser], kind[group == cgroup],
                                      trusted))
 
-    u = uimod.ui()
+    u = uimod.ui.load()
     u.setconfig('ui', 'debug', str(bool(debug)))
     u.setconfig('ui', 'report_untrusted', str(bool(report)))
     u.readconfig('.hg/hgrc')
@@ -156,7 +156,7 @@
 
 print()
 print("# read trusted, untrusted, new ui, trusted")
-u = uimod.ui()
+u = uimod.ui.load()
 u.setconfig('ui', 'debug', 'on')
 u.readconfig(filename)
 u2 = u.copy()
--- a/tests/test-ui-color.py	Wed Nov 30 19:23:04 2016 +0000
+++ b/tests/test-ui-color.py	Sat Oct 22 14:35:10 2016 +0900
@@ -23,7 +23,7 @@
 hgrc.write('color=\n')
 hgrc.close()
 
-ui_ = uimod.ui()
+ui_ = uimod.ui.load()
 ui_.setconfig('ui', 'formatted', 'True')
 
 # we're not interested in the output, so write that to devnull
--- a/tests/test-ui-config.py	Wed Nov 30 19:23:04 2016 +0000
+++ b/tests/test-ui-config.py	Sat Oct 22 14:35:10 2016 +0900
@@ -5,7 +5,7 @@
     ui as uimod,
 )
 
-testui = uimod.ui()
+testui = uimod.ui.load()
 parsed = dispatch._parseconfig(testui, [
     'values.string=string value',
     'values.bool1=true',
--- a/tests/test-ui-verbosity.py	Wed Nov 30 19:23:04 2016 +0000
+++ b/tests/test-ui-verbosity.py	Sat Oct 22 14:35:10 2016 +0900
@@ -32,7 +32,7 @@
         f.write('debug = True\n')
     f.close()
 
-    u = uimod.ui()
+    u = uimod.ui.load()
     if cmd_quiet or cmd_debug or cmd_verbose:
         u.setconfig('ui', 'quiet', str(bool(cmd_quiet)))
         u.setconfig('ui', 'verbose', str(bool(cmd_verbose)))
--- a/tests/test-walkrepo.py	Wed Nov 30 19:23:04 2016 +0000
+++ b/tests/test-walkrepo.py	Sat Oct 22 14:35:10 2016 +0900
@@ -16,7 +16,7 @@
 walkrepos = scmutil.walkrepos
 checklink = util.checklink
 
-u = uimod.ui()
+u = uimod.ui.load()
 sym = checklink('.')
 
 hg.repository(u, 'top1', create=1)