[PATCH v2] ui: add configoverride context manager
Augie Fackler
raf at durin42.com
Tue Nov 22 01:52:30 UTC 2016
> On Nov 21, 2016, at 7:24 PM, Kostia Balytskyi <ikostia at fb.com> wrote:
>
> # HG changeset patch
> # User Kostia Balytskyi <ikostia at fb.com>
> # Date 1479774146 28800
> # Mon Nov 21 16:22:26 2016 -0800
> # Node ID a7c57b059190f02a450667411d92d9a4862f6375
> # Parent 141b0d27e9e1e846215ead5314237536efc1a185
> ui: add configoverride context manager
Queued this, thanks.
>
> I feel like this idea might've been discussed before, so please
> feel free to point me to the right mailing list entry to read
> about why it should not be done.
>
> We have a common pattern of the following code:
> backup = ui.backupconfig(section, name)
> try:
> ui.setconfig(section, name, temporaryvalue, source)
> do_something()
> finally:
> ui.restoreconfig(backup)
>
> IMO, this looks better:
> with ui.configoverride({(section, name): temporaryvalue}, source):
> do_something()
>
> Especially this becomes more convenient when one has to backup multiple
> config values before doing something. In such case, adding a new value
> to backup requires codemod in three places.
>
> diff --git a/mercurial/ui.py b/mercurial/ui.py
> --- a/mercurial/ui.py
> +++ b/mercurial/ui.py
> @@ -7,6 +7,7 @@
>
> from __future__ import absolute_import
>
> +import contextlib
> import errno
> import getpass
> import inspect
> @@ -1193,6 +1194,23 @@ class ui(object):
> " update your code.)") % version
> self.develwarn(msg, stacklevel=2, config='deprec-warn')
>
> + @contextlib.contextmanager
> + def configoverride(self, overrides, source=""):
> + """Context manager for temporary config overrides
> + `overrides` must be a dict of the following structure:
> + {(section, name) : value}"""
> + backups = {}
> + for (section, name), value in overrides.items():
> + backups[(section, name)] = self.backupconfig(section, name)
> + self.setconfig(section, name, value, source)
> + yield
> + for __, backup in backups.items():
> + self.restoreconfig(backup)
> + # just restoring ui.quiet config to the previous value is not enough
> + # as it does not update ui.quiet class member
> + if ('ui', 'quiet') in overrides:
> + self.fixconfig(section='ui')
> +
> class paths(dict):
> """Represents a collection of paths and their configs.
>
> _______________________________________________
> Mercurial-devel mailing list
> Mercurial-devel at mercurial-scm.org
> https://www.mercurial-scm.org/mailman/listinfo/mercurial-devel
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 801 bytes
Desc: Message signed with OpenPGP using GPGMail
URL: <http://lists.mercurial-scm.org/pipermail/mercurial-devel/attachments/20161121/a3bd9548/attachment.asc>
More information about the Mercurial-devel
mailing list