Mercurial > public > mercurial-scm > hg
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 |