hgext/progress.py
author Pierre-Yves David <pierre-yves.david@fb.com>
Wed, 27 May 2015 23:48:54 -0700
changeset 25484 a5192774e925
parent 25482 95f490136e75
child 25497 93b8b0049932
permissions -rw-r--r--
bundle2: introduce a PushkeyFail error to abort unbundle on pushkey error The pushkey code is generic and the server side has little context on what the client is trying to achieve. Generating interesting error messages server side would be challenging. Instead we introduce a dedicated exception that carries more data. In particular, it carries the id of the part which failed that will allow clients to display custom error messages depending on the part intent. The processing and transfer-over-the-wire of this exception is to be implemented in coming changesets.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
10434
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
     1
# progress.py show progress bars for some actions
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
     2
#
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
     3
# Copyright (C) 2010 Augie Fackler <durin42@gmail.com>
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
     4
#
15772
83a140752239 progress: Use the same GPL boilerplate as most hg files
Augie Fackler <durin42@gmail.com>
parents: 15662
diff changeset
     5
# This software may be used and distributed according to the terms of the
83a140752239 progress: Use the same GPL boilerplate as most hg files
Augie Fackler <durin42@gmail.com>
parents: 15662
diff changeset
     6
# GNU General Public License version 2 or any later version.
10434
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
     7
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
     8
"""show progress bars for some actions
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
     9
10450
b4fd900569b1 progress: fix description
timeless <timeless@mozdev.org>
parents: 10441
diff changeset
    10
This extension uses the progress information logged by hg commands
b4fd900569b1 progress: fix description
timeless <timeless@mozdev.org>
parents: 10441
diff changeset
    11
to draw progress bars that are as informative as possible. Some progress
10434
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
    12
bars only offer indeterminate information, while others have a definite
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
    13
end point.
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
    14
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
    15
The following settings are available::
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
    16
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
    17
  [progress]
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
    18
  delay = 3 # number of seconds (float) before showing the progress bar
14838
5d261fd00446 progress: add a changedelay to prevent parallel topics from flapping (issue2698)
Augie Fackler <durin42@gmail.com>
parents: 14837
diff changeset
    19
  changedelay = 1 # changedelay: minimum delay before showing a new topic.
5d261fd00446 progress: add a changedelay to prevent parallel topics from flapping (issue2698)
Augie Fackler <durin42@gmail.com>
parents: 14837
diff changeset
    20
                  # If set to less than 3 * refresh, that value will
5d261fd00446 progress: add a changedelay to prevent parallel topics from flapping (issue2698)
Augie Fackler <durin42@gmail.com>
parents: 14837
diff changeset
    21
                  # be used instead.
10434
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
    22
  refresh = 0.1 # time in seconds between refreshes of the progress bar
13148
ab5fcc473fd1 progress: include time estimate as part of the default progress format
Augie Fackler <durin42@gmail.com>
parents: 13147
diff changeset
    23
  format = topic bar number estimate # format of the progress bar
10434
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
    24
  width = <none> # if set, the maximum width of the progress information
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
    25
                 # (that is, min(width, term width) will be used)
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
    26
  clear-complete = True # clear the progress bar after it's done
10656
f6ee02933af9 progress: document progress.disable config option
Augie Fackler <durin42@gmail.com>
parents: 10594
diff changeset
    27
  disable = False # if true, don't show a progress bar
10788
ca6ba6cac6cd progress: use stderr instead of stdout; check stderr.isatty()
Augie Fackler <durin42@gmail.com>
parents: 10656
diff changeset
    28
  assume-tty = False # if true, ALWAYS show a progress bar, unless
ca6ba6cac6cd progress: use stderr instead of stdout; check stderr.isatty()
Augie Fackler <durin42@gmail.com>
parents: 10656
diff changeset
    29
                     # disable is given
10434
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
    30
13147
082f5be788d9 progress: only show time estimate when progress format contains 'estimate'
Augie Fackler <durin42@gmail.com>
parents: 13146
diff changeset
    31
Valid entries for the format field are topic, bar, number, unit,
14280
98e4d3914c2e progress: add speed format
Martin Geisler <mg@aragost.com>
parents: 14247
diff changeset
    32
estimate, speed, and item. item defaults to the last 20 characters of
98e4d3914c2e progress: add speed format
Martin Geisler <mg@aragost.com>
parents: 14247
diff changeset
    33
the item, but this can be changed by adding either ``-<num>`` which
98e4d3914c2e progress: add speed format
Martin Geisler <mg@aragost.com>
parents: 14247
diff changeset
    34
would take the last num characters, or ``+<num>`` for the first num
13147
082f5be788d9 progress: only show time estimate when progress format contains 'estimate'
Augie Fackler <durin42@gmail.com>
parents: 13146
diff changeset
    35
characters.
10434
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
    36
"""
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
    37
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
    38
import sys
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
    39
import time
23908
5502bd79d052 progress: add a lock to prepare for introducing a thread
Solomon Matthews <smat@fb.com>
parents: 23907
diff changeset
    40
import threading
10434
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
    41
13131
c9ae7e096994 progress: Add estimated time remaining for long tasks
timeless <timeless@gmail.com>
parents: 13130
diff changeset
    42
from mercurial.i18n import _
25186
80c5b2666a96 extensions: document that `testedwith = 'internal'` is special
Augie Fackler <augie@google.com>
parents: 23908
diff changeset
    43
# Note for extension authors: ONLY specify testedwith = 'internal' for
80c5b2666a96 extensions: document that `testedwith = 'internal'` is special
Augie Fackler <augie@google.com>
parents: 23908
diff changeset
    44
# extensions which SHIP WITH MERCURIAL. Non-mainline extensions should
80c5b2666a96 extensions: document that `testedwith = 'internal'` is special
Augie Fackler <augie@google.com>
parents: 23908
diff changeset
    45
