[PATCH 2 of 2] progress: split out elements of a pending commit to make diffs more readable

Solomon Matthews smat at fb.com
Fri Jan 16 19:13:24 CST 2015


# HG changeset patch
# User Solomon Matthews <smat at fb.com>
# Date 1421455913 28800
#      Fri Jan 16 16:51:53 2015 -0800
# Node ID 30518058824e89ee81ac88870897b3a81877d738
# Parent  3e58f60b9c419e275eb14087c76e1ab04feeb3ed
progress: split out elements of a pending commit to make diffs more readable

No behavioral changes intended

diff --git a/hgext/progress.py b/hgext/progress.py
--- a/hgext/progress.py
+++ b/hgext/progress.py
@@ -37,6 +37,8 @@
 
 import sys
 import time
+import threading
+import Queue
 
 from mercurial.i18n import _
 testedwith = 'internal'
@@ -90,6 +92,17 @@
 class progbar(object):
     def __init__(self, ui):
         self.ui = ui
+        self._refreshthread = None
+        self._refreshlock = threading.Lock()
+        # Queue for passing signals to the refresh thread
+        self._refreshqueue = Queue.Queue()
+        # Event to indicate that the refresh thread has finished its task(s)
+        self._refreshdone = threading.Event()
+        # Event to indicate that the refresh thread has drawn the progress bar
+        # after timing out (as opposed to having received a signal). Required
+        # for unit testing.
+        self.refreshbackgroundevent = threading.Event()
+
         self.resetstate()
 
     def resetstate(self):
@@ -100,6 +113,7 @@
         self.printed = False
         self.lastprint = time.time() + float(self.ui.config(
             'progress', 'delay', default=3))
+        self.curtopic = None
         self.lasttopic = None
         self.indetcount = 0
         self.refresh = float(self.ui.config(
@@ -227,8 +241,20 @@
             return _('%d %s/sec') % (delta / elapsed, unit)
         return ''
 
+    def _oktoprint(self, now):
+        '''Check if conditions are met to print - e.g. changedelay elapsed'''
+        if (self.lasttopic is None # first time we printed
+            # not a topic change
+            or self.curtopic == self.lasttopic
+            # it's been long enough we should print anyway
+            or now - self.lastprint >= self.changedelay):
+            return True
+        else:
+            return False
+
     def progress(self, topic, pos, item='', unit='', total=None):
         now = time.time()
+        self._refreshlock.acquire()
         try:
             if pos is None:
                 self.starttimes.pop(topic, None)
@@ -255,16 +281,13 @@
                     self.startvals[topic] = pos
                     self.topics.append(topic)
                 self.topicstates[topic] = pos, item, unit, total
+                self.curtopic = topic
                 if now - self.lastprint >= self.refresh and self.topics:
-                    if (self.lasttopic is None # first time we printed
-                        # not a topic change
-                        or topic == self.lasttopic
-                        # it's been long enough we should print anyway
-                        or now - self.lastprint >= self.changedelay):
+                    if self._oktoprint(now):
                         self.lastprint = now
                         self.show(now, topic, *self.topicstates[topic])
         finally:
-            pass
+            self._refreshlock.release()
 
 _singleton = None
 


More information about the Mercurial-devel mailing list