diff mercurial/scmutil.py @ 41143:8cf92ca92bfe

progress: write ui.progress() in terms of ui.makeprogress() I think ui.makeprogress() should be the preferred interface and we should deprecate ui.progress(). All in-core callers already use ui.makeprogress(). Moving the logic to the scmutil.progress() will let us make further improvements. This seems to have sped up `hg perfprogress` from 1.92 s to 1.85 s, perhaps because we now skip the indirection of updating the progress bar via ui.progress(). Differential Revision: https://phab.mercurial-scm.org/D5527
author Martin von Zweigbergk <martinvonz@google.com>
date Mon, 07 Jan 2019 23:55:26 -0800
parents a714eee1ac28
children 7b80406b8271
line wrap: on
line diff
--- a/mercurial/scmutil.py	Tue Jan 08 22:07:47 2019 -0800
+++ b/mercurial/scmutil.py	Mon Jan 07 23:55:26 2019 -0800
@@ -1439,11 +1439,46 @@
         self.update(self.pos + step, item, total)
 
     def complete(self):
-        self.ui.progress(self.topic, None)
+        self.pos = None
+        self.unit = ""
+        self.total = None
+        self._print("")
 
     def _print(self, item):
-        self.ui.progress(self.topic, self.pos, item, self.unit,
-                         self.total)
+        if getattr(self.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.
+            self.ui._fmsgerr.write(None, type=b'progress', topic=self.topic,
+                                   pos=self.pos, item=item, unit=self.unit,
+                                   total=self.total)
+        elif self.ui._progbar is not None:
+            self.ui._progbar.progress(self.topic, self.pos, item=item,
+                                      unit=self.unit, total=self.total)
+
+            # Looking up progress.debug in tight loops is expensive. The value
+            # is cached on the progbar object and we can avoid the lookup in
+            # the common case where a progbar is active.
+            if self.pos is None or not self.ui._progbar.debug:
+                return
+
+        # Keep this logic in sync with above.
+        if self.pos is None or not self.ui.configbool('progress', 'debug'):
+            return
+
+        if self.unit:
+            unit = ' ' + self.unit
+        if item:
+            item = ' ' + item
+
+        if self.total:
+            pct = 100.0 * self.pos / self.total
+            self.ui.debug('%s:%s %d/%d%s (%4.2f%%)\n'
+                       % (self.topic, item, self.pos, self.total, unit, pct))
+        else:
+            self.ui.debug('%s:%s %d%s\n' % (self.topic, item, self.pos, unit))
 
 def gdinitconfig(ui):
     """helper function to know if a repo should be created as general delta