mercurial/progress.py
author Arseniy Alekseyev <aalekseyev@janestreet.com>
Tue, 12 Apr 2022 20:01:49 +0100
changeset 49070 137a93125902
parent 48946 642e31cb55f0
child 49302 ee4537e365c8
permissions -rw-r--r--
rhg: refactor to pass argv down, instead of caling args_os() This refactoring makes it easy to patch some command-line preprocessing into rhg. We use this to support using rhg as a shebang interpreter, for example. Differential Revision: https://phab.mercurial-scm.org/D12543
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
25497
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
     1
# progress.py progress bars related code
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
     2
#
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
     3
# Copyright (C) 2010 Augie Fackler <durin42@gmail.com>
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
     4
#
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
     5
# This software may be used and distributed according to the terms of the
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
     6
# GNU General Public License version 2 or any later version.
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
     7
25968
1139d7cf9405 progress: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25847
diff changeset
     8
32049
ed42e00a5c4e progress: retry ferr.flush() and .write() on EINTR (issue5532)
Yuya Nishihara <yuya@tcha.org>
parents: 32048
diff changeset
     9
import errno
25497
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
    10
import threading
25968
1139d7cf9405 progress: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25847
diff changeset
    11
import time
25497
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
    12
25968
1139d7cf9405 progress: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25847
diff changeset
    13
from .i18n import _
1139d7cf9405 progress: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25847
diff changeset
    14
from . import encoding
25497
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
    15
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41143
diff changeset
    16
25497
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
    17
def spacejoin(*args):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
    18
    return b' '.join(s for s in args if s)
25497
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
    19
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41143
diff changeset
    20
25497
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
    21
def shouldprint(ui):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
    22
    return not (ui.quiet or ui.plain(b'progress')) and (
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
    23
        ui._isatty(ui.ferr) or ui.configbool(b'progress', b'assume-tty')
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41143
diff changeset
    24
    )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41143
diff changeset
    25
25497
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
    26
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
    27
def fmtremaining(seconds):
26781
1aee2ab0f902 spelling: trivial spell checking
Mads Kiilerich <madski@unity3d.com>
parents: 26407
diff changeset
    28
    """format a number of remaining seconds in human readable way
25497
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
    29
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
    30
    This will properly display seconds, minutes, hours, days if needed"""
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
    31
    if seconds < 60:
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
    32
        # i18n: format XX seconds as "XXs"
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
    33
        return _(b"%02ds") % seconds
25497
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
    34
    minutes = seconds // 60
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
    35
    if minutes < 60:
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
    36
        seconds -= minutes * 60
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
    37
        # i18n: format X minutes and YY seconds as "XmYYs"
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
    38
        return _(b"%dm%02ds") % (minutes, seconds)
25497
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
    39
    # we're going to ignore seconds in this case
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
    40
    minutes += 1
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
    41
    hours = minutes // 60
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
    42
    minutes -= hours * 60
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
    43
    if hours < 30:
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
    44
        # i18n: format X hours and YY minutes as "XhYYm"
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
    45
        return _(b"%dh%02dm") % (hours, minutes)
25497
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
    46
    # we're going to ignore minutes in this case
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
    47
    hours += 1
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
    48
    days = hours // 24
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
    49
    hours -= days * 24
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
    50
    if days < 15:
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
    51
        # i18n: format X days and YY hours as "XdYYh"
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
    52
        return _(b"%dd%02dh") % (days, hours)
25497
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
    53
    # we're going to ignore hours in this case
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
    54
    days += 1
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
    55
    weeks = days // 7
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
    56
    days -= weeks * 7
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
    57
    if weeks < 55:
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
    58
        # i18n: format X weeks and YY days as "XwYYd"
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
    59
        return _(b"%dw%02dd") % (weeks, days)
25497
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
    60
    # we're going to ignore days and treat a year as 52 weeks
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
    61
    weeks += 1
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
    62
    years = weeks // 52
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
    63
    weeks -= years * 52
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
    64
    # i18n: format X years and YY weeks as "XyYYw"
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
    65
    return _(b"%dy%02dw") % (years, weeks)
25497
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
    66
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41143
diff changeset
    67
32049
ed42e00a5c4e progress: retry ferr.flush() and .write() on EINTR (issue5532)
Yuya Nishihara <yuya@tcha.org>
parents: 32048
diff changeset
    68