# be specifying the version(s) of Mercurial they are tested with, or
80c5b2666a96 extensions: document that `testedwith = 'internal'` is special
Augie Fackler <augie@google.com>
parents: 23908
diff changeset
    46
# leave the attribute unspecified.
16743
38caf405d010 hgext: mark all first-party extensions as such
Augie Fackler <raf@durin42.com>
parents: 16676
diff changeset
    47
testedwith = 'internal'
10434
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
    48
21859
be4270d27a7e progress: use 'encoding.trim' to trim output line correctly
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19619
diff changeset
    49
from mercurial import encoding
be4270d27a7e progress: use 'encoding.trim' to trim output line correctly
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19619
diff changeset
    50
10434
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
    51
def spacejoin(*args):
10452
59f8fff4f887 progress: simplify spacejoin()
Brodie Rao <me+hg@dackz.net>
parents: 10450
diff changeset
    52
    return ' '.join(s for s in args if s)
10434
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
    53
11458
ec21d91c79b3 progress: check stderr.isatty() before each print
Augie Fackler <durin42@gmail.com>
parents: 10891
diff changeset
    54
def shouldprint(ui):
19404
b4744c3b991e progress: respect HGPLAIN
Matt Mackall <mpm@selenic.com>
parents: 16753
diff changeset
    55
    return not ui.plain() and (ui._isatty(sys.stderr) or
b4744c3b991e progress: respect HGPLAIN
Matt Mackall <mpm@selenic.com>
parents: 16753
diff changeset
    56
                               ui.configbool('progress', 'assume-tty'))
11458
ec21d91c79b3 progress: check stderr.isatty() before each print
Augie Fackler <durin42@gmail.com>
parents: 10891
diff changeset
    57
13132
24e3349cba8e progress: refactor for readability and show XXs instead of 0mXXs.
Augie Fackler <durin42@gmail.com>
parents: 13131
diff changeset
    58
def fmtremaining(seconds):
24e3349cba8e progress: refactor for readability and show XXs instead of 0mXXs.
Augie Fackler <durin42@gmail.com>
parents: 13131
diff changeset
    59
    if seconds < 60:
13139
f4dd6aa16805 progress: explain format strings to translators
Martin Geisler <mg@aragost.com>
parents: 13132
diff changeset
    60
        # i18n: format XX seconds as "XXs"
13132
24e3349cba8e progress: refactor for readability and show XXs instead of 0mXXs.
Augie Fackler <durin42@gmail.com>
parents: 13131
diff changeset
    61
        return _("%02ds") % (seconds)
24e3349cba8e progress: refactor for readability and show XXs instead of 0mXXs.
Augie Fackler <durin42@gmail.com>
parents: 13131
diff changeset
    62
    minutes = seconds // 60
24e3349cba8e progress: refactor for readability and show XXs instead of 0mXXs.
Augie Fackler <durin42@gmail.com>
parents: 13131
diff changeset
    63
    if minutes < 60:
24e3349cba8e progress: refactor for readability and show XXs instead of 0mXXs.
Augie Fackler <durin42@gmail.com>
parents: 13131
diff changeset
    64
        seconds -= minutes * 60
13139
f4dd6aa16805 progress: explain format strings to translators
Martin Geisler <mg@aragost.com>
parents: 13132
diff changeset
    65
        # i18n: format X minutes and YY seconds as "XmYYs"
13132
24e3349cba8e progress: refactor for readability and show XXs instead of 0mXXs.
Augie Fackler <durin42@gmail.com>
parents: 13131
diff changeset
    66
        return _("%dm%02ds") % (minutes, seconds)
24e3349cba8e progress: refactor for readability and show XXs instead of 0mXXs.
Augie Fackler <durin42@gmail.com>
parents: 13131
diff changeset
    67
    # we're going to ignore seconds in this case
24e3349cba8e progress: refactor for readability and show XXs instead of 0mXXs.
Augie Fackler <durin42@gmail.com>
parents: 13131
diff changeset
    68
    minutes += 1
24e3349cba8e progress: refactor for readability and show XXs instead of 0mXXs.
Augie Fackler <durin42@gmail.com>
parents: 13131
diff changeset
    69
    hours = minutes // 60
24e3349cba8e progress: refactor for readability and show XXs instead of 0mXXs.
Augie Fackler <durin42@gmail.com>
parents: 13131
diff changeset
    70
    minutes -= hours * 60
13236
3f299f5d9a29 progress: handle days, weeks and years
timeless <timeless@gmail.com>
parents: 13154
diff changeset
    71
    if hours < 30:
3f299f5d9a29 progress: handle days, weeks and years
timeless <timeless@gmail.com>
parents: 13154
diff changeset
    72
        # i18n: format X hours and YY minutes as "XhYYm"
3f299f5d9a29 progress: handle days, weeks and years
timeless <timeless@gmail.com>
parents: 13154
diff changeset
    73
        return _("%dh%02dm") % (hours, minutes)
3f299f5d9a29 progress: handle days, weeks and years
timeless <timeless@gmail.com>
parents: 13154
diff changeset
    74
    # we're going to ignore minutes in this case
3f299f5d9a29 progress: handle days, weeks and years
timeless <timeless@gmail.com>
parents: 13154
diff changeset
    75
    hours += 1
3f299f5d9a29 progress: handle days, weeks and years
timeless <timeless@gmail.com>
parents: 13154
diff changeset
    76
    days = hours // 24
3f299f5d9a29 progress: handle days, weeks and years
timeless <timeless@gmail.com>
parents: 13154
diff changeset
    77
    hours -= days * 24
3f299f5d9a29 progress: handle days, weeks and years
timeless <timeless@gmail.com>
parents: 13154
diff changeset
    78
    if days < 15:
