[PATCH 3 of 3] progress: move all logic altering the ui object logic in mercurial.ui

Pierre-Yves David pierre-yves.david at ens-lyon.org
Tue Jun 9 12:58:29 CDT 2015


# HG changeset patch
# User Pierre-Yves David <pierre-yves.david at fb.com>
# Date 1433724656 25200
#      Sun Jun 07 17:50:56 2015 -0700
# Node ID f60301e56e0301a0c1b406a88810f6914dff74d6
# Parent  083b0e44c3cd57e342cd1799de05ec7387952835
progress: move all logic altering the ui object logic in mercurial.ui

The ui object can take care of its project object logic by itself.

test-subrepo-recursion is modified because it is a bit sensible to the "no
progress bar" default. It will become  unnecessary in the next step when
progress will be on by default in core.

diff --git a/hgext/progress.py b/hgext/progress.py
--- a/hgext/progress.py
+++ b/hgext/progress.py
@@ -33,45 +33,11 @@ estimate, speed, and item. item defaults
 the item, but this can be changed by adding either ``-<num>`` which
 would take the last num characters, or ``+<num>`` for the first num
 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)
diff --git a/mercurial/ui.py b/mercurial/ui.py
--- a/mercurial/ui.py
+++ b/mercurial/ui.py
@@ -582,17 +582,19 @@ class ui(object):
 
         When labeling output for a specific command, a label of
         "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:
             for a in args:
                 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)
             if not getattr(self.fout, 'closed', False):
                 self.fout.flush()
@@ -884,10 +886,26 @@ class ui(object):
         return (os.environ.get("HGEDITOR") or
                 self.config("ui", "editor") or
                 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
 
         With stock hg, this is simply a debug message that is hidden
         by default, but with extensions or GUI tools it may be
@@ -900,11 +918,13 @@ class ui(object):
         Multiple nested topics may be active at a time.
 
         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
 
         if unit:
             unit = ' ' + unit
diff --git a/tests/test-subrepo-recursion.t b/tests/test-subrepo-recursion.t
--- a/tests/test-subrepo-recursion.t
+++ b/tests/test-subrepo-recursion.t
@@ -256,10 +256,11 @@ Enable progress extension for archive te
   $ cp $HGRCPATH $HGRCPATH.no-progress
   $ cat >> $HGRCPATH <<EOF
   > [extensions]
   > progress =
   > [progress]
+  > disable=False
   > assume-tty = 1
   > delay = 0
   > # set changedelay really large so we don't see nested topics
   > changedelay = 30000
   > format = topic bar number


More information about the Mercurial-devel mailing list