# file_write() and file_flush() of Python 2 do not restart on EINTR if
ed42e00a5c4e progress: retry ferr.flush() and .write() on EINTR (issue5532)
Yuya Nishihara <yuya@tcha.org>
parents: 32048
diff changeset
    69
# the file is attached to a "slow" device (e.g. a terminal) and raise
ed42e00a5c4e progress: retry ferr.flush() and .write() on EINTR (issue5532)
Yuya Nishihara <yuya@tcha.org>
parents: 32048
diff changeset
    70
# IOError. We cannot know how many bytes would be written by file_write(),
ed42e00a5c4e progress: retry ferr.flush() and .write() on EINTR (issue5532)
Yuya Nishihara <yuya@tcha.org>
parents: 32048
diff changeset
    71
# but a progress text is known to be short enough to be written by a
ed42e00a5c4e progress: retry ferr.flush() and .write() on EINTR (issue5532)
Yuya Nishihara <yuya@tcha.org>
parents: 32048
diff changeset
    72
# single write() syscall, so we can just retry file_write() with the whole
ed42e00a5c4e progress: retry ferr.flush() and .write() on EINTR (issue5532)
Yuya Nishihara <yuya@tcha.org>
parents: 32048
diff changeset
    73
# text. (issue5532)
ed42e00a5c4e progress: retry ferr.flush() and .write() on EINTR (issue5532)
Yuya Nishihara <yuya@tcha.org>
parents: 32048
diff changeset
    74
#
ed42e00a5c4e progress: retry ferr.flush() and .write() on EINTR (issue5532)
Yuya Nishihara <yuya@tcha.org>
parents: 32048
diff changeset
    75
# This should be a short-term workaround. We'll need to fix every occurrence
ed42e00a5c4e progress: retry ferr.flush() and .write() on EINTR (issue5532)
Yuya Nishihara <yuya@tcha.org>
parents: 32048
diff changeset
    76
# of write() to a terminal or pipe.
ed42e00a5c4e progress: retry ferr.flush() and .write() on EINTR (issue5532)
Yuya Nishihara <yuya@tcha.org>
parents: 32048
diff changeset
    77
def _eintrretry(func, *args):
ed42e00a5c4e progress: retry ferr.flush() and .write() on EINTR (issue5532)
Yuya Nishihara <yuya@tcha.org>
parents: 32048
diff changeset
    78
    while True:
ed42e00a5c4e progress: retry ferr.flush() and .write() on EINTR (issue5532)
Yuya Nishihara <yuya@tcha.org>
parents: 32048
diff changeset
    79
        try:
ed42e00a5c4e progress: retry ferr.flush() and .write() on EINTR (issue5532)
Yuya Nishihara <yuya@tcha.org>
parents: 32048
diff changeset
    80
            return func(*args)
ed42e00a5c4e progress: retry ferr.flush() and .write() on EINTR (issue5532)
Yuya Nishihara <yuya@tcha.org>
parents: 32048
diff changeset
    81
        except IOError as err:
ed42e00a5c4e progress: retry ferr.flush() and .write() on EINTR (issue5532)
Yuya Nishihara <yuya@tcha.org>
parents: 32048
diff changeset
    82
            if err.errno == errno.EINTR:
ed42e00a5c4e progress: retry ferr.flush() and .write() on EINTR (issue5532)
Yuya Nishihara <yuya@tcha.org>
parents: 32048
diff changeset
    83
                continue
ed42e00a5c4e progress: retry ferr.flush() and .write() on EINTR (issue5532)
Yuya Nishihara <yuya@tcha.org>
parents: 32048
diff changeset
    84
            raise
ed42e00a5c4e progress: retry ferr.flush() and .write() on EINTR (issue5532)
Yuya Nishihara <yuya@tcha.org>
parents: 32048
diff changeset
    85
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41143
diff changeset
    86
48946
642e31cb55f0 py3: use class X: instead of class X(object):
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48875
diff changeset
    87