3f299f5d9a29 progress: handle days, weeks and years
timeless <timeless@gmail.com>
parents: 13154
diff changeset
    79
        # i18n: format X days and YY hours as "XdYYh"
3f299f5d9a29 progress: handle days, weeks and years
timeless <timeless@gmail.com>
parents: 13154
diff changeset
    80
        return _("%dd%02dh") % (days, hours)
3f299f5d9a29 progress: handle days, weeks and years
timeless <timeless@gmail.com>
parents: 13154
diff changeset
    81
    # we're going to ignore hours in this case
3f299f5d9a29 progress: handle days, weeks and years
timeless <timeless@gmail.com>
parents: 13154
diff changeset
    82
    days += 1
3f299f5d9a29 progress: handle days, weeks and years
timeless <timeless@gmail.com>
parents: 13154
diff changeset
    83
    weeks = days // 7
3f299f5d9a29 progress: handle days, weeks and years
timeless <timeless@gmail.com>
parents: 13154
diff changeset
    84
    days -= weeks * 7
3f299f5d9a29 progress: handle days, weeks and years
timeless <timeless@gmail.com>
parents: 13154
diff changeset
    85
    if weeks < 55:
3f299f5d9a29 progress: handle days, weeks and years
timeless <timeless@gmail.com>
parents: 13154
diff changeset
    86
        # i18n: format X weeks and YY days as "XwYYd"
3f299f5d9a29 progress: handle days, weeks and years
timeless <timeless@gmail.com>
parents: 13154
diff changeset
    87
        return _("%dw%02dd") % (weeks, days)
3f299f5d9a29 progress: handle days, weeks and years
timeless <timeless@gmail.com>
parents: 13154
diff changeset
    88
    # we're going to ignore days and treat a year as 52 weeks
3f299f5d9a29 progress: handle days, weeks and years
timeless <timeless@gmail.com>
parents: 13154
diff changeset
    89
    weeks += 1
3f299f5d9a29 progress: handle days, weeks and years
timeless <timeless@gmail.com>
parents: 13154
diff changeset
    90
    years = weeks // 52
3f299f5d9a29 progress: handle days, weeks and years
timeless <timeless@gmail.com>
parents: 13154
diff changeset
    91
    weeks -= years * 52
3f299f5d9a29 progress: handle days, weeks and years
timeless <timeless@gmail.com>
parents: 13154
diff changeset
    92
    # i18n: format X years and YY weeks as "XyYYw"
3f299f5d9a29 progress: handle days, weeks and years
timeless <timeless@gmail.com>
parents: 13154
diff changeset
    93
    return _("%dy%02dw") % (years, weeks)
13132
24e3349cba8e progress: refactor for readability and show XXs instead of 0mXXs.
Augie Fackler <durin42@gmail.com>
parents: 13131
diff changeset
    94
10434
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
    95
class progbar(object):
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
    96
    def __init__(self, ui):
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
    97
        self.ui = ui
23908
5502bd79d052 progress: add a lock to prepare for introducing a thread
Solomon Matthews <smat@fb.com>
parents: 23907
diff changeset
    98
        self._refreshlock = threading.Lock()
10434
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
    99
        self.resetstate()
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
   100
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
   101
    def resetstate(self):
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
   102
        self.topics = []
13130
f139f34ba330 progress: react more reasonably to nested progress topics
Augie Fackler <durin42@gmail.com>
parents: 12689
diff changeset
   103
        self.topicstates = {}
13131
c9ae7e096994 progress: Add estimated time remaining for long tasks
timeless <timeless@gmail.com>
parents: 13130
diff changeset
   104
        self.starttimes = {}
c9ae7e096994 progress: Add estimated time remaining for long tasks
timeless <timeless@gmail.com>
parents: 13130
diff changeset
   105
        self.startvals = {}
10434
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
   106
        self.printed = False
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
   107
        self.lastprint = time.time() + float(self.ui.config(
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
   108
            'progress', 'delay', default=3))
23906
e0ae0a4e4c7b progress: move current topic to member variable
Solomon Matthews <smat@fb.com>
parents: 23905
diff changeset
   109
        self.curtopic = None
14838
5d261fd00446 progress: add a changedelay to prevent parallel topics from flapping (issue2698)
Augie Fackler <durin42@gmail.com>
parents: 14837
diff changeset
   110
        self.lasttopic = None
10434
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
   111
        self.indetcount = 0
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
   112
        self.refresh = float(self.ui.config(
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
   113
            'progress', 'refresh', default=0.1))
14838
5d261fd00446 progress: add a changedelay to prevent parallel topics from flapping (issue2698)
Augie Fackler <durin42@gmail.com>
parents: 14837
diff changeset
   114
        self.changedelay = max(3 * self.refresh,
5d261fd00446 progress: add a changedelay to prevent parallel topics from flapping (issue2698)
Augie Fackler <durin42@gmail.com>
parents: 14837
diff changeset
   115
                               float(self.ui.config(
5d261fd00446 progress: add a changedelay to prevent parallel topics from flapping (issue2698)
Augie Fackler <durin42@gmail.com>
parents: 14837
diff changeset
   116
                                   'progress', 'changedelay', default=1)))
10434
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
   117
        self.order = self.ui.configlist(
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
   118
            'progress', 'format',
13148
ab5fcc473fd1 progress: include time estimate as part of the default progress format
Augie Fackler <durin42@gmail.com>
parents: 13147
diff changeset
   119
            default=['topic', 'bar', 'number', 'estimate'])
10434
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
   120
13131
c9ae7e096994 progress: Add estimated time remaining for long tasks
timeless <timeless@gmail.com>
parents: 13130
diff changeset
   121
    def show(self, now, topic, pos, item, unit, total):
