progress: move all logic altering the ui object logic in mercurial.ui
authorPierre-Yves David <pierre-yves.david@fb.com>
Sun, 07 Jun 2015 17:50:56 -0700
changeset 25499 0fa964d6fd48
parent 25498 7a5335ed7e1a
child 25500 00ecc894138d
progress: move all logic altering the ui object logic in mercurial.ui The ui object can take care of its progress object logic by itself. test-subrepo-recursion is modified because it is a bit sensitive to the "no progress bar" default. It will become unnecessary in the next step when progress will be on by default in core.
hgext/progress.py
mercurial/ui.py
tests/test-subrepo-recursion.t
--- a/hgext/progress.py	Sun Jun 07 17:26:34 2015 -0700
+++ b/hgext/progress.py	Sun Jun 07 17:50:56 2015 -0700
@@ -35,43 +35,9 @@
 characters.
 """
 
-from mercurial import progress
-from mercurial import ui as uimod
-
 def uisetup(ui):
-    class progressui(ui.__class__):
-        _progbar = None
-
-        def _quiet(self):
-            return self.debugflag or self.quiet
-
-        def progress(self, *args, **opts):
-            if not self._quiet():
-                self._progbar.progress(*args, **opts)
-            return super(progressui, self).progress(*args, **opts)
-
-        def write(self, *args, **opts):
-            if not self._quiet() and self._progbar.printed:
-                self._progbar.clear()
-            return super(progressui, self).write(*args, **opts)
-
-        def write_err(self, *args, **opts):
-            if not self._quiet() and self._progbar.printed:
-                self._progbar.clear()
-            return super(progressui, self).write_err(*args, **opts)
-
-    # Apps that derive a class from ui.ui() can use
-    # setconfig('progress', 'disable', 'True') to disable this extension
-    if ui.configbool('progress', 'disable'):
-        return
-    if progress.shouldprint(ui) and not ui.debugflag and not ui.quiet:
-        dval = object()
-        if getattr(ui, '_progbar', dval) is dval:
-            ui.__class__ = progressui
-            # we instantiate one globally-shared progress bar to avoid
-            # competing progress bars when multiple UI objects get created
-            if not progressui._progbar:
-                progressui._progbar = uimod.getprogbar(ui)
+    if ui.config('progress', 'disable', None) is None:
+        ui.setconfig('progress', 'disable', 'False', 'hgext-progress')
 
 def reposetup(ui, repo):
     uisetup(repo.ui)
--- a/mercurial/ui.py	Sun Jun 07 17:26:34 2015 -0700
+++ b/mercurial/ui.py	Sun Jun 07 17:50:56 2015 -0700
@@ -584,6 +584,7 @@
         "cmdname.type" is recommended. For example, status issues
         a label of "status.modified" for modified files.
         '''
+        self._progclear()
         if self._buffers:
             self._buffers[-1].extend([str(a) for a in args])
         else:
@@ -591,6 +592,7 @@
                 self.fout.write(str(a))
 
     def write_err(self, *args, **opts):
+        self._progclear()
         try:
             if self._bufferstates and self._bufferstates[-1][0]:
                 return self.write(*args, **opts)
@@ -886,6 +888,22 @@
                 os.environ.get("VISUAL") or
                 os.environ.get("EDITOR", editor))
 
+    @util.propertycache
+    def _progbar(self):
+        """setup the progbar singleton to the ui object"""
+        if (self.quiet or self.debugflag
+                or self.configbool('progress', 'disable', True)
+                or not progress.shouldprint(self)):
+            return None
+        return getprogbar(self)
+
+    def _progclear(self):
+        """clear progress bar output if any. use it before any output"""
+        if '_progbar' not in vars(self): # nothing loadef yet
+            return
+        if self._progbar is not None and self._progbar.printed:
+            self._progbar.clear()
+
     def progress(self, topic, pos, item="", unit="", total=None):
         '''show a progress message
 
@@ -902,7 +920,9 @@
         All topics should be marked closed by setting pos to None at
         termination.
         '''
-
+        if self._progbar is not None:
+            self._progbar.progress(topic, pos, item=item, unit=unit,
+                                   total=total)
         if pos is None or not self.configbool('progress', 'debug'):
             return
 
--- a/tests/test-subrepo-recursion.t	Sun Jun 07 17:26:34 2015 -0700
+++ b/tests/test-subrepo-recursion.t	Sun Jun 07 17:50:56 2015 -0700
@@ -258,6 +258,7 @@
   > [extensions]
   > progress =
   > [progress]
+  > disable=False
   > assume-tty = 1
   > delay = 0
   > # set changedelay really large so we don't see nested topics