class progbar:
25497
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
    88
    def __init__(self, ui):
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
    89
        self.ui = ui
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
    90
        self._refreshlock = threading.Lock()
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
    91
        self.resetstate()
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
    92
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
    93
    def resetstate(self):
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
    94
        self.topics = []
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
    95
        self.topicstates = {}
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
    96
        self.starttimes = {}
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
    97
        self.startvals = {}
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
    98
        self.printed = False
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41143
diff changeset
    99
        self.lastprint = time.time() + float(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   100
            self.ui.config(b'progress', b'delay')
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41143
diff changeset
   101
        )
25497
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   102
        self.curtopic = None
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   103
        self.lasttopic = None
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   104
        self.indetcount = 0
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   105
        self.refresh = float(self.ui.config(b'progress', b'refresh'))
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41143
diff changeset
   106
        self.changedelay = max(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   107
            3 * self.refresh, float(self.ui.config(b'progress', b'changedelay'))
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41143
diff changeset
   108
        )
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   109
        self.order = self.ui.configlist(b'progress', b'format')
34314
a667f0ca1d5f progress: make ETA only consider progress made in the last minute
Jun Wu <quark@fb.com>
parents: 34313
diff changeset
   110
        self.estimateinterval = self.ui.configwith(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   111
            float, b'progress', b'estimateinterval'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41143
diff changeset
   112
        )
25497
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   113
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   114
    def show(self, now, topic, pos, item, unit, total):
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   115
        if not shouldprint(self.ui):
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   116
            return
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   117
        termwidth = self.width()
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   118
        self.printed = True
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   119
        head = b''
25497
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   120
        needprogress = False
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   121
        tail = b''
25497
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   122
        for indicator in self.order:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   123
            add = b''
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   124
            if indicator == b'topic':
25497
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   125
                add = topic
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   126
            elif indicator == b'number':
25497
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   127
                if total:
36202
707aba4d48b5 progress: use '%*d' to pad progress value
Yuya Nishihara <yuya@tcha.org>
parents: 36152
diff changeset
   128
                    add = b'%*d/%d' % (len(str(total)), pos, total)
25497
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   129
                else:
36423
2831d918e1b4 py3: convert known-int values to bytes using %d
Augie Fackler <augie@google.com>
parents: 36202
diff changeset
   130
                    add = b'%d' % pos
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   131
            elif indicator.startswith(b'item') and item:
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   132
                slice = b'end'
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   133
                if b'-' in indicator:
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   134
                    wid = int(indicator.split(b'-')[1])
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   135
                elif b'+' in indicator:
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   136
                    slice = b'beginning'
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   137
                    wid = int(indicator.split(b'+')[1])
25497
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   138
                else:
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   139
                    wid = 20
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   140
                if slice == b'end':
25497
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   141
                    add = encoding.trim(item, wid, leftside=True)
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   142
                else:
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   143
                    add = encoding.trim(item, wid)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   144
                add += (wid - encoding.colwidth(add)) * b' '
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   145
            elif indicator == b'bar':
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   146
                add = b''
25497
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   147
                needprogress = True
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   148
            elif indicator == b'unit' and unit:
25497
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   149
                add = unit
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   150
            elif indicator == b'estimate':
25497
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   151
                add = self.estimate(topic, pos, total, now)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   152
            elif indicator == b'speed':
25497
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   153
                add = self.speed(topic, pos, unit, now)
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   154
            if not needprogress:
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   155
                head = spacejoin(head, add)
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   156
            else:
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   157
                tail = spacejoin(tail, add)
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   158
        if needprogress:
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   159
            used = 0
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   160
            if head:
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   161
                used += encoding.colwidth(head) + 1
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   162
            if tail:
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   163
                used += encoding.colwidth(tail) + 1
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   164
            progwidth = termwidth - used - 3
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   165
            if total and pos <= total:
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   166
                amt = pos * progwidth // total
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   167
                bar = b'=' * (amt - 1)
25497
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   168
                if amt > 0:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   169
                    bar += b'>'
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   170
                bar += b' ' * (progwidth - amt)
25497
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   171
            else:
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   172
                progwidth -= 3
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   173
                self.indetcount += 1
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   174
                # mod the count by twice the width so we can make the
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   175
                # cursor bounce between the right and left sides
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   176
                amt = self.indetcount % (2 * progwidth)
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   177
                amt -= progwidth
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41143
diff changeset
   178
                bar = (
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   179
                    b' ' * int(progwidth - abs(amt))
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   180
                    + b'<=>'
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   181
                    + b' ' * int(abs(amt))
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41143
diff changeset
   182
                )
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   183
            prog = b''.join((b'[', bar, b']'))
