Patchwork [4,of,4] config: set a 'source' in most cases where config don't come from file but code

login
register
mail settings
Submitter Mads Kiilerich
Date March 19, 2014, 1:45 a.m.
Message ID <e036b9c6118260654fcd.1395193526@localhost.localdomain>
Download mbox | patch
Permalink /patch/3986/
State Accepted
Commit 49f2d5644f04c6675d9d2e08eceaffd9c1ff2f38
Headers show

Comments

Mads Kiilerich - March 19, 2014, 1:45 a.m.
# HG changeset patch
# User Mads Kiilerich <madski@unity3d.com>
# Date 1395193514 -3600
#      Wed Mar 19 02:45:14 2014 +0100
# Node ID e036b9c6118260654fcd567eb5653ec45bcc86a0
# Parent  aecee5b4ae61ae98a138583c63ce03a9e82084f0
config: set a 'source' in most cases where config don't come from file but code

Some extensions set configuration settings that showed up in 'hg showconfig
--debug' with 'none' as source. That was confusing.

Instead, they will now tell which extension they come from.

This change tries to be consistent and specify a source everywhere - also where
it perhaps is less relevant.
Siddharth Agarwal - March 19, 2014, 2:56 a.m.
On 03/18/2014 06:45 PM, Mads Kiilerich wrote:
> # HG changeset patch
> # User Mads Kiilerich <madski@unity3d.com>
> # Date 1395193514 -3600
> #      Wed Mar 19 02:45:14 2014 +0100
> # Node ID e036b9c6118260654fcd567eb5653ec45bcc86a0
> # Parent  aecee5b4ae61ae98a138583c63ce03a9e82084f0
> config: set a 'source' in most cases where config don't come from file but code
>
> Some extensions set configuration settings that showed up in 'hg showconfig
> --debug' with 'none' as source. That was confusing.
>
> Instead, they will now tell which extension they come from.

Most of these changes won't actually be seen by hg showconfig, would 
they? Since they only happen temporarily and are meant for certain code 
paths. In fact, for temporary config changes it would even be preferable 
to not set the source, especially because of patch 3.

Also, it really seems like this patch should be broken up into multiple 
ones.

