# HG changeset patch # User Matt Harbison # Date 2020-01-17 18:29:47 # Node ID e2278581b1c6b257ae3769edf41277504bff83b6 # Parent a5e3f38407cb380a48dccfbf3a14a4a1b873f7c2 config: add a function to insert non-file based, but overridable settings This will be used in the next patch. Until relatively recently (473510bf0575), there was no official way for extensions to inject per-repo config data, so it probably makes sense that `ui.setconfig()` items are sticky, and not affected by loading more config files. But that makes it cumbersome if the extension wants to allow the data it might add to be overridden by any data in the local hgrc file. The only thing I could get to work was to load the local hgrc first, and then check if the source for the config item that should be overridden was *not* the local hgrc file name. But that's brittle because in addition to the file name, the source contains the line number, there are the usual '\' vs '/' platform differences, etc. Differential Revision: https://phab.mercurial-scm.org/D7933 diff --git a/mercurial/ui.py b/mercurial/ui.py --- a/mercurial/ui.py +++ b/mercurial/ui.py @@ -467,6 +467,25 @@ class ui(object): raise self.warn(_(b'ignored: %s\n') % stringutil.forcebytestr(inst)) + self._applyconfig(cfg, trusted, root) + + def applyconfig(self, configitems, source=b"", root=None): + """Add configitems from a non-file source. Unlike with ``setconfig()``, + they can be overridden by subsequent config file reads. The items are + in the same format as ``configoverride()``, namely a dict of the + following structures: {(section, name) : value} + + Typically this is used by extensions that inject themselves into the + config file load procedure by monkeypatching ``localrepo.loadhgrc()``. + """ + cfg = config.config() + + for (section, name), value in configitems.items(): + cfg.set(section, name, value, source) + + self._applyconfig(cfg, True, root) + + def _applyconfig(self, cfg, trusted, root): if self.plain(): for k in ( b'debug',