25497
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   184
            out = spacejoin(head, prog, tail)
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   185
        else:
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   186
            out = spacejoin(head, tail)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   187
        self._writeerr(b'\r' + encoding.trim(out, termwidth))
25497
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   188
        self.lasttopic = topic
32048
c3ef33fd0058 progress: extract stubs to restart ferr.flush() and .write() on EINTR
Yuya Nishihara <yuya@tcha.org>
parents: 30324
diff changeset
   189
        self._flusherr()
25497
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   190
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   191
    def clear(self):
29089
222b8170d69e progress: stop excessive clearing (issue4801)
Matt Mackall <mpm@selenic.com>
parents: 28171
diff changeset
   192
        if not self.printed or not self.lastprint or not shouldprint(self.ui):
25497
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   193
            return
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   194
        self._writeerr(b'\r%s\r' % (b' ' * self.width()))
44033
4e0a6d157910 progress: flush stderr after clearing
Kyle Lippincott <spectral@google.com>
parents: 43077
diff changeset
   195
        self._flusherr()
26407
72bccc1f26b1 progress: force a repaint of a printed progress bar after a clear()
Augie Fackler <augie@google.com>
parents: 25968
diff changeset
   196
        if self.printed:
72bccc1f26b1 progress: force a repaint of a printed progress bar after a clear()
Augie Fackler <augie@google.com>
parents: 25968
diff changeset
   197
            # force immediate re-paint of progress bar
72bccc1f26b1 progress: force a repaint of a printed progress bar after a clear()
Augie Fackler <augie@google.com>
parents: 25968
diff changeset
   198
            self.lastprint = 0
25497
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   199
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   200
    def complete(self):
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   201
        if not shouldprint(self.ui):
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   202
            return
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   203
        if self.ui.configbool(b'progress', b'clear-complete'):
25497
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   204
            self.clear()
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   205
        else:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   206
            self._writeerr(b'\n')
32048
c3ef33fd0058 progress: extract stubs to restart ferr.flush() and .write() on EINTR
Yuya Nishihara <yuya@tcha.org>
parents: 30324
diff changeset
   207
        self._flusherr()
c3ef33fd0058 progress: extract stubs to restart ferr.flush() and .write() on EINTR
Yuya Nishihara <yuya@tcha.org>
parents: 30324
diff changeset
   208
c3ef33fd0058 progress: extract stubs to restart ferr.flush() and .write() on EINTR
Yuya Nishihara <yuya@tcha.org>
parents: 30324
diff changeset
   209
    def _flusherr(self):
32049
ed42e00a5c4e progress: retry ferr.flush() and .write() on EINTR (issue5532)
Yuya Nishihara <yuya@tcha.org>
parents: 32048
diff changeset
   210
        _eintrretry(self.ui.ferr.flush)
25497
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   211
32048
c3ef33fd0058 progress: extract stubs to restart ferr.flush() and .write() on EINTR
Yuya Nishihara <yuya@tcha.org>
parents: 30324
diff changeset
   212
    def _writeerr(self, msg):
32049
ed42e00a5c4e progress: retry ferr.flush() and .write() on EINTR (issue5532)
Yuya Nishihara <yuya@tcha.org>
parents: 32048
diff changeset
   213
        _eintrretry(self.ui.ferr.write, msg)
32048
c3ef33fd0058 progress: extract stubs to restart ferr.flush() and .write() on EINTR
Yuya Nishihara <yuya@tcha.org>
parents: 30324
diff changeset
   214
25497
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   215
    def width(self):
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   216
        tw = self.ui.termwidth()
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   217
        return min(int(self.ui.config(b'progress', b'width', default=tw)), tw)
25497
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   218
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   219
    def estimate(self, topic, pos, total, now):
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   220
        if total is None:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   221
            return b''
25497
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   222
        initialpos = self.startvals[topic]
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   223
        target = total - initialpos
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   224
        delta = pos - initialpos
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   225
        if delta > 0:
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   226
            elapsed = now - self.starttimes[topic]