11458
ec21d91c79b3 progress: check stderr.isatty() before each print
Augie Fackler <durin42@gmail.com>
parents: 10891
diff changeset
   122
        if not shouldprint(self.ui):
ec21d91c79b3 progress: check stderr.isatty() before each print
Augie Fackler <durin42@gmail.com>
parents: 10891
diff changeset
   123
            return
10434
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
   124
        termwidth = self.width()
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
   125
        self.printed = True
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
   126
        head = ''
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
   127
        needprogress = False
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
   128
        tail = ''
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
   129
        for indicator in self.order:
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
   130
            add = ''
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
   131
            if indicator == 'topic':
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
   132
                add = topic
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
   133
            elif indicator == 'number':
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
   134
                if total:
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
   135
                    add = ('% ' + str(len(str(total))) +
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
   136
                           's/%s') % (pos, total)
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
   137
                else:
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
   138
                    add = str(pos)
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
   139
            elif indicator.startswith('item') and item:
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
   140
                slice = 'end'
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
   141
                if '-' in indicator:
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
   142
                    wid = int(indicator.split('-')[1])
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
   143
                elif '+' in indicator:
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
   144
                    slice = 'beginning'
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
   145
                    wid = int(indicator.split('+')[1])
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
   146
                else:
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
   147
                    wid = 20
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
   148
                if slice == 'end':
21862
ba7f75e7f4e5 progress: use 'encoding.trim' to trim items in output line correctly
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 21860
diff changeset
   149
                    add = encoding.trim(item, wid, leftside=True)
10434
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
   150
                else:
21862
ba7f75e7f4e5 progress: use 'encoding.trim' to trim items in output line correctly
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 21860
diff changeset
   151
                    add = encoding.trim(item, wid)
21863
f9c91c638378 progress: use 'encoding.colwidth' to get column width of items correctly
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 21862
diff changeset
   152
                add += (wid - encoding.colwidth(add)) * ' '
10434
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
   153
            elif indicator == 'bar':
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
   154
                add = ''
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
   155
                needprogress = True
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
   156
            elif indicator == 'unit' and unit:
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
   157
                add = unit
13147
082f5be788d9 progress: only show time estimate when progress format contains 'estimate'
Augie Fackler <durin42@gmail.com>
parents: 13146
diff changeset
   158
            elif indicator == 'estimate':
082f5be788d9 progress: only show time estimate when progress format contains 'estimate'
Augie Fackler <durin42@gmail.com>
parents: 13146
diff changeset
   159
                add = self.estimate(topic, pos, total, now)
14280
98e4d3914c2e progress: add speed format
Martin Geisler <mg@aragost.com>
parents: 14247
diff changeset
   160
            elif indicator == 'speed':
98e4d3914c2e progress: add speed format
Martin Geisler <mg@aragost.com>
parents: 14247
diff changeset
   161
                add = self.speed(topic, pos, unit, now)
10434
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
   162
            if not needprogress:
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
   163
                head = spacejoin(head, add)
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
   164
            else:
13146
43575c67add3 progress: fix adding format elements after the progress bar
Augie Fackler <durin42@gmail.com>
parents: 13139
diff changeset
   165
                tail = spacejoin(tail, add)
10434
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
   166
        if needprogress:
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
   167
            used = 0
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
   168
            if head:
21860
e382cf9ec30b progress: use 'encoding.colwidth' to get column width of output line correctly
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 21859
diff changeset
   169
                used += encoding.colwidth(head) + 1
10434
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
   170
            if tail:
21860
e382cf9ec30b progress: use 'encoding.colwidth' to get column width of output line correctly
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 21859
diff changeset
   171
                used += encoding.colwidth(tail) + 1
10434
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
   172
            progwidth = termwidth - used - 3
10891
83af68e38be3 progress: fall back to indeterminate progress if position is >= total
Augie Fackler <durin42@gmail.com>
parents: 10815
diff changeset
   173
            if total and pos <= total:
10434
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
   174
                amt = pos * progwidth // total
10453
7edc649f9f7e progress: make determinate bar more like wget progress bar
Brodie Rao <me+hg@dackz.net>
parents: 10452
diff changeset
   175
                bar = '=' * (amt - 1)
7edc649f9f7e progress: make determinate bar more like wget progress bar
Brodie Rao <me+hg@dackz.net>
parents: 10452
diff changeset
   176
                if amt > 0:
7edc649f9f7e progress: make determinate bar more like wget progress bar
Brodie Rao <me+hg@dackz.net>
parents: 10452
diff changeset
   177
                    bar += '>'
7edc649f9f7e progress: make determinate bar more like wget progress bar
Brodie Rao <me+hg@dackz.net>
parents: 10452
diff changeset
   178
                bar += ' ' * (progwidth - amt)
10434
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
   179
            else:
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
   180
                progwidth -= 3
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
   181
                self.indetcount += 1
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
   182
                # mod the count by twice the width so we can make the
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
   183
                # cursor bounce between the right and left sides
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
   184
                amt = self.indetcount % (2 * progwidth)
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
   185
                amt -= progwidth
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
   186
                bar = (' ' * int(progwidth - abs(amt)) + '<=>' +
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
   187
                       ' ' * int(abs(amt)))
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
   188
            prog = ''.join(('[', bar , ']'))
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
   189
            out = spacejoin(head, prog, tail)
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
   190
        else:
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
   191
            out = spacejoin(head, tail)
21859
be4270d27a7e progress: use 'encoding.trim' to trim output line correctly
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19619
diff changeset
   192
        sys.stderr.write('\r' + encoding.trim(out, termwidth))
14838
5d261fd00446 progress: add a changedelay to prevent parallel topics from flapping (issue2698)
Augie Fackler <durin42@gmail.com>
parents: 14837
diff changeset
   193
        self.lasttopic = topic
