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

Solomon Matthews smat at fb.com
Mon Jan 26 22:26:51 CST 2015


On 1/26/15, 12:00 PM, "Augie Fackler" <raf at durin42.com> wrote:


>On Fri, Jan 16, 2015 at 05:13:24PM -0800, Solomon Matthews wrote:
>> # 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
>
>I assume the goal for this unused variable is that progress printing
>moves off the main thread so it can update things like ETA even when
>we're in the middle of a complex operation?

Exactly. Including the variables here was the wrong call, I'll find some
way to break the rest of the change up more intelligibly after the freeze.

>
>> +        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
>>
>> _______________________________________________
>> Mercurial-devel mailing list
>> Mercurial-devel at selenic.com
>> http://selenic.com/mailman/listinfo/mercurial-devel



More information about the Mercurial-devel mailing list