progress: specify updatebar() function by constructor argument
authorYuya Nishihara <yuya@tcha.org>
Sun, 13 Jan 2019 14:36:45 +0900
changeset 41210 929999d963b8
parent 41209 b223fc1c6b4c
child 41211 57bece69d7be
progress: specify updatebar() function by constructor argument This makes it easy for ui extensions to intercept progress messages. It also seems slightly nicer in that scmutil.progress doesn't touch ui internals.
mercurial/scmutil.py
mercurial/ui.py
--- a/mercurial/scmutil.py	Sun Jan 13 14:21:35 2019 +0900
+++ b/mercurial/scmutil.py	Sun Jan 13 14:36:45 2019 +0900
@@ -1415,28 +1415,13 @@
                     **kwargs)
 
 class progress(object):
-    def __init__(self, ui, topic, unit="", total=None):
+    def __init__(self, ui, updatebar, topic, unit="", total=None):
         self.ui = ui
         self.pos = 0
         self.topic = topic
         self.unit = unit
         self.total = total
         self.debug = ui.configbool('progress', 'debug')
-        if getattr(ui._fmsgerr, 'structured', False):
-            # channel for machine-readable output with metadata, just send
-            # raw information
-            # TODO: consider porting some useful information (e.g. estimated
-            # time) from progbar. we might want to support update delay to
-            # reduce the cost of transferring progress messages.
-            def updatebar(topic, pos, item, unit, total):
-                ui._fmsgerr.write(None, type=b'progress', topic=topic,
-                                  pos=pos, item=item, unit=unit,
-                                  total=total)
-        elif ui._progbar is not None:
-            updatebar = ui._progbar.progress
-        else:
-            def updatebar(topic, pos, item, unit, total):
-                pass
         self._updatebar = updatebar
 
     def __enter__(self):
--- a/mercurial/ui.py	Sun Jan 13 14:21:35 2019 +0900
+++ b/mercurial/ui.py	Sun Jan 13 14:36:45 2019 +0900
@@ -1698,8 +1698,22 @@
             progress.complete()
 
     def makeprogress(self, topic, unit="", total=None):
-        '''exists only so low-level modules won't need to import scmutil'''
-        return scmutil.progress(self, topic, unit, total)
+        """Create a progress helper for the specified topic"""
+        if getattr(self._fmsgerr, 'structured', False):
+            # channel for machine-readable output with metadata, just send
+            # raw information
+            # TODO: consider porting some useful information (e.g. estimated
+            # time) from progbar. we might want to support update delay to
+            # reduce the cost of transferring progress messages.
+            def updatebar(topic, pos, item, unit, total):
+                self._fmsgerr.write(None, type=b'progress', topic=topic,
+                                    pos=pos, item=item, unit=unit, total=total)
+        elif self._progbar is not None:
+            updatebar = self._progbar.progress
+        else:
+            def updatebar(topic, pos, item, unit, total):
+                pass
+        return scmutil.progress(self, updatebar, topic, unit, total)
 
     def getlogger(self, name):
         """Returns a logger of the given name; or None if not registered"""