10788
ca6ba6cac6cd progress: use stderr instead of stdout; check stderr.isatty()
Augie Fackler <durin42@gmail.com>
parents: 10656
diff changeset
   194
        sys.stderr.flush()
10434
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
   195
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
   196
    def clear(self):
11458
ec21d91c79b3 progress: check stderr.isatty() before each print
Augie Fackler <durin42@gmail.com>
parents: 10891
diff changeset
   197
        if not shouldprint(self.ui):
ec21d91c79b3 progress: check stderr.isatty() before each print
Augie Fackler <durin42@gmail.com>
parents: 10891
diff changeset
   198
            return
10788
ca6ba6cac6cd progress: use stderr instead of stdout; check stderr.isatty()
Augie Fackler <durin42@gmail.com>
parents: 10656
diff changeset
   199
        sys.stderr.write('\r%s\r' % (' ' * self.width()))
10434
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
   200
10439
509f4ed56509 progress: correctly handle empty progress topic
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10434
diff changeset
   201
    def complete(self):
11458
ec21d91c79b3 progress: check stderr.isatty() before each print
Augie Fackler <durin42@gmail.com>
parents: 10891
diff changeset
   202
        if not shouldprint(self.ui):
ec21d91c79b3 progress: check stderr.isatty() before each print
Augie Fackler <durin42@gmail.com>
parents: 10891
diff changeset
   203
            return
10439
509f4ed56509 progress: correctly handle empty progress topic
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10434
diff changeset
   204
        if self.ui.configbool('progress', 'clear-complete', default=True):
509f4ed56509 progress: correctly handle empty progress topic
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10434
diff changeset
   205
            self.clear()
509f4ed56509 progress: correctly handle empty progress topic
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10434
diff changeset
   206
        else:
10788
ca6ba6cac6cd progress: use stderr instead of stdout; check stderr.isatty()
Augie Fackler <durin42@gmail.com>
parents: 10656
diff changeset
   207
            sys.stderr.write('\n')
ca6ba6cac6cd progress: use stderr instead of stdout; check stderr.isatty()
Augie Fackler <durin42@gmail.com>
parents: 10656
diff changeset
   208
        sys.stderr.flush()
10439
509f4ed56509 progress: correctly handle empty progress topic
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10434
diff changeset
   209
10434
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
   210
    def width(self):
12689
c52c629ce19e termwidth: move to ui.ui from util
Augie Fackler <durin42@gmail.com>
parents: 12654
diff changeset
   211
        tw = self.ui.termwidth()
10434
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
   212
        return min(int(self.ui.config('progress', 'width', default=tw)), tw)
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
   213
13147
082f5be788d9 progress: only show time estimate when progress format contains 'estimate'
Augie Fackler <durin42@gmail.com>
parents: 13146
diff changeset
   214
    def estimate(self, topic, pos, total, now):
13154
e11c14f14491 progress: don't compute estimate without a total
Augie Fackler <durin42@gmail.com>
parents: 13148
diff changeset
   215
        if total is None:
e11c14f14491 progress: don't compute estimate without a total
Augie Fackler <durin42@gmail.com>
parents: 13148
diff changeset
   216
            return ''
13147
082f5be788d9 progress: only show time estimate when progress format contains 'estimate'
Augie Fackler <durin42@gmail.com>
parents: 13146
diff changeset
   217
        initialpos = self.startvals[topic]
082f5be788d9 progress: only show time estimate when progress format contains 'estimate'
Augie Fackler <durin42@gmail.com>
parents: 13146
diff changeset
   218
        target = total - initialpos
082f5be788d9 progress: only show time estimate when progress format contains 'estimate'
Augie Fackler <durin42@gmail.com>
parents: 13146
diff changeset
   219
        delta = pos - initialpos
082f5be788d9 progress: only show time estimate when progress format contains 'estimate'
Augie Fackler <durin42@gmail.com>
parents: 13146
diff changeset
   220
        if delta > 0:
082f5be788d9 progress: only show time estimate when progress format contains 'estimate'
Augie Fackler <durin42@gmail.com>
parents: 13146
diff changeset
   221
            elapsed = now - self.starttimes[topic]
082f5be788d9 progress: only show time estimate when progress format contains 'estimate'
Augie Fackler <durin42@gmail.com>
parents: 13146
diff changeset
   222
            if elapsed > float(
082f5be788d9 progress: only show time estimate when progress format contains 'estimate'
Augie Fackler <durin42@gmail.com>
parents: 13146
diff changeset
   223
                self.ui.config('progress', 'estimate', default=2)):
082f5be788d9 progress: only show time estimate when progress format contains 'estimate'
Augie Fackler <durin42@gmail.com>
parents: 13146
diff changeset
   224
                seconds = (elapsed * (target - delta)) // delta + 1
082f5be788d9 progress: only show time estimate when progress format contains 'estimate'
Augie Fackler <durin42@gmail.com>
parents: 13146
diff changeset
   225
                return fmtremaining(seconds)
082f5be788d9 progress: only show time estimate when progress format contains 'estimate'
Augie Fackler <durin42@gmail.com>
parents: 13146
diff changeset
   226
        return ''
082f5be788d9 progress: only show time estimate when progress format contains 'estimate'
Augie Fackler <durin42@gmail.com>
parents: 13146
diff changeset
   227
14280
98e4d3914c2e progress: add speed format
Martin Geisler <mg@aragost.com>
parents: 14247
diff changeset
   228
    def speed(self, topic, pos, unit, now):
98e4d3914c2e progress: add speed format
Martin Geisler <mg@aragost.com>
parents: 14247
diff changeset
   229
        initialpos = self.startvals[topic]
98e4d3914c2e progress: add speed format
Martin Geisler <mg@aragost.com>
parents: 14247
diff changeset
   230
        delta = pos - initialpos