34313
f428c347d32b progress: remove progress.estimate config
Jun Wu <quark@fb.com>
parents: 33499
diff changeset
   227
            seconds = (elapsed * (target - delta)) // delta + 1
f428c347d32b progress: remove progress.estimate config
Jun Wu <quark@fb.com>
parents: 33499
diff changeset
   228
            return fmtremaining(seconds)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   229
        return b''
25497
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   230
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   231
    def speed(self, topic, pos, unit, now):
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   232
        initialpos = self.startvals[topic]
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   233
        delta = pos - initialpos
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   234
        elapsed = now - self.starttimes[topic]
34313
f428c347d32b progress: remove progress.estimate config
Jun Wu <quark@fb.com>
parents: 33499
diff changeset
   235
        if elapsed > 0:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   236
            return _(b'%d %s/sec') % (delta / elapsed, unit)
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   237
        return b''
25497
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   238
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   239
    def _oktoprint(self, now):
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   240
        '''Check if conditions are met to print - e.g. changedelay elapsed'''
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41143
diff changeset
   241
        if (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41143
diff changeset
   242
            self.lasttopic is None  # first time we printed
25497
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   243
            # not a topic change
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   244
            or self.curtopic == self.lasttopic
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   245
            # it's been long enough we should print anyway
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41143
diff changeset
   246
            or now - self.lastprint >= self.changedelay
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41143
diff changeset
   247
        ):
25497
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   248
            return True
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   249
        else:
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   250
            return False
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   251
34314
a667f0ca1d5f progress: make ETA only consider progress made in the last minute
Jun Wu <quark@fb.com>
parents: 34313
diff changeset
   252
    def _calibrateestimate(self, topic, now, pos):
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 44033
diff changeset
   253
        """Adjust starttimes and startvals for topic so ETA works better
34314
a667f0ca1d5f progress: make ETA only consider progress made in the last minute
Jun Wu <quark@fb.com>
parents: 34313
diff changeset
   254
a667f0ca1d5f progress: make ETA only consider progress made in the last minute
Jun Wu <quark@fb.com>
parents: 34313
diff changeset
   255
        If progress is non-linear (ex. get much slower in the last minute),
a667f0ca1d5f progress: make ETA only consider progress made in the last minute
Jun Wu <quark@fb.com>
parents: 34313
diff changeset
   256
        it's more friendly to only use a recent time span for ETA and speed
a667f0ca1d5f progress: make ETA only consider progress made in the last minute
Jun Wu <quark@fb.com>
parents: 34313
diff changeset
   257
        calculation.
a667f0ca1d5f progress: make ETA only consider progress made in the last minute
Jun Wu <quark@fb.com>
parents: 34313
diff changeset
   258
a667f0ca1d5f progress: make ETA only consider progress made in the last minute
Jun Wu <quark@fb.com>
parents: 34313
diff changeset
   259
            [======================================>       ]
a667f0ca1d5f progress: make ETA only consider progress made in the last minute
Jun Wu <quark@fb.com>
parents: 34313
diff changeset
   260
                                             ^^^^^^^
a667f0ca1d5f progress: make ETA only consider progress made in the last minute
Jun Wu <quark@fb.com>
parents: 34313
diff changeset
   261
                           estimateinterval, only use this for estimation
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 44033
diff changeset
   262
        """
34314
a667f0ca1d5f progress: make ETA only consider progress made in the last minute
Jun Wu <quark@fb.com>
parents: 34313
diff changeset
   263
        interval = self.estimateinterval
a667f0ca1d5f progress: make ETA only consider progress made in the last minute
Jun Wu <quark@fb.com>
parents: 34313
diff changeset
   264
        if interval <= 0:
a667f0ca1d5f progress: make ETA only consider progress made in the last minute
Jun Wu <quark@fb.com>
parents: 34313
diff changeset
   265
            return
a667f0ca1d5f progress: make ETA only consider progress made in the last minute
Jun Wu <quark@fb.com>
parents: 34313
diff changeset
   266
        elapsed = now - self.starttimes[topic]
a667f0ca1d5f progress: make ETA only consider progress made in the last minute
Jun Wu <quark@fb.com>
parents: 34313
diff changeset
   267
        if elapsed > interval:
a667f0ca1d5f progress: make ETA only consider progress made in the last minute
Jun Wu <quark@fb.com>
parents: 34313
diff changeset
   268
            delta = pos - self.startvals[topic]
