comparison mercurial/ui.py @ 34351:0e4bed5c5c38 stable

ui: check for progress singleton when clearing progress bar (issue5684) A combination of wrapping `ui` and progress bars interrupted by exceptions can lead to the progress bar not being cleared when the exception error is printed. This results in corrupted-looking output like this: ``` updating [===============================> ] 1/2u nresolved conflicts (see hg resolve, then hg rebase --continue) ``` This is because in `ui._progclear`, we only check the local reference to the progress bar, not whether or not there is an instance of the singleton. When a progress bar is interrupted by an exception, the exception printing in `scmutil.callcatch` uses the original instance of the `ui` object, not the wrapped copy that has `_progbar` set. When consider whether or not to clear the progress bar, check for the existence of the singleton, rather than just whether or not we have a local reference to it. Differential Revision: https://phab.mercurial-scm.org/D743
author Mark Thomas <mbthomas@fb.com>
date Wed, 20 Sep 2017 09:55:52 -0700
parents cde4cfeb6e3e
children f61f5af5ed31
comparison
equal deleted inserted replaced
34197:fa4b3b666ca7 34351:0e4bed5c5c38
1479 return None 1479 return None
1480 return getprogbar(self) 1480 return getprogbar(self)
1481 1481
1482 def _progclear(self): 1482 def _progclear(self):
1483 """clear progress bar output if any. use it before any output""" 1483 """clear progress bar output if any. use it before any output"""
1484 if '_progbar' not in vars(self): # nothing loaded yet 1484 if not haveprogbar(): # nothing loaded yet
1485 return 1485 return
1486 if self._progbar is not None and self._progbar.printed: 1486 if self._progbar is not None and self._progbar.printed:
1487 self._progbar.clear() 1487 self._progbar.clear()
1488 1488
1489 def progress(self, topic, pos, item="", unit="", total=None): 1489 def progress(self, topic, pos, item="", unit="", total=None):
1783 if _progresssingleton is None: 1783 if _progresssingleton is None:
1784 # passing 'ui' object to the singleton is fishy, 1784 # passing 'ui' object to the singleton is fishy,
1785 # this is how the extension used to work but feel free to rework it. 1785 # this is how the extension used to work but feel free to rework it.
1786 _progresssingleton = progress.progbar(ui) 1786 _progresssingleton = progress.progbar(ui)
1787 return _progresssingleton 1787 return _progresssingleton
1788
1789 def haveprogbar():
1790 return _progresssingleton is not None