>
> This change tries to be consistent and specify a source everywhere - also where
> it perhaps is less relevant.
>
> diff --git a/hgext/eol.py b/hgext/eol.py
> --- a/hgext/eol.py
> +++ b/hgext/eol.py
> @@ -151,7 +151,7 @@ class eolfile(object):
>           self.cfg = config.config()
>           # Our files should not be touched. The pattern must be
>           # inserted first override a '** = native' pattern.
> -        self.cfg.set('patterns', '.hg*', 'BIN')
> +        self.cfg.set('patterns', '.hg*', 'BIN', 'eol')
>           # We can then parse the user's patterns.
>           self.cfg.parse('.hgeol', data)
>   
> @@ -176,14 +176,14 @@ class eolfile(object):
>           for pattern, style in self.cfg.items('patterns'):
>               key = style.upper()
>               try:
> -                ui.setconfig('decode', pattern, self._decode[key])
> -                ui.setconfig('encode', pattern, self._encode[key])
> +                ui.setconfig('decode', pattern, self._decode[key], 'eol')
> +                ui.setconfig('encode', pattern, self._encode[key], 'eol')
>               except KeyError:
>                   ui.warn(_("ignoring unknown EOL style '%s' from %s\n")
>                           % (style, self.cfg.source('patterns', pattern)))
>           # eol.only-consistent can be specified in ~/.hgrc or .hgeol
>           for k, v in self.cfg.items('eol'):
> -            ui.setconfig('eol', k, v)
> +            ui.setconfig('eol', k, v, 'eol')
>   
>       def checkrev(self, repo, ctx, files):
>           failed = []
> @@ -261,7 +261,7 @@ def preupdate(ui, repo, hooktype, parent
>       return False
>   
>   def uisetup(ui):
> -    ui.setconfig('hooks', 'preupdate.eol', preupdate)
> +    ui.setconfig('hooks', 'preupdate.eol', preupdate, 'eol')
>   
>   def extsetup(ui):
>       try:
> @@ -280,7 +280,7 @@ def reposetup(ui, repo):
>       for name, fn in filters.iteritems():
>           repo.adddatafilter(name, fn)
>   
> -    ui.setconfig('patch', 'eol', 'auto')
> +    ui.setconfig('patch', 'eol', 'auto', 'eol')
>   
>       class eolrepo(repo.__class__):
>   
> diff --git a/hgext/histedit.py b/hgext/histedit.py
> --- a/hgext/histedit.py
> +++ b/hgext/histedit.py
> @@ -198,7 +198,8 @@ def commitfuncfor(repo, src):
>       def commitfunc(**kwargs):
>           phasebackup = repo.ui.backupconfig('phases', 'new-commit')
>           try:
> -            repo.ui.setconfig('phases', 'new-commit', phasemin)
> +            repo.ui.setconfig('phases', 'new-commit', phasemin,
> +                              'histedit')
>               extra = kwargs.get('extra', {}).copy()
>               extra['histedit_source'] = src.hex()
>               kwargs['extra'] = extra
> @@ -220,11 +221,12 @@ def applychanges(ui, repo, ctx, opts):
>       else:
>           try:
>               # ui.forcemerge is an internal variable, do not document
> -            repo.ui.setconfig('ui', 'forcemerge', opts.get('tool', ''))
> +            repo.ui.setconfig('ui', 'forcemerge', opts.get('tool', ''),
> +                              'histedit')
>               stats = mergemod.update(repo, ctx.node(), True, True, False,
>                                       ctx.p1().node())
>           finally:
> -            repo.ui.setconfig('ui', 'forcemerge', '')
> +            repo.ui.setconfig('ui', 'forcemerge', '', 'histedit')
>           repo.setparents(wcpar, node.nullid)
>           repo.dirstate.write()
>           # fix up dirstate for copies and renames
> @@ -375,7 +377,7 @@ def finishfold(ui, repo, ctx, oldctx, ne
>       phasebackup = repo.ui.backupconfig('phases', 'new-commit')
>       try:
>           phasemin = max(ctx.phase(), oldctx.phase())
> -        repo.ui.setconfig('phases', 'new-commit', phasemin)
> +        repo.ui.setconfig('phases', 'new-commit', phasemin, 'histedit')
>           n = collapse(repo, ctx, repo[newnode], commitopts)
>       finally:
>           repo.ui.restoreconfig(phasebackup)
> diff --git a/hgext/keyword.py b/hgext/keyword.py
> --- a/hgext/keyword.py
> +++ b/hgext/keyword.py
> @@ -385,10 +385,10 @@ def demo(ui, repo, *args, **opts):
>       tmpdir = tempfile.mkdtemp('', 'kwdemo.')
>       ui.note(_('creating temporary repository at %s\n') % tmpdir)
>       repo = localrepo.localrepository(repo.baseui, tmpdir, True)
> -    ui.setconfig('keyword', fn, '')
> +    ui.setconfig('keyword', fn, '', 'keyword')
>       svn = ui.configbool('keywordset', 'svn')
>       # explicitly set keywordset for demo output
> -    ui.setconfig('keywordset', 'svn', svn)
> +    ui.setconfig('keywordset', 'svn', svn, 'keyword')
>   
>       uikwmaps = ui.configitems('keywordmaps')
>       if args or opts.get('rcfile'):
> @@ -419,7 +419,7 @@ def demo(ui, repo, *args, **opts):
>           if uikwmaps:
>               ui.status(_('\tdisabling current template maps\n'))
>               for k, v in kwmaps.iteritems():
> -                ui.setconfig('keywordmaps', k, v)
> +                ui.setconfig('keywordmaps', k, v, 'keyword')
>       else:
>           ui.status(_('\n\tconfiguration using current keyword template maps\n'))
>           if uikwmaps:
> @@ -445,7 +445,7 @@ def demo(ui, repo, *args, **opts):
>           wlock.release()
>       for name, cmd in ui.configitems('hooks'):
>           if name.split('.', 1)[0].find('commit') > -1:
> -            repo.ui.setconfig('hooks', name, '')
> +            repo.ui.setconfig('hooks', name, '', 'keyword')
>       msg = _('hg keyword configuration and expansion example')
>       ui.note(("hg ci -m '%s'\n" % msg))
>       repo.commit(text=msg)
> diff --git a/hgext/largefiles/reposetup.py b/hgext/largefiles/reposetup.py
> --- a/hgext/largefiles/reposetup.py
> +++ b/hgext/largefiles/reposetup.py
> @@ -510,5 +510,6 @@ def reposetup(ui, repo):
>               repo.requirements.add('largefiles')
>               repo._writerequirements()
>   
> -    ui.setconfig('hooks', 'changegroup.lfiles', checkrequireslfiles)
> -    ui.setconfig('hooks', 'commit.lfiles', checkrequireslfiles)
> +    ui.setconfig('hooks', 'changegroup.lfiles', checkrequireslfiles,
> +                 'largefiles')
> +    ui.setconfig('hooks', 'commit.lfiles', checkrequireslfiles, 'largefiles')
> diff --git a/hgext/mq.py b/hgext/mq.py
> --- a/hgext/mq.py
> +++ b/hgext/mq.py
> @@ -304,7 +304,7 @@ def newcommit(repo, phase, *args, **kwar
>           backup = repo.ui.backupconfig('phases', 'new-commit')
>       try:
>           if phase is not None:
> -            repo.ui.setconfig('phases', 'new-commit', phase)
> +            repo.ui.setconfig('phases', 'new-commit', phase, 'mq')
>           return repo.commit(*args, **kwargs)
>       finally:
>           if phase is not None:
> diff --git a/hgext/pager.py b/hgext/pager.py
> --- a/hgext/pager.py
> +++ b/hgext/pager.py
> @@ -129,8 +129,8 @@ def uisetup(ui):
>                   if (always or auto and
>                       (cmd in attend or
>                        (cmd not in ignore and not attend))):
> -                    ui.setconfig('ui', 'formatted', ui.formatted())
> -                    ui.setconfig('ui', 'interactive', False)
> +                    ui.setconfig('ui', 'formatted', ui.formatted(), 'pager')
> +                    ui.setconfig('ui', 'interactive', False, 'pager')
>                       if util.safehasattr(signal, "SIGPIPE"):
>                           signal.signal(signal.SIGPIPE, signal.SIG_DFL)
>                       _runpager(ui, p)
> diff --git a/hgext/patchbomb.py b/hgext/patchbomb.py
> --- a/hgext/patchbomb.py
> +++ b/hgext/patchbomb.py
> @@ -546,11 +546,11 @@ def patchbomb(ui, repo, *revs, **opts):
>               if not sendmail:
>                   verifycert = ui.config('smtp', 'verifycert')
>                   if opts.get('insecure'):
> -                    ui.setconfig('smtp', 'verifycert', 'loose')
> +                    ui.setconfig('smtp', 'verifycert', 'loose', 'patchbomb')
>                   try:
>                       sendmail = mail.connect(ui, mbox=mbox)
>                   finally:
> -                    ui.setconfig('smtp', 'verifycert', verifycert)
> +                    ui.setconfig('smtp', 'verifycert', verifycert, 'patchbomb')
>               ui.status(_('sending '), subj, ' ...\n')
>               ui.progress(_('sending'), i, item=subj, total=len(msgs))
>               if not mbox:
> diff --git a/hgext/rebase.py b/hgext/rebase.py
> --- a/hgext/rebase.py
> +++ b/hgext/rebase.py
> @@ -330,14 +330,15 @@ def rebase(ui, repo, **opts):
>                       repo.ui.debug('resuming interrupted rebase\n')
>                   else:
>                       try:
> -                        ui.setconfig('ui', 'forcemerge', opts.get('tool', ''))
> +                        ui.setconfig('ui', 'forcemerge', opts.get('tool', ''),
> +                                     'rebase')
>                           stats = rebasenode(repo, rev, p1, state, collapsef)
>                           if stats and stats[3] > 0:
>                               raise error.InterventionRequired(
>                                   _('unresolved conflicts (see hg '
>                                     'resolve, then hg rebase --continue)'))
>                       finally:
> -                        ui.setconfig('ui', 'forcemerge', '')
> +                        ui.setconfig('ui', 'forcemerge', '', 'rebase')
>                   cmdutil.duplicatecopies(repo, rev, target)
>                   if not collapsef:
>                       newrev = concludenode(repo, rev, p1, p2, extrafn=extrafn,
> diff --git a/mercurial/bundlerepo.py b/mercurial/bundlerepo.py
> --- a/mercurial/bundlerepo.py
> +++ b/mercurial/bundlerepo.py
> @@ -193,7 +193,7 @@ class bundlerepository(localrepo.localre
>               self._tempparent = tempfile.mkdtemp()
>               localrepo.instance(ui, self._tempparent, 1)
>               localrepo.localrepository.__init__(self, ui, self._tempparent)
> -        self.ui.setconfig('phases', 'publish', False)
> +        self.ui.setconfig('phases', 'publish', False, 'bundlerepo')
>   
>           if path:
>               self._url = 'bundle:' + util.expandpath(path) + '+' + bundlename
> diff --git a/mercurial/cmdutil.py b/mercurial/cmdutil.py
> --- a/mercurial/cmdutil.py
> +++ b/mercurial/cmdutil.py
> @@ -1982,10 +1982,10 @@ def amend(ui, repo, commitfunc, old, ext
>                       commitphase = 'secret'
>                   else:
>                       commitphase = old.phase()
> -                repo.ui.setconfig('phases', 'new-commit', commitphase)
> +                repo.ui.setconfig('phases', 'new-commit', commitphase, 'amend')
>                   newid = repo.commitctx(new)
>               finally:
> -                repo.ui.setconfig('phases', 'new-commit', ph)
> +                repo.ui.setconfig('phases', 'new-commit', ph, 'amend')
>               if newid != old.node():
>                   # Reroute the working copy parent to the new changeset
>                   repo.setparents(newid, nullid)
> diff --git a/mercurial/commands.py b/mercurial/commands.py
> --- a/mercurial/commands.py
> +++ b/mercurial/commands.py
> @@ -465,7 +465,8 @@ def backout(ui, repo, node=None, rev=Non
>           rctx = scmutil.revsingle(repo, hex(parent))
>           if not opts.get('merge') and op1 != node:
>               try:
> -                ui.setconfig('ui', 'forcemerge', opts.get('tool', ''))
> +                ui.setconfig('ui', 'forcemerge', opts.get('tool', ''),
> +                             'backout')
>                   stats = mergemod.update(repo, parent, True, True, False,
>                                           node, False)
>                   repo.setparents(op1, op2)
> @@ -479,7 +480,7 @@ def backout(ui, repo, node=None, rev=Non
>                       ui.status(msg % short(node))
>                   return stats[3] > 0
>               finally:
> -                ui.setconfig('ui', 'forcemerge', '')
> +                ui.setconfig('ui', 'forcemerge', '', '')
>           else:
>               hg.clean(repo, node, show_stats=False)
>               repo.dirstate.setbranch(branch)
> @@ -507,10 +508,11 @@ def backout(ui, repo, node=None, rev=Non
>               ui.status(_('merging with changeset %s\n')
>                         % nice(repo.changelog.tip()))
>               try:
> -                ui.setconfig('ui', 'forcemerge', opts.get('tool', ''))
> +                ui.setconfig('ui', 'forcemerge', opts.get('tool', ''),
> +                             'backout')
>                   return hg.merge(repo, hex(repo.changelog.tip()))
>               finally:
> -                ui.setconfig('ui', 'forcemerge', '')
> +                ui.setconfig('ui', 'forcemerge', '', '')
>       finally:
>           wlock.release()
>       return 0
> @@ -1361,7 +1363,7 @@ def commit(ui, repo, *pats, **opts):
>           if opts.get('amend'):
>               raise util.Abort(_('cannot amend with --subrepos'))
>           # Let --subrepos on the command line override config setting.
> -        ui.setconfig('ui', 'commitsubrepos', True)
> +        ui.setconfig('ui', 'commitsubrepos', True, 'commit')
>   
>       # Save this for restoring it later
>       oldcommitphase = ui.config('phases', 'new-commit')
> @@ -1436,15 +1438,17 @@ def commit(ui, repo, *pats, **opts):
>           def commitfunc(ui, repo, message, match, opts):
>               try:
>                   if opts.get('secret'):
> -                    ui.setconfig('phases', 'new-commit', 'secret')
> +                    ui.setconfig('phases', 'new-commit', 'secret', 'commit')
>                       # Propagate to subrepos
> -                    repo.baseui.setconfig('phases', 'new-commit', 'secret')
> +                    repo.baseui.setconfig('phases', 'new-commit', 'secret',
> +                                          'commit')
>   
>                   return repo.commit(message, opts.get('user'), opts.get('date'),
>                                      match, editor=e, extra=extra)
>               finally:
> -                ui.setconfig('phases', 'new-commit', oldcommitphase)
> -                repo.baseui.setconfig('phases', 'new-commit', oldcommitphase)
> +                ui.setconfig('phases', 'new-commit', oldcommitphase, 'commit')
> +                repo.baseui.setconfig('phases', 'new-commit', oldcommitphase,
> +                                      'commit')
>   
>   
>           node = cmdutil.commit(ui, repo, commitfunc, pats, opts)
> @@ -3176,11 +3180,12 @@ def graft(ui, repo, *revs, **opts):
>                   # perform the graft merge with p1(rev) as 'ancestor'
>                   try:
>                       # ui.forcemerge is an internal variable, do not document
> -                    repo.ui.setconfig('ui', 'forcemerge', opts.get('tool', ''))
> +                    repo.ui.setconfig('ui', 'forcemerge', opts.get('tool', ''),
> +                                      'graft')
>                       stats = mergemod.update(repo, ctx.node(), True, True, False,
>                                               ctx.p1().node())
>                   finally:
> -                    repo.ui.setconfig('ui', 'forcemerge', '')
> +                    repo.ui.setconfig('ui', 'forcemerge', '', 'graft')
>                   # report any conflicts
>                   if stats and stats[3] > 0:
>                       # write out state for --continue
> @@ -4305,10 +4310,10 @@ def merge(ui, repo, node=None, **opts):
>   
>       try:
>           # ui.forcemerge is an internal variable, do not document
> -        repo.ui.setconfig('ui', 'forcemerge', opts.get('tool', ''))
> +        repo.ui.setconfig('ui', 'forcemerge', opts.get('tool', ''), 'merge')
>           return hg.merge(repo, node, force=opts.get('force'))
>       finally:
> -        ui.setconfig('ui', 'forcemerge', '')
> +        ui.setconfig('ui', 'forcemerge', '', 'merge')
>   
>   @command('outgoing|out',
>       [('f', 'force', None, _('run even when the destination is unrelated')),
> @@ -4688,7 +4693,7 @@ def push(ui, repo, dest=None, **opts):
>       """
>   
>       if opts.get('bookmark'):
> -        ui.setconfig('bookmarks', 'pushing', opts['bookmark'])
> +        ui.setconfig('bookmarks', 'pushing', opts['bookmark'], 'push')
>           for b in opts['bookmark']:
>               # translate -B options to -r so changesets get pushed
>               if b in repo._bookmarks:
> @@ -4964,11 +4969,12 @@ def resolve(ui, repo, *pats, **opts):
>   
>                   try:
>                       # resolve file
> -                    ui.setconfig('ui', 'forcemerge', opts.get('tool', ''))
> +                    ui.setconfig('ui', 'forcemerge', opts.get('tool', ''),
> +                                 'resolve')
>                       if ms.resolve(f, wctx):
>                           ret = 1
>                   finally:
> -                    ui.setconfig('ui', 'forcemerge', '')
> +                    ui.setconfig('ui', 'forcemerge', '', 'resolve')
>                       ms.commit()
>   
>                   # replace filemerge's .orig file with our resolve file
> @@ -5185,9 +5191,9 @@ def serve(ui, repo, **opts):
>           val = opts.get(o, '')
>           if val in (None, ''): # should check against default options instead
>               continue
> -        baseui.setconfig("web", o, val)
> +        baseui.setconfig("web", o, val, 'serve')
>           if repo and repo.ui != baseui:
> -            repo.ui.setconfig("web", o, val)
> +            repo.ui.setconfig("web", o, val, 'serve')
>   
>       o = opts.get('web_conf') or opts.get('webdir_conf')
>       if not o:
> diff --git a/mercurial/hg.py b/mercurial/hg.py
> --- a/mercurial/hg.py
> +++ b/mercurial/hg.py
> @@ -405,7 +405,7 @@ def clone(ui, peeropts, source, dest=Non
>               fp.write("default = %s\n" % defaulturl)
>               fp.close()
>   
> -            destrepo.ui.setconfig('paths', 'default', defaulturl)
> +            destrepo.ui.setconfig('paths', 'default', defaulturl, 'clone')
>   
>               if update:
>                   if update is not True:
> @@ -613,19 +613,19 @@ def remoteui(src, opts):
>       for o in 'ssh', 'remotecmd':
>           v = opts.get(o) or src.config('ui', o)
>           if v:
> -            dst.setconfig("ui", o, v)
> +            dst.setconfig("ui", o, v, 'copied')
>   
>       # copy bundle-specific options
>       r = src.config('bundle', 'mainreporoot')
>       if r:
> -        dst.setconfig('bundle', 'mainreporoot', r)
> +        dst.setconfig('bundle', 'mainreporoot', r, 'copied')
>   
>       # copy selected local settings to the remote ui
>       for sect in ('auth', 'hostfingerprints', 'http_proxy'):
>           for key, val in src.configitems(sect):
> -            dst.setconfig(sect, key, val)
> +            dst.setconfig(sect, key, val, 'copied')
>       v = src.config('web', 'cacerts')
>       if v:
> -        dst.setconfig('web', 'cacerts', util.expandpath(v))
> +        dst.setconfig('web', 'cacerts', util.expandpath(v), 'copied')
>   
>       return dst
> 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
> @@ -64,10 +64,10 @@ class hgweb(object):
>               r = repo
>   
>           r = self._getview(r)
> -        r.ui.setconfig('ui', 'report_untrusted', 'off')
> -        r.baseui.setconfig('ui', 'report_untrusted', 'off')
> -        r.ui.setconfig('ui', 'nontty', 'true')
> -        r.baseui.setconfig('ui', 'nontty', 'true')
> +        r.ui.setconfig('ui', 'report_untrusted', 'off', 'hgweb')
> +        r.baseui.setconfig('ui', 'report_untrusted', 'off', 'hgweb')
> +        r.ui.setconfig('ui', 'nontty', 'true', 'hgweb')
> +        r.baseui.setconfig('ui', 'nontty', 'true', 'hgweb')
>           self.repo = r
>           hook.redirect(True)
>           self.mtime = -1
> diff --git a/mercurial/hgweb/hgwebdir_mod.py b/mercurial/hgweb/hgwebdir_mod.py
> --- a/mercurial/hgweb/hgwebdir_mod.py
> +++ b/mercurial/hgweb/hgwebdir_mod.py
> @@ -96,8 +96,8 @@ class hgwebdir(object):
>               u = self.baseui.copy()
>           else:
>               u = ui.ui()
> -            u.setconfig('ui', 'report_untrusted', 'off')
> -            u.setconfig('ui', 'nontty', 'true')
> +            u.setconfig('ui', 'report_untrusted', 'off', 'hgwebdir')
> +            u.setconfig('ui', 'nontty', 'true', 'hgwebdir')
>   
>           if not isinstance(self.conf, (dict, list, tuple)):
>               map = {'paths': 'hgweb-paths'}
> diff --git a/mercurial/subrepo.py b/mercurial/subrepo.py
> --- a/mercurial/subrepo.py
> +++ b/mercurial/subrepo.py
> @@ -512,8 +512,8 @@ class hgsubrepo(abstractsubrepo):
>           for s, k in [('ui', 'commitsubrepos')]:
>               v = r.ui.config(s, k)
>               if v:
> -                self._repo.ui.setconfig(s, k, v)
> -        self._repo.ui.setconfig('ui', '_usedassubrepo', 'True')
> +                self._repo.ui.setconfig(s, k, v, 'subrepo')
> +        self._repo.ui.setconfig('ui', '_usedassubrepo', 'True', 'subrepo')
>           self._initrepo(r, state[0], create)
>   
>       def storeclean(self, path):
> @@ -594,7 +594,7 @@ class hgsubrepo(abstractsubrepo):
>               def addpathconfig(key, value):
>                   if value:
>                       fp.write('%s = %s\n' % (key, value))
> -                    self._repo.ui.setconfig('paths', key, value)
> +                    self._repo.ui.setconfig('paths', key, value, 'subrepo')
>   
>               defpath = _abssource(self._repo, abort=False)
>               defpushpath = _abssource(self._repo, True, abort=False)
> diff --git a/mercurial/unionrepo.py b/mercurial/unionrepo.py
> --- a/mercurial/unionrepo.py
> +++ b/mercurial/unionrepo.py
> @@ -170,7 +170,7 @@ class unionpeer(localrepo.localpeer):
>   class unionrepository(localrepo.localrepository):
>       def __init__(self, ui, path, path2):
>           localrepo.localrepository.__init__(self, ui, path)
> -        self.ui.setconfig('phases', 'publish', False)
> +        self.ui.setconfig('phases', 'publish', False, 'unionrepo')
>   
>           self._url = 'union:%s+%s' % (util.expandpath(path),
>                                        util.expandpath(path2))
> _______________________________________________
> Mercurial-devel mailing list
> Mercurial-devel@selenic.com
> https://urldefense.proofpoint.com/v1/url?u=http://selenic.com/mailman/listinfo/mercurial-devel&k=ZVNjlDMF0FElm4dQtryO4A%3D%3D%0A&r=%2FSg8Zq7yFXBOhOzuAORckw%3D%3D%0A&m=kMrNvoZkaMn73p26LaZgQiEeoNUY47U80jdJAzyTng8%3D%0A&s=dfab2af11502967553abae51f467a01b87388454a97850efe15ea2d1ce33bd11
Mads Kiilerich - March 19, 2014, 11:25 a.m.
On 03/19/2014 03:56 AM, Siddharth Agarwal wrote:
> On 03/18/2014 06:45 PM, Mads Kiilerich wrote:
>> # HG changeset patch
>> # User Mads Kiilerich <madski@unity3d.com>
>> # Date 1395193514 -3600
>> #      Wed Mar 19 02:45:14 2014 +0100
>> # Node ID e036b9c6118260654fcd567eb5653ec45bcc86a0
>> # Parent  aecee5b4ae61ae98a138583c63ce03a9e82084f0
>> config: set a 'source' in most cases where config don't come from 
>> file but code
>>
>> Some extensions set configuration settings that showed up in 'hg 
>> showconfig
>> --debug' with 'none' as source. That was confusing.
>>
>> Instead, they will now tell which extension they come from.
>
> Most of these changes won't actually be seen by hg showconfig, would 
> they? Since they only happen temporarily and are meant for certain 
> code paths. 

Correct. I opted for consistency instead of trying to figure which are 
relevant for common code paths.

When one part of the code temporarily sets a config value that another 
read then it is quite similar to using global variables. They can be 
hard tot race. It can be convenient for debugging to have some trace of 
where that value is coming form.

The cases I care about the most has been addressed in the previous 
patches ... but I think this one also adds some value. Also, the cost is 
pretty low.

> In fact, for temporary config changes it would even be preferable to 
> not set the source, especially because of patch 3.

Why? Some part of the code _is_ setting a config value. The value do 
thus have a source and it would be nice to know what the source is.

The most important feature of patch 3 is that fixconfig preserves the 
existing source. I consider patch 3 and 4 pretty much unrelated.

> Also, it really seems like this patch should be broken up into 
> multiple ones.

The patch do one thing. I do not think it would add any value to split 
it up - that would just make it harder to review and discuss.

But yes, there is some prior art in splitting patches up in smallest 
possible pieces. I can split it up in one patch per setting, source or 
file if that is the deal breaker.

/Mads
Matt Mackall - March 19, 2014, 5:44 p.m.
On Wed, 2014-03-19 at 12:25 +0100, Mads Kiilerich wrote:
> On 03/19/2014 03:56 AM, Siddharth Agarwal wrote:
> > On 03/18/2014 06:45 PM, Mads Kiilerich wrote:
> >> # HG changeset patch
> >> # User Mads Kiilerich <madski@unity3d.com>
> >> # Date 1395193514 -3600
> >> #      Wed Mar 19 02:45:14 2014 +0100
> >> # Node ID e036b9c6118260654fcd567eb5653ec45bcc86a0
> >> # Parent  aecee5b4ae61ae98a138583c63ce03a9e82084f0
> >> config: set a 'source' in most cases where config don't come from 
> >> file but code
> >>
> >> Some extensions set configuration settings that showed up in 'hg 
> >> showconfig
> >> --debug' with 'none' as source. That was confusing.
> >>
> >> Instead, they will now tell which extension they come from.
> >
> > Most of these changes won't actually be seen by hg showconfig, would 
> > they? Since they only happen temporarily and are meant for certain 
> > code paths. 
> 
> Correct. I opted for consistency instead of trying to figure which are 
> relevant for common code paths.
> 
> When one part of the code temporarily sets a config value that another 
> read then it is quite similar to using global variables. They can be 
> hard tot race. It can be convenient for debugging to have some trace of 
> where that value is coming form.
> 
> The cases I care about the most has been addressed in the previous 
> patches ... but I think this one also adds some value. Also, the cost is 
> pretty low.
> 
> > In fact, for temporary config changes it would even be preferable to 
> > not set the source, especially because of patch 3.
> 
> Why? Some part of the code _is_ setting a config value. The value do 
> thus have a source and it would be nice to know what the source is.
> 
> The most important feature of patch 3 is that fixconfig preserves the 
> existing source. I consider patch 3 and 4 pretty much unrelated.
> 
> > Also, it really seems like this patch should be broken up into 
> > multiple ones.
> 
> The patch do one thing. I do not think it would add any value to split 
> it up - that would just make it harder to review and discuss.

I'm ok with this. The patch has lots of very simple, very similar
changes. I can look at each one and judge that it does indeed match the
patch description in a couple seconds without scrolling back and forth
and straining my brain with a bunch of bookkeeping or
reverse-engineering. 

I've gone ahead and queued these, thanks.

Patch

diff --git a/hgext/eol.py b/hgext/eol.py
--- a/hgext/eol.py
+++ b/hgext/eol.py
@@ -151,7 +151,7 @@  class eolfile(object):
         self.cfg = config.config()
         # Our files should not be touched. The pattern must be
         # inserted first override a '** = native' pattern.
-        self.cfg.set('patterns', '.hg*', 'BIN')
+        self.cfg.set('patterns', '.hg*', 'BIN', 'eol')
         # We can then parse the user's patterns.
         self.cfg.parse('.hgeol', data)
 
@@ -176,14 +176,14 @@  class eolfile(object):
         for pattern, style in self.cfg.items('patterns'):
             key = style.upper()
             try:
-                ui.setconfig('decode', pattern, self._decode[key])
-                ui.setconfig('encode', pattern, self._encode[key])
+                ui.setconfig('decode', pattern, self._decode[key], 'eol')
+                ui.setconfig('encode', pattern, self._encode[key], 'eol')
             except KeyError:
                 ui.warn(_("ignoring unknown EOL style '%s' from %s\n")
                         % (style, self.cfg.source('patterns', pattern)))
         # eol.only-consistent can be specified in ~/.hgrc or .hgeol
         for k, v in self.cfg.items('eol'):
-            ui.setconfig('eol', k, v)
+            ui.setconfig('eol', k, v, 'eol')
 
     def checkrev(self, repo, ctx, files):
         failed = []
@@ -261,7 +261,7 @@  def preupdate(ui, repo, hooktype, parent
     return False
 
 def uisetup(ui):
-    ui.setconfig('hooks', 'preupdate.eol', preupdate)
+    ui.setconfig('hooks', 'preupdate.eol', preupdate, 'eol')
 
 def extsetup(ui):
     try:
@@ -280,7 +280,7 @@  def reposetup(ui, repo):
     for name, fn in filters.iteritems():
         repo.adddatafilter(name, fn)
 
-    ui.setconfig('patch', 'eol', 'auto')
+    ui.setconfig('patch', 'eol', 'auto', 'eol')
 
     class eolrepo(repo.__class__):
 
diff --git a/hgext/histedit.py b/hgext/histedit.py
--- a/hgext/histedit.py
+++ b/hgext/histedit.py
@@ -198,7 +198,8 @@  def commitfuncfor(repo, src):
     def commitfunc(**kwargs):
         phasebackup = repo.ui.backupconfig('phases', 'new-commit')
         try:
-            repo.ui.setconfig('phases', 'new-commit', phasemin)
+            repo.ui.setconfig('phases', 'new-commit', phasemin,
+                              'histedit')
             extra = kwargs.get('extra', {}).copy()
             extra['histedit_source'] = src.hex()
             kwargs['extra'] = extra
@@ -220,11 +221,12 @@  def applychanges(ui, repo, ctx, opts):
     else:
         try:
             # ui.forcemerge is an internal variable, do not document
-            repo.ui.setconfig('ui', 'forcemerge', opts.get('tool', ''))
+            repo.ui.setconfig('ui', 'forcemerge', opts.get('tool', ''),
+                              'histedit')
             stats = mergemod.update(repo, ctx.node(), True, True, False,
                                     ctx.p1().node())
         finally:
-            repo.ui.setconfig('ui', 'forcemerge', '')
+            repo.ui.setconfig('ui', 'forcemerge', '', 'histedit')
         repo.setparents(wcpar, node.nullid)
         repo.dirstate.write()
         # fix up dirstate for copies and renames
@@ -375,7 +377,7 @@  def finishfold(ui, repo, ctx, oldctx, ne
     phasebackup = repo.ui.backupconfig('phases', 'new-commit')
     try:
         phasemin = max(ctx.phase(), oldctx.phase())
-        repo.ui.setconfig('phases', 'new-commit', phasemin)
+        repo.ui.setconfig('phases', 'new-commit', phasemin, 'histedit')
         n = collapse(repo, ctx, repo[newnode], commitopts)
     finally:
         repo.ui.restoreconfig(phasebackup)
diff --git a/hgext/keyword.py b/hgext/keyword.py
--- a/hgext/keyword.py
+++ b/hgext/keyword.py
@@ -385,10 +385,10 @@  def demo(ui, repo, *args, **opts):
     tmpdir = tempfile.mkdtemp('', 'kwdemo.')
     ui.note(_('creating temporary repository at %s\n') % tmpdir)
     repo = localrepo.localrepository(repo.baseui, tmpdir, True)
-    ui.setconfig('keyword', fn, '')
+    ui.setconfig('keyword', fn, '', 'keyword')
     svn = ui.configbool('keywordset', 'svn')
     # explicitly set keywordset for demo output
-    ui.setconfig('keywordset', 'svn', svn)
+    ui.setconfig('keywordset', 'svn', svn, 'keyword')
 
     uikwmaps = ui.configitems('keywordmaps')
     if args or opts.get('rcfile'):
@@ -419,7 +419,7 @@  def demo(ui, repo, *args, **opts):
         if uikwmaps:
             ui.status(_('\tdisabling current template maps\n'))
             for k, v in kwmaps.iteritems():
-                ui.setconfig('keywordmaps', k, v)
+                ui.setconfig('keywordmaps', k, v, 'keyword')
     else:
         ui.status(_('\n\tconfiguration using current keyword template maps\n'))
         if uikwmaps:
@@ -445,7 +445,7 @@  def demo(ui, repo, *args, **opts):
         wlock.release()
     for name, cmd in ui.configitems('hooks'):
         if name.split('.', 1)[0].find('commit') > -1:
-            repo.ui.setconfig('hooks', name, '')
+            repo.ui.setconfig('hooks', name, '', 'keyword')
     msg = _('hg keyword configuration and expansion example')
     ui.note(("hg ci -m '%s'\n" % msg))
     repo.commit(text=msg)
diff --git a/hgext/largefiles/reposetup.py b/hgext/largefiles/reposetup.py
--- a/hgext/largefiles/reposetup.py
+++ b/hgext/largefiles/reposetup.py
@@ -510,5 +510,6 @@  def reposetup(ui, repo):
             repo.requirements.add('largefiles')
             repo._writerequirements()
 
-    ui.setconfig('hooks', 'changegroup.lfiles', checkrequireslfiles)
-    ui.setconfig('hooks', 'commit.lfiles', checkrequireslfiles)
+    ui.setconfig('hooks', 'changegroup.lfiles', checkrequireslfiles,
+                 'largefiles')
+    ui.setconfig('hooks', 'commit.lfiles', checkrequireslfiles, 'largefiles')
diff --git a/hgext/mq.py b/hgext/mq.py
--- a/hgext/mq.py
+++ b/hgext/mq.py
@@ -304,7 +304,7 @@  def newcommit(repo, phase, *args, **kwar
         backup = repo.ui.backupconfig('phases', 'new-commit')
     try:
         if phase is not None:
-            repo.ui.setconfig('phases', 'new-commit', phase)
+            repo.ui.setconfig('phases', 'new-commit', phase, 'mq')
         return repo.commit(*args, **kwargs)
     finally:
         if phase is not None:
diff --git a/hgext/pager.py b/hgext/pager.py
--- a/hgext/pager.py
+++ b/hgext/pager.py
@@ -129,8 +129,8 @@  def uisetup(ui):
                 if (always or auto and
                     (cmd in attend or
                      (cmd not in ignore and not attend))):
-                    ui.setconfig('ui', 'formatted', ui.formatted())
-                    ui.setconfig('ui', 'interactive', False)
+                    ui.setconfig('ui', 'formatted', ui.formatted(), 'pager')
+                    ui.setconfig('ui', 'interactive', False, 'pager')
                     if util.safehasattr(signal, "SIGPIPE"):
                         signal.signal(signal.SIGPIPE, signal.SIG_DFL)
                     _runpager(ui, p)
diff --git a/hgext/patchbomb.py b/hgext/patchbomb.py
--- a/hgext/patchbomb.py
+++ b/hgext/patchbomb.py
@@ -546,11 +546,11 @@  def patchbomb(ui, repo, *revs, **opts):
             if not sendmail:
                 verifycert = ui.config('smtp', 'verifycert')
                 if opts.get('insecure'):
-                    ui.setconfig('smtp', 'verifycert', 'loose')
+                    ui.setconfig('smtp', 'verifycert', 'loose', 'patchbomb')
                 try:
                     sendmail = mail.connect(ui, mbox=mbox)
                 finally:
-                    ui.setconfig('smtp', 'verifycert', verifycert)
+                    ui.setconfig('smtp', 'verifycert', verifycert, 'patchbomb')
             ui.status(_('sending '), subj, ' ...\n')
             ui.progress(_('sending'), i, item=subj, total=len(msgs))
             if not mbox:
diff --git a/hgext/rebase.py b/hgext/rebase.py
--- a/hgext/rebase.py
+++ b/hgext/rebase.py
@@ -330,14 +330,15 @@  def rebase(ui, repo, **opts):
                     repo.ui.debug('resuming interrupted rebase\n')
                 else:
                     try:
-                        ui.setconfig('ui', 'forcemerge', opts.get('tool', ''))
+                        ui.setconfig('ui', 'forcemerge', opts.get('tool', ''),
+                                     'rebase')
                         stats = rebasenode(repo, rev, p1, state, collapsef)
                         if stats and stats[3] > 0:
                             raise error.InterventionRequired(
                                 _('unresolved conflicts (see hg '
                                   'resolve, then hg rebase --continue)'))
                     finally:
-                        ui.setconfig('ui', 'forcemerge', '')
+                        ui.setconfig('ui', 'forcemerge', '', 'rebase')
                 cmdutil.duplicatecopies(repo, rev, target)
                 if not collapsef:
                     newrev = concludenode(repo, rev, p1, p2, extrafn=extrafn,
diff --git a/mercurial/bundlerepo.py b/mercurial/bundlerepo.py
--- a/mercurial/bundlerepo.py
+++ b/mercurial/bundlerepo.py
@@ -193,7 +193,7 @@  class bundlerepository(localrepo.localre
             self._tempparent = tempfile.mkdtemp()
             localrepo.instance(ui, self._tempparent, 1)
             localrepo.localrepository.__init__(self, ui, self._tempparent)
-        self.ui.setconfig('phases', 'publish', False)
+        self.ui.setconfig('phases', 'publish', False, 'bundlerepo')
 
         if path:
             self._url = 'bundle:' + util.expandpath(path) + '+' + bundlename
diff --git a/mercurial/cmdutil.py b/mercurial/cmdutil.py
--- a/mercurial/cmdutil.py
+++ b/mercurial/cmdutil.py
@@ -1982,10 +1982,10 @@  def amend(ui, repo, commitfunc, old, ext
                     commitphase = 'secret'
                 else:
                     commitphase = old.phase()
-                repo.ui.setconfig('phases', 'new-commit', commitphase)
+                repo.ui.setconfig('phases', 'new-commit', commitphase, 'amend')
                 newid = repo.commitctx(new)
             finally:
-                repo.ui.setconfig('phases', 'new-commit', ph)
+                repo.ui.setconfig('phases', 'new-commit', ph, 'amend')
             if newid != old.node():
                 # Reroute the working copy parent to the new changeset
                 repo.setparents(newid, nullid)
diff --git a/mercurial/commands.py b/mercurial/commands.py
--- a/mercurial/commands.py
+++ b/mercurial/commands.py
@@ -465,7 +465,8 @@  def backout(ui, repo, node=None, rev=Non
         rctx = scmutil.revsingle(repo, hex(parent))
         if not opts.get('merge') and op1 != node:
             try:
-                ui.setconfig('ui', 'forcemerge', opts.get('tool', ''))
+                ui.setconfig('ui', 'forcemerge', opts.get('tool', ''),
+                             'backout')
                 stats = mergemod.update(repo, parent, True, True, False,
                                         node, False)
                 repo.setparents(op1, op2)
@@ -479,7 +480,7 @@  def backout(ui, repo, node=None, rev=Non
                     ui.status(msg % short(node))
                 return stats[3] > 0
             finally:
-                ui.setconfig('ui', 'forcemerge', '')
+                ui.setconfig('ui', 'forcemerge', '', '')
         else:
             hg.clean(repo, node, show_stats=False)
             repo.dirstate.setbranch(branch)
@@ -507,10 +508,11 @@  def backout(ui, repo, node=None, rev=Non
             ui.status(_('merging with changeset %s\n')
                       % nice(repo.changelog.tip()))
             try:
-                ui.setconfig('ui', 'forcemerge', opts.get('tool', ''))
+                ui.setconfig('ui', 'forcemerge', opts.get('tool', ''),
+                             'backout')
                 return hg.merge(repo, hex(repo.changelog.tip()))
             finally:
-                ui.setconfig('ui', 'forcemerge', '')
+                ui.setconfig('ui', 'forcemerge', '', '')
     finally:
         wlock.release()
     return 0
@@ -1361,7 +1363,7 @@  def commit(ui, repo, *pats, **opts):
         if opts.get('amend'):
             raise util.Abort(_('cannot amend with --subrepos'))
         # Let --subrepos on the command line override config setting.
-        ui.setconfig('ui', 'commitsubrepos', True)
+        ui.setconfig('ui', 'commitsubrepos', True, 'commit')
 
     # Save this for restoring it later
     oldcommitphase = ui.config('phases', 'new-commit')
@@ -1436,15 +1438,17 @@  def commit(ui, repo, *pats, **opts):
         def commitfunc(ui, repo, message, match, opts):
             try:
                 if opts.get('secret'):
-                    ui.setconfig('phases', 'new-commit', 'secret')
+                    ui.setconfig('phases', 'new-commit', 'secret', 'commit')
                     # Propagate to subrepos
-                    repo.baseui.setconfig('phases', 'new-commit', 'secret')
+                    repo.baseui.setconfig('phases', 'new-commit', 'secret',
+                                          'commit')
 
                 return repo.commit(message, opts.get('user'), opts.get('date'),
                                    match, editor=e, extra=extra)
             finally:
-                ui.setconfig('phases', 'new-commit', oldcommitphase)
-                repo.baseui.setconfig('phases', 'new-commit', oldcommitphase)
+                ui.setconfig('phases', 'new-commit', oldcommitphase, 'commit')
+                repo.baseui.setconfig('phases', 'new-commit', oldcommitphase,
+                                      'commit')
 
 
         node = cmdutil.commit(ui, repo, commitfunc, pats, opts)
@@ -3176,11 +3180,12 @@  def graft(ui, repo, *revs, **opts):
                 # perform the graft merge with p1(rev) as 'ancestor'
                 try:
                     # ui.forcemerge is an internal variable, do not document
-                    repo.ui.setconfig('ui', 'forcemerge', opts.get('tool', ''))
+                    repo.ui.setconfig('ui', 'forcemerge', opts.get('tool', ''),
+                                      'graft')
                     stats = mergemod.update(repo, ctx.node(), True, True, False,
                                             ctx.p1().node())
                 finally:
-                    repo.ui.setconfig('ui', 'forcemerge', '')
+                    repo.ui.setconfig('ui', 'forcemerge', '', 'graft')
                 # report any conflicts
                 if stats and stats[3] > 0:
                     # write out state for --continue
@@ -4305,10 +4310,10 @@  def merge(ui, repo, node=None, **opts):
 
     try:
         # ui.forcemerge is an internal variable, do not document
-        repo.ui.setconfig('ui', 'forcemerge', opts.get('tool', ''))
+        repo.ui.setconfig('ui', 'forcemerge', opts.get('tool', ''), 'merge')
         return hg.merge(repo, node, force=opts.get('force'))
     finally:
-        ui.setconfig('ui', 'forcemerge', '')
+        ui.setconfig('ui', 'forcemerge', '', 'merge')
 
 @command('outgoing|out',
     [('f', 'force', None, _('run even when the destination is unrelated')),
@@ -4688,7 +4693,7 @@  def push(ui, repo, dest=None, **opts):
     """
 
     if opts.get('bookmark'):
-        ui.setconfig('bookmarks', 'pushing', opts['bookmark'])
+        ui.setconfig('bookmarks', 'pushing', opts['bookmark'], 'push')
         for b in opts['bookmark']:
             # translate -B options to -r so changesets get pushed
             if b in repo._bookmarks:
@@ -4964,11 +4969,12 @@  def resolve(ui, repo, *pats, **opts):
 
                 try:
                     # resolve file
-                    ui.setconfig('ui', 'forcemerge', opts.get('tool', ''))
+                    ui.setconfig('ui', 'forcemerge', opts.get('tool', ''),
+                                 'resolve')
                     if ms.resolve(f, wctx):
                         ret = 1
                 finally:
-                    ui.setconfig('ui', 'forcemerge', '')
+                    ui.setconfig('ui', 'forcemerge', '', 'resolve')
                     ms.commit()
 
                 # replace filemerge's .orig file with our resolve file
@@ -5185,9 +5191,9 @@  def serve(ui, repo, **opts):
         val = opts.get(o, '')
         if val in (None, ''): # should check against default options instead
             continue
-        baseui.setconfig("web", o, val)
+        baseui.setconfig("web", o, val, 'serve')
         if repo and repo.ui != baseui:
-            repo.ui.setconfig("web", o, val)
+            repo.ui.setconfig("web", o, val, 'serve')
 
     o = opts.get('web_conf') or opts.get('webdir_conf')
     if not o:
diff --git a/mercurial/hg.py b/mercurial/hg.py
--- a/mercurial/hg.py
+++ b/mercurial/hg.py
@@ -405,7 +405,7 @@  def clone(ui, peeropts, source, dest=Non
             fp.write("default = %s\n" % defaulturl)
             fp.close()
 
-            destrepo.ui.setconfig('paths', 'default', defaulturl)
+            destrepo.ui.setconfig('paths', 'default', defaulturl, 'clone')
 
             if update:
                 if update is not True:
@@ -613,19 +613,19 @@  def remoteui(src, opts):
     for o in 'ssh', 'remotecmd':
         v = opts.get(o) or src.config('ui', o)
         if v:
-            dst.setconfig("ui", o, v)
+            dst.setconfig("ui", o, v, 'copied')
 
     # copy bundle-specific options
     r = src.config('bundle', 'mainreporoot')
     if r:
-        dst.setconfig('bundle', 'mainreporoot', r)
+        dst.setconfig('bundle', 'mainreporoot', r, 'copied')
 
     # copy selected local settings to the remote ui
     for sect in ('auth', 'hostfingerprints', 'http_proxy'):
         for key, val in src.configitems(sect):
-            dst.setconfig(sect, key, val)
+            dst.setconfig(sect, key, val, 'copied')
     v = src.config('web', 'cacerts')
     if v:
-        dst.setconfig('web', 'cacerts', util.expandpath(v))
+        dst.setconfig('web', 'cacerts', util.expandpath(v), 'copied')
 
     return dst
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
@@ -64,10 +64,10 @@  class hgweb(object):
             r = repo
 
         r = self._getview(r)
-        r.ui.setconfig('ui', 'report_untrusted', 'off')
-        r.baseui.setconfig('ui', 'report_untrusted', 'off')
-        r.ui.setconfig('ui', 'nontty', 'true')
-        r.baseui.setconfig('ui', 'nontty', 'true')
+        r.ui.setconfig('ui', 'report_untrusted', 'off', 'hgweb')
+        r.baseui.setconfig('ui', 'report_untrusted', 'off', 'hgweb')
+        r.ui.setconfig('ui', 'nontty', 'true', 'hgweb')
+        r.baseui.setconfig('ui', 'nontty', 'true', 'hgweb')
         self.repo = r
         hook.redirect(True)
         self.mtime = -1
diff --git a/mercurial/hgweb/hgwebdir_mod.py b/mercurial/hgweb/hgwebdir_mod.py
--- a/mercurial/hgweb/hgwebdir_mod.py
+++ b/mercurial/hgweb/hgwebdir_mod.py
@@ -96,8 +96,8 @@  class hgwebdir(object):
             u = self.baseui.copy()
         else:
             u = ui.ui()
-            u.setconfig('ui', 'report_untrusted', 'off')
-            u.setconfig('ui', 'nontty', 'true')
+            u.setconfig('ui', 'report_untrusted', 'off', 'hgwebdir')
+            u.setconfig('ui', 'nontty', 'true', 'hgwebdir')
 
         if not isinstance(self.conf, (dict, list, tuple)):
             map = {'paths': 'hgweb-paths'}
diff --git a/mercurial/subrepo.py b/mercurial/subrepo.py
--- a/mercurial/subrepo.py
+++ b/mercurial/subrepo.py
@@ -512,8 +512,8 @@  class hgsubrepo(abstractsubrepo):
         for s, k in [('ui', 'commitsubrepos')]:
             v = r.ui.config(s, k)
             if v:
-                self._repo.ui.setconfig(s, k, v)
-        self._repo.ui.setconfig('ui', '_usedassubrepo', 'True')
+                self._repo.ui.setconfig(s, k, v, 'subrepo')
+        self._repo.ui.setconfig('ui', '_usedassubrepo', 'True', 'subrepo')
         self._initrepo(r, state[0], create)
 
     def storeclean(self, path):
@@ -594,7 +594,7 @@  class hgsubrepo(abstractsubrepo):
             def addpathconfig(key, value):
                 if value:
                     fp.write('%s = %s\n' % (key, value))
-                    self._repo.ui.setconfig('paths', key, value)
+                    self._repo.ui.setconfig('paths', key, value, 'subrepo')
 
             defpath = _abssource(self._repo, abort=False)
             defpushpath = _abssource(self._repo, True, abort=False)
diff --git a/mercurial/unionrepo.py b/mercurial/unionrepo.py
--- a/mercurial/unionrepo.py
+++ b/mercurial/unionrepo.py
@@ -170,7 +170,7 @@  class unionpeer(localrepo.localpeer):
 class unionrepository(localrepo.localrepository):
     def __init__(self, ui, path, path2):
         localrepo.localrepository.__init__(self, ui, path)
-        self.ui.setconfig('phases', 'publish', False)
+        self.ui.setconfig('phases', 'publish', False, 'unionrepo')
 
         self._url = 'union:%s+%s' % (util.expandpath(path),
                                      util.expandpath(path2))