a667f0ca1d5f progress: make ETA only consider progress made in the last minute
Jun Wu <quark@fb.com>
parents: 34313
diff changeset
   269
            newdelta = delta * interval / elapsed
a667f0ca1d5f progress: make ETA only consider progress made in the last minute
Jun Wu <quark@fb.com>
parents: 34313
diff changeset
   270
            # If a stall happens temporarily, ETA could change dramatically
a667f0ca1d5f progress: make ETA only consider progress made in the last minute
Jun Wu <quark@fb.com>
parents: 34313
diff changeset
   271
            # frequently. This is to avoid such dramatical change and make ETA
a667f0ca1d5f progress: make ETA only consider progress made in the last minute
Jun Wu <quark@fb.com>
parents: 34313
diff changeset
   272
            # smoother.
a667f0ca1d5f progress: make ETA only consider progress made in the last minute
Jun Wu <quark@fb.com>
parents: 34313
diff changeset
   273
            if newdelta < 0.1:
a667f0ca1d5f progress: make ETA only consider progress made in the last minute
Jun Wu <quark@fb.com>
parents: 34313
diff changeset
   274
                return
a667f0ca1d5f progress: make ETA only consider progress made in the last minute
Jun Wu <quark@fb.com>
parents: 34313
diff changeset
   275
            self.startvals[topic] = pos - newdelta
a667f0ca1d5f progress: make ETA only consider progress made in the last minute
Jun Wu <quark@fb.com>
parents: 34313
diff changeset
   276
            self.starttimes[topic] = now - interval
a667f0ca1d5f progress: make ETA only consider progress made in the last minute
Jun Wu <quark@fb.com>
parents: 34313
diff changeset
   277
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   278
    def progress(self, topic, pos, item=b'', unit=b'', total=None):
38418
b34d0a6ef936 progress: extract function for closing topic
Martin von Zweigbergk <martinvonz@google.com>
parents: 38417
diff changeset
   279
        if pos is None:
b34d0a6ef936 progress: extract function for closing topic
Martin von Zweigbergk <martinvonz@google.com>
parents: 38417
diff changeset
   280
            self.closetopic(topic)
b34d0a6ef936 progress: extract function for closing topic
Martin von Zweigbergk <martinvonz@google.com>
parents: 38417
diff changeset
   281
            return
25497
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   282
        now = time.time()
38417
6bd9f18d31a8 progress: use context manager for lock
Martin von Zweigbergk <martinvonz@google.com>
parents: 36423
diff changeset
   283
        with self._refreshlock:
38418
b34d0a6ef936 progress: extract function for closing topic
Martin von Zweigbergk <martinvonz@google.com>
parents: 38417
diff changeset
   284
            if topic not in self.topics:
b34d0a6ef936 progress: extract function for closing topic
Martin von Zweigbergk <martinvonz@google.com>
parents: 38417
diff changeset
   285
                self.starttimes[topic] = now
b34d0a6ef936 progress: extract function for closing topic
Martin von Zweigbergk <martinvonz@google.com>
parents: 38417
diff changeset
   286
                self.startvals[topic] = pos
b34d0a6ef936 progress: extract function for closing topic
Martin von Zweigbergk <martinvonz@google.com>
parents: 38417
diff changeset
   287
                self.topics.append(topic)
b34d0a6ef936 progress: extract function for closing topic
Martin von Zweigbergk <martinvonz@google.com>
parents: 38417
diff changeset
   288
            self.topicstates[topic] = pos, item, unit, total
b34d0a6ef936 progress: extract function for closing topic
Martin von Zweigbergk <martinvonz@google.com>
parents: 38417
diff changeset
   289
            self.curtopic = topic
b34d0a6ef936 progress: extract function for closing topic
Martin von Zweigbergk <martinvonz@google.com>
parents: 38417
diff changeset
   290
            self._calibrateestimate(topic, now, pos)
b34d0a6ef936 progress: extract function for closing topic
Martin von Zweigbergk <martinvonz@google.com>
parents: 38417
diff changeset
   291
            if now - self.lastprint >= self.refresh and self.topics:
b34d0a6ef936 progress: extract function for closing topic
Martin von Zweigbergk <martinvonz@google.com>
parents: 38417
diff changeset
   292
                if self._oktoprint(now):