98e4d3914c2e progress: add speed format
Martin Geisler <mg@aragost.com>
parents: 14247
diff changeset
   231
        elapsed = now - self.starttimes[topic]
98e4d3914c2e progress: add speed format
Martin Geisler <mg@aragost.com>
parents: 14247
diff changeset
   232
        if elapsed > float(
98e4d3914c2e progress: add speed format
Martin Geisler <mg@aragost.com>
parents: 14247
diff changeset
   233
            self.ui.config('progress', 'estimate', default=2)):
98e4d3914c2e progress: add speed format
Martin Geisler <mg@aragost.com>
parents: 14247
diff changeset
   234
            return _('%d %s/sec') % (delta / elapsed, unit)
98e4d3914c2e progress: add speed format
Martin Geisler <mg@aragost.com>
parents: 14247
diff changeset
   235
        return ''
98e4d3914c2e progress: add speed format
Martin Geisler <mg@aragost.com>
parents: 14247
diff changeset
   236
23907
63c7783a5928 progress: move update check into helper method
Solomon Matthews <smat@fb.com>
parents: 23906
diff changeset
   237
    def _oktoprint(self, now):
63c7783a5928 progress: move update check into helper method
Solomon Matthews <smat@fb.com>
parents: 23906
diff changeset
   238
        '''Check if conditions are met to print - e.g. changedelay elapsed'''
63c7783a5928 progress: move update check into helper method
Solomon Matthews <smat@fb.com>
parents: 23906
diff changeset
   239
        if (self.lasttopic is None # first time we printed
63c7783a5928 progress: move update check into helper method
Solomon Matthews <smat@fb.com>
parents: 23906
diff changeset
   240
            # not a topic change
63c7783a5928 progress: move update check into helper method
Solomon Matthews <smat@fb.com>
parents: 23906
diff changeset
   241
            or self.curtopic == self.lasttopic
63c7783a5928 progress: move update check into helper method
Solomon Matthews <smat@fb.com>
parents: 23906
diff changeset
   242
            # it's been long enough we should print anyway
63c7783a5928 progress: move update check into helper method
Solomon Matthews <smat@fb.com>
parents: 23906
diff changeset
   243
            or now - self.lastprint >= self.changedelay):
63c7783a5928 progress: move update check into helper method
Solomon Matthews <smat@fb.com>
parents: 23906
diff changeset
   244
            return True
63c7783a5928 progress: move update check into helper method
Solomon Matthews <smat@fb.com>
parents: 23906
diff changeset
   245
        else:
63c7783a5928 progress: move update check into helper method
Solomon Matthews <smat@fb.com>
parents: 23906
diff changeset
   246
            return False
63c7783a5928 progress: move update check into helper method
Solomon Matthews <smat@fb.com>
parents: 23906
diff changeset
   247
11555
d8d0fc3988ca color/progress: subclass ui instead of using wrapfunction (issue2096)
Brodie Rao <brodie@bitheap.org>
parents: 11458
diff changeset
   248
    def progress(self, topic, pos, item='', unit='', total=None):
13131
c9ae7e096994 progress: Add estimated time remaining for long tasks
timeless <timeless@gmail.com>
parents: 13130
diff changeset
   249
        now = time.time()
23908
5502bd79d052 progress: add a lock to prepare for introducing a thread
Solomon Matthews <smat@fb.com>
parents: 23907
diff changeset
   250
        self._refreshlock.acquire()
23905
8b5b963ba95a progress: add try/finally to make the diffs for the next commit more readable
Solomon Matthews <smat@fb.com>
parents: 21863
diff changeset
   251
        try:
8b5b963ba95a progress: add try/finally to make the diffs for the next commit more readable
Solomon Matthews <smat@fb.com>
parents: 21863
diff changeset
   252
            if pos is None:
8b5b963ba95a progress: add try/finally to make the diffs for the next commit more readable
Solomon Matthews <smat@fb.com>
parents: 21863
diff changeset
   253
                self.starttimes.pop(topic, None)
8b5b963ba95a progress: add try/finally to make the diffs for the next commit more readable
Solomon Matthews <smat@fb.com>
parents: 21863
diff changeset
   254
                self.startvals.pop(topic, None)
8b5b963ba95a progress: add try/finally to make the diffs for the next commit more readable
Solomon Matthews <smat@fb.com>
parents: 21863
diff changeset
   255
                self.topicstates.pop(topic, None)
8b5b963ba95a progress: add try/finally to make the diffs for the next commit more readable
Solomon Matthews <smat@fb.com>
parents: 21863
diff changeset
   256
                # reset the progress bar if this is the outermost topic
8b5b963ba95a progress: add try/finally to make the diffs for the next commit more readable
Solomon Matthews <smat@fb.com>
parents: 21863
diff changeset
   257
                if self.topics and self.topics[0] == topic and self.printed:
8b5b963ba95a progress: add try/finally to make the diffs for the next commit more readable
Solomon Matthews <smat@fb.com>
parents: 21863
diff changeset
   258
                    self.complete()
8b5b963ba95a progress: add try/finally to make the diffs for the next commit more readable
Solomon Matthews <smat@fb.com>
parents: 21863
diff changeset
   259
                    self.resetstate()
8b5b963ba95a progress: add try/finally to make the diffs for the next commit more readable
Solomon Matthews <smat@fb.com>
parents: 21863
diff changeset
   260
                # truncate the list of topics assuming all topics within
8b5b963ba95a progress: add try/finally to make the diffs for the next commit more readable
Solomon Matthews <smat@fb.com>
parents: 21863
diff changeset
   261
                # this one are also closed
8b5b963ba95a progress: add try/finally to make the diffs for the next commit more readable
Solomon Matthews <smat@fb.com>
parents: 21863
diff changeset
   262
                if topic in self.topics:
