D743: ui: check for progress singleton when clearing progress bar (issue5684)

mbthomas (Mark Thomas) phabricator at mercurial-scm.org
Wed Sep 20 12:16:39 UTC 2017


mbthomas created this revision.
Herald added a subscriber: mercurial-devel.
Herald added a reviewer: hg-reviewers.

REVISION SUMMARY
  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.

REPOSITORY
  rHG Mercurial

REVISION DETAIL
  https://phab.mercurial-scm.org/D743

AFFECTED FILES
  mercurial/ui.py

CHANGE DETAILS

diff --git a/mercurial/ui.py b/mercurial/ui.py
--- a/mercurial/ui.py
+++ b/mercurial/ui.py
@@ -1488,7 +1488,7 @@
 
     def _progclear(self):
         """clear progress bar output if any. use it before any output"""
-        if '_progbar' not in vars(self): # nothing loaded yet
+        if not haveprogbar(): # nothing loaded yet
             return
         if self._progbar is not None and self._progbar.printed:
             self._progbar.clear()
@@ -1792,3 +1792,6 @@
         # this is how the extension used to work but feel free to rework it.
         _progresssingleton = progress.progbar(ui)
     return _progresssingleton
+
+def haveprogbar():
+    return _progresssingleton is not None



To: mbthomas, #hg-reviewers
Cc: mercurial-devel


More information about the Mercurial-devel mailing list