b34d0a6ef936 progress: extract function for closing topic
Martin von Zweigbergk <martinvonz@google.com>
parents: 38417
diff changeset
   293
                    self.lastprint = now
b34d0a6ef936 progress: extract function for closing topic
Martin von Zweigbergk <martinvonz@google.com>
parents: 38417
diff changeset
   294
                    self.show(now, topic, *self.topicstates[topic])
b34d0a6ef936 progress: extract function for closing topic
Martin von Zweigbergk <martinvonz@google.com>
parents: 38417
diff changeset
   295
b34d0a6ef936 progress: extract function for closing topic
Martin von Zweigbergk <martinvonz@google.com>
parents: 38417
diff changeset
   296
    def closetopic(self, topic):
b34d0a6ef936 progress: extract function for closing topic
Martin von Zweigbergk <martinvonz@google.com>
parents: 38417
diff changeset
   297
        with self._refreshlock:
b34d0a6ef936 progress: extract function for closing topic
Martin von Zweigbergk <martinvonz@google.com>
parents: 38417
diff changeset
   298
            self.starttimes.pop(topic, None)
b34d0a6ef936 progress: extract function for closing topic
Martin von Zweigbergk <martinvonz@google.com>
parents: 38417
diff changeset
   299
            self.startvals.pop(topic, None)
b34d0a6ef936 progress: extract function for closing topic
Martin von Zweigbergk <martinvonz@google.com>
parents: 38417
diff changeset
   300
            self.topicstates.pop(topic, None)
b34d0a6ef936 progress: extract function for closing topic
Martin von Zweigbergk <martinvonz@google.com>
parents: 38417
diff changeset
   301
            # reset the progress bar if this is the outermost topic
b34d0a6ef936 progress: extract function for closing topic
Martin von Zweigbergk <martinvonz@google.com>
parents: 38417
diff changeset
   302
            if self.topics and self.topics[0] == topic and self.printed:
b34d0a6ef936 progress: extract function for closing topic
Martin von Zweigbergk <martinvonz@google.com>
parents: 38417
diff changeset
   303
                self.complete()
b34d0a6ef936 progress: extract function for closing topic
Martin von Zweigbergk <martinvonz@google.com>
parents: 38417
diff changeset
   304
                self.resetstate()
b34d0a6ef936 progress: extract function for closing topic
Martin von Zweigbergk <martinvonz@google.com>
parents: 38417
diff changeset
   305
            # truncate the list of topics assuming all topics within
b34d0a6ef936 progress: extract function for closing topic
Martin von Zweigbergk <martinvonz@google.com>
parents: 38417
diff changeset
   306
            # this one are also closed
b34d0a6ef936 progress: extract function for closing topic
Martin von Zweigbergk <martinvonz@google.com>
parents: 38417
diff changeset
   307
            if topic in self.topics:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41143
diff changeset
   308
                self.topics = self.topics[: self.topics.index(topic)]
38418
b34d0a6ef936 progress: extract function for closing topic
Martin von Zweigbergk <martinvonz@google.com>
parents: 38417
diff changeset
   309
                # reset the last topic to the one we just unwound to,
b34d0a6ef936 progress: extract function for closing topic
Martin von Zweigbergk <martinvonz@google.com>
parents: 38417
diff changeset
   310
                # so that higher-level topics will be stickier than
b34d0a6ef936 progress: extract function for closing topic
Martin von Zweigbergk <martinvonz@google.com>
parents: 38417
diff changeset
   311
                # lower-level topics
b34d0a6ef936 progress: extract function for closing topic
Martin von Zweigbergk <martinvonz@google.com>
parents: 38417
diff changeset
   312
                if self.topics:
b34d0a6ef936 progress: extract function for closing topic
Martin von Zweigbergk <martinvonz@google.com>
parents: 38417
diff changeset
   313
                    self.lasttopic = self.topics[-1]
b34d0a6ef936 progress: extract function for closing topic
Martin von Zweigbergk <martinvonz@google.com>
parents: 38417
diff changeset
   314
                else:
b34d0a6ef936 progress: extract function for closing topic
Martin von Zweigbergk <martinvonz@google.com>
parents: 38417
diff changeset
   315
                    self.lasttopic = None