ui: use try..finally in configoverride
@contextmanager almost always have their "yield" inside a try..finally
block. This is because if the calling code inside the activated
context manager raises, the code after the "yield" won't get
executed. A "finally" block, however, will get executed in this
scenario.
--- a/mercurial/ui.py Sat Nov 26 09:07:11 2016 -0800
+++ b/mercurial/ui.py Sat Nov 26 09:14:41 2016 -0800
@@ -1201,16 +1201,18 @@
`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')
+ try:
+ for (section, name), value in overrides.items():
+ backups[(section, name)] = self.backupconfig(section, name)
+ self.setconfig(section, name, value, source)
+ yield
+ finally:
+ 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.