8b5b963ba95a progress: add try/finally to make the diffs for the next commit more readable
Solomon Matthews <smat@fb.com>
parents: 21863
diff changeset
   263
                    self.topics = self.topics[:self.topics.index(topic)]
8b5b963ba95a progress: add try/finally to make the diffs for the next commit more readable
Solomon Matthews <smat@fb.com>
parents: 21863
diff changeset
   264
                    # reset the last topic to the one we just unwound to,
8b5b963ba95a progress: add try/finally to make the diffs for the next commit more readable
Solomon Matthews <smat@fb.com>
parents: 21863
diff changeset
   265
                    # so that higher-level topics will be stickier than
8b5b963ba95a progress: add try/finally to make the diffs for the next commit more readable
Solomon Matthews <smat@fb.com>
parents: 21863
diff changeset
   266
                    # lower-level topics
8b5b963ba95a progress: add try/finally to make the diffs for the next commit more readable
Solomon Matthews <smat@fb.com>
parents: 21863
diff changeset
   267
                    if self.topics:
8b5b963ba95a progress: add try/finally to make the diffs for the next commit more readable
Solomon Matthews <smat@fb.com>
parents: 21863
diff changeset
   268
                        self.lasttopic = self.topics[-1]
8b5b963ba95a progress: add try/finally to make the diffs for the next commit more readable
Solomon Matthews <smat@fb.com>
parents: 21863
diff changeset
   269
                    else:
8b5b963ba95a progress: add try/finally to make the diffs for the next commit more readable
Solomon Matthews <smat@fb.com>
parents: 21863
diff changeset
   270
                        self.lasttopic = None
8b5b963ba95a progress: add try/finally to make the diffs for the next commit more readable
Solomon Matthews <smat@fb.com>
parents: 21863
diff changeset
   271
            else:
8b5b963ba95a progress: add try/finally to make the diffs for the next commit more readable
Solomon Matthews <smat@fb.com>
parents: 21863
diff changeset
   272
                if topic not in self.topics:
8b5b963ba95a progress: add try/finally to make the diffs for the next commit more readable
Solomon Matthews <smat@fb.com>
parents: 21863
diff changeset
   273
                    self.starttimes[topic] = now
8b5b963ba95a progress: add try/finally to make the diffs for the next commit more readable
Solomon Matthews <smat@fb.com>
parents: 21863
diff changeset
   274
                    self.startvals[topic] = pos
8b5b963ba95a progress: add try/finally to make the diffs for the next commit more readable
Solomon Matthews <smat@fb.com>
parents: 21863
diff changeset
   275
                    self.topics.append(topic)
8b5b963ba95a progress: add try/finally to make the diffs for the next commit more readable
Solomon Matthews <smat@fb.com>
parents: 21863
diff changeset
   276
                self.topicstates[topic] = pos, item, unit, total
23906
e0ae0a4e4c7b progress: move current topic to member variable
Solomon Matthews <smat@fb.com>
parents: 23905
diff changeset
   277
                self.curtopic = topic
23905
8b5b963ba95a progress: add try/finally to make the diffs for the next commit more readable
Solomon Matthews <smat@fb.com>
parents: 21863
diff changeset
   278
                if now - self.lastprint >= self.refresh and self.topics:
23907
63c7783a5928 progress: move update check into helper method
Solomon Matthews <smat@fb.com>
parents: 23906
diff changeset
   279
                    if self._oktoprint(now):
23905
8b5b963ba95a progress: add try/finally to make the diffs for the next commit more readable
Solomon Matthews <smat@fb.com>
parents: 21863
diff changeset
   280
                        self.lastprint = now
8b5b963ba95a progress: add try/finally to make the diffs for the next commit more readable
Solomon Matthews <smat@fb.com>
parents: 21863
diff changeset
   281
                        self.show(now, topic, *self.topicstates[topic])
8b5b963ba95a progress: add try/finally to make the diffs for the next commit more readable
Solomon Matthews <smat@fb.com>
parents: 21863
diff changeset
   282
        finally:
23908
5502bd79d052 progress: add a lock to prepare for introducing a thread
Solomon Matthews <smat@fb.com>
parents: 23907
diff changeset
   283
            self._refreshlock.release()
10434
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
   284
14837
ec4ba216ddef progress: make progress bar a singleton to avoid double-progress ui bugs
Augie Fackler <durin42@gmail.com>
parents: 14836
diff changeset
   285
_singleton = None
ec4ba216ddef progress: make progress bar a singleton to avoid double-progress ui bugs
Augie Fackler <durin42@gmail.com>
parents: 14836
diff changeset
   286
10434
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
   287
def uisetup(ui):
14837
ec4ba216ddef progress: make progress bar a singleton to avoid double-progress ui bugs
Augie Fackler <durin42@gmail.com>
parents: 14836
diff changeset
   288
    global _singleton
11555
d8d0fc3988ca color/progress: subclass ui instead of using wrapfunction (issue2096)
Brodie Rao <brodie@bitheap.org>
parents: 11458
diff changeset
   289
    class progressui(ui.__class__):
d8d0fc3988ca color/progress: subclass ui instead of using wrapfunction (issue2096)
Brodie Rao <brodie@bitheap.org>
parents: 11458
diff changeset
   290
        _progbar = None
d8d0fc3988ca color/progress: subclass ui instead of using wrapfunction (issue2096)
Brodie Rao <brodie@bitheap.org>
parents: 11458
diff changeset
   291
15662
06671371e634 progress: check for ui.quiet and ui.debugflag before we write
David Soria Parra <dsp@php.net>
parents: 14838
diff changeset
   292
        def _quiet(self):
06671371e634 progress: check for ui.quiet and ui.debugflag before we write
David Soria Parra <dsp@php.net>
parents: 14838
diff changeset
   293
            return self.debugflag or self.quiet
06671371e634 progress: check for ui.quiet and ui.debugflag before we write
David Soria Parra <dsp@php.net>
parents: 14838
diff changeset
   294
11555
d8d0fc3988ca color/progress: subclass ui instead of using wrapfunction (issue2096)
Brodie Rao <brodie@bitheap.org>
parents: 11458
diff changeset
   295
        def progress(self, *args, **opts):
15662
06671371e634 progress: check for ui.quiet and ui.debugflag before we write
David Soria Parra <dsp@php.net>
parents: 14838
diff changeset
   296
            if not self._quiet():
06671371e634 progress: check for ui.quiet and ui.debugflag before we write
David Soria Parra <dsp@php.net>
parents: 14838
diff changeset
   297
                self._progbar.progress(*args, **opts)
11555
d8d0fc3988ca color/progress: subclass ui instead of using wrapfunction (issue2096)
Brodie Rao <brodie@bitheap.org>
parents: 11458
diff changeset
   298
            return super(progressui, self).progress(*args, **opts)
d8d0fc3988ca color/progress: subclass ui instead of using wrapfunction (issue2096)
Brodie Rao <brodie@bitheap.org>
parents: 11458
diff changeset
   299
d8d0fc3988ca color/progress: subclass ui instead of using wrapfunction (issue2096)
Brodie Rao <brodie@bitheap.org>
parents: 11458
diff changeset
   300
        def write(self, *args, **opts):
15662
06671371e634 progress: check for ui.quiet and ui.debugflag before we write
David Soria Parra <dsp@php.net>
parents: 14838
diff changeset
   301
            if not self._quiet() and self._progbar.printed:
11555
d8d0fc3988ca color/progress: subclass ui instead of using wrapfunction (issue2096)
Brodie Rao <brodie@bitheap.org>
parents: 11458
diff changeset
   302
                self._progbar.clear()
d8d0fc3988ca color/progress: subclass ui instead of using wrapfunction (issue2096)
Brodie Rao <brodie@bitheap.org>
parents: 11458
diff changeset
   303
            return super(progressui, self).write(*args, **opts)
d8d0fc3988ca color/progress: subclass ui instead of using wrapfunction (issue2096)
Brodie Rao <brodie@bitheap.org>
parents: 11458
diff changeset
   304
d8d0fc3988ca color/progress: subclass ui instead of using wrapfunction (issue2096)
Brodie Rao <brodie@bitheap.org>
parents: 11458
diff changeset
   305
        def write_err(self, *args, **opts):
15662
06671371e634 progress: check for ui.quiet and ui.debugflag before we write
David Soria Parra <dsp@php.net>
parents: 14838
diff changeset
   306
            if not self._quiet() and self._progbar.printed:
11555
d8d0fc3988ca color/progress: subclass ui instead of using wrapfunction (issue2096)
Brodie Rao <brodie@bitheap.org>
parents: 11458
diff changeset
   307
                self._progbar.clear()
d8d0fc3988ca color/progress: subclass ui instead of using wrapfunction (issue2096)
Brodie Rao <brodie@bitheap.org>
parents: 11458
diff changeset
   308
            return super(progressui, self).write_err(*args, **opts)
d8d0fc3988ca color/progress: subclass ui instead of using wrapfunction (issue2096)
Brodie Rao <brodie@bitheap.org>
parents: 11458
diff changeset
   309
10540
dd9d057465c1 progress: provide an explicit disable method for developers
Steve Borho <steve@borho.org>
parents: 10523
diff changeset
   310
    # Apps that derive a class from ui.ui() can use
dd9d057465c1 progress: provide an explicit disable method for developers
Steve Borho <steve@borho.org>
parents: 10523
diff changeset
   311
    # setconfig('progress', 'disable', 'True') to disable this extension
dd9d057465c1 progress: provide an explicit disable method for developers
Steve Borho <steve@borho.org>
parents: 10523
diff changeset
   312
    if ui.configbool('progress', 'disable'):
dd9d057465c1 progress: provide an explicit disable method for developers
Steve Borho <steve@borho.org>
parents: 10523
diff changeset
   313
        return
11458
ec21d91c79b3 progress: check stderr.isatty() before each print
Augie Fackler <durin42@gmail.com>
parents: 10891
diff changeset
   314
    if shouldprint(ui) and not ui.debugflag and not ui.quiet:
25482
95f490136e75 progress: stop double-wrapping of ui class
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25186
diff changeset
   315
        dval = object()
95f490136e75 progress: stop double-wrapping of ui class
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25186
diff changeset
   316
        if getattr(ui, '_progbar', dval) is dval:
95f490136e75 progress: stop double-wrapping of ui class
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25186
diff changeset
   317
            ui.__class__ = progressui
95f490136e75 progress: stop double-wrapping of ui class
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25186
diff changeset
   318
            # we instantiate one globally-shared progress bar to avoid
95f490136e75 progress: stop double-wrapping of ui class
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25186
diff changeset
   319
            # competing progress bars when multiple UI objects get created
95f490136e75 progress: stop double-wrapping of ui class
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25186
diff changeset
   320
            if not progressui._progbar:
95f490136e75 progress: stop double-wrapping of ui class
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25186
diff changeset
   321
                if _singleton is None:
95f490136e75 progress: stop double-wrapping of ui class
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25186
diff changeset
   322
                    _singleton = progbar(ui)
95f490136e75 progress: stop double-wrapping of ui class
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25186
diff changeset
   323
                progressui._progbar = _singleton
10434
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
   324
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
   325
def reposetup(ui, repo):
ad104a786d35 Progress bar extension
Augie Fackler <durin42@gmail.com>
parents:
diff changeset
   326
    uisetup(repo.ui)