mercurial/progress.py
author Jun Wu <quark@fb.com>
Tue, 29 Aug 2017 17:27:37 -0700
changeset 34005 5e83a8fe6bc4
parent 33499 0407a51b9d8c
child 34313 f428c347d32b
permissions -rw-r--r--
rebase: initial support for multiple destinations This patch defines `SRC` (a single source revision) and `ALLSRC` (all source revisions) to be valid names in `--dest` revset if `--src` or `--rev` is used. So destination could be defined differently according to source revisions. The names are capitalized to make it clear they are "dynamically defined", distinguishable from normal revsets (Thanks Augie for the suggestion). This is useful, for example, `-r 'orphan()' -d 'calc-dest(SRC)'` to solve instability, which seems to be a highly wanted feature. The feature is not completed, namely if `-d` overlaps with `-r`, things could go wrong. A later patch will handle that case. The feature is also gated by `experimental.rebase.multidest` config option which is default off. Differential Revision: https://phab.mercurial-scm.org/D469
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
from __future__ import absolute_import
1139d7cf9405 progress: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25847
diff changeset
     9
32049
ed42e00a5c4e progress: retry ferr.flush() and .write() on EINTR (issue5532)
Yuya Nishihara <yuya@tcha.org>
parents: 32048
diff changeset
    10
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
    11
import threading
25968
1139d7cf9405 progress: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25847
diff changeset
    12
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
    13
25968
1139d7cf9405 progress: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25847
diff changeset
    14
from .i18n import _
1139d7cf9405 progress: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25847
diff changeset
    15
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
    16
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):
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
    18
    return ' '.join(s for s in args if s)
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
    19
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
    20
def shouldprint(ui):
28171
2d20d1d2ea76 progress: display progress bar when HGPLAINEXCEPT contains "progress"
Matt Anderson <andersonmat@fb.com>
parents: 26781
diff changeset
    21
    return not (ui.quiet or ui.plain('progress')) and (
30324
cb1ea3cc44b5 progress: obtain stderr from ui
Yuya Nishihara <yuya@tcha.org>
parents: 29089
diff changeset
    22
        ui._isatty(ui.ferr) or ui.configbool('progress', 'assume-tty'))
25497
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
    23
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
    24
def fmtremaining(seconds):
26781
1aee2ab0f902 spelling: trivial spell checking
Mads Kiilerich <madski@unity3d.com>
parents: 26407
diff changeset
    25
    """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
    26
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
    27
    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
    28
    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
    29
        # i18n: format XX seconds as "XXs"
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
    30
        return _("%02ds") % (seconds)
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
    31
    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
    32
    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
    33
        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
    34
        # i18n: format X minutes and YY seconds as "XmYYs"
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
    35
        return _("%dm%02ds") % (minutes, seconds)
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
    36
    # 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
    37
    minutes += 1
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
    38
    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
    39
    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
    40
    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
    41
        # i18n: format X hours and YY minutes as "XhYYm"
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
    42
        return _("%dh%02dm") % (hours, minutes)
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
    43
    # 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
    44
    hours += 1
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
    45
    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
    46
    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
    47
    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
    48
        # i18n: format X days and YY hours as "XdYYh"
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
    49
        return _("%dd%02dh") % (days, hours)
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
    50
    # 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
    51
    days += 1
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
    52
    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
    53
    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
    54
    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
    55
        # i18n: format X weeks and YY days as "XwYYd"
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
    56
        return _("%dw%02dd") % (weeks, days)
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
    57
    # 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
    58
    weeks += 1
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
    59
    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
    60
    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
    61
    # i18n: format X years and YY weeks as "XyYYw"
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
    62
    return _("%dy%02dw") % (years, weeks)
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
    63
32049
ed42e00a5c4e progress: retry ferr.flush() and .write() on EINTR (issue5532)
Yuya Nishihara <yuya@tcha.org>
parents: 32048
diff changeset
    64
# 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
    65
# 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
    66
# 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
    67
# 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
    68
# 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
    69
# text. (issue5532)
ed42e00a5c4e progress: retry ferr.flush() and .write() on EINTR (issue5532)
Yuya Nishihara <yuya@tcha.org>
parents: 32048
diff changeset
    70
#
ed42e00a5c4e progress: retry ferr.flush() and .write() on EINTR (issue5532)
Yuya Nishihara <yuya@tcha.org>
parents: 32048
diff changeset
    71
# 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
    72
# 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
    73
def _eintrretry(func, *args):
ed42e00a5c4e progress: retry ferr.flush() and .write() on EINTR (issue5532)
Yuya Nishihara <yuya@tcha.org>
parents: 32048
diff changeset
    74
    while True:
ed42e00a5c4e progress: retry ferr.flush() and .write() on EINTR (issue5532)
Yuya Nishihara <yuya@tcha.org>
parents: 32048
diff changeset
    75
        try:
ed42e00a5c4e progress: retry ferr.flush() and .write() on EINTR (issue5532)
Yuya Nishihara <yuya@tcha.org>
parents: 32048
diff changeset
    76
            return func(*args)
ed42e00a5c4e progress: retry ferr.flush() and .write() on EINTR (issue5532)
Yuya Nishihara <yuya@tcha.org>
parents: 32048
diff changeset
    77
        except IOError as err:
ed42e00a5c4e progress: retry ferr.flush() and .write() on EINTR (issue5532)
Yuya Nishihara <yuya@tcha.org>
parents: 32048
diff changeset
    78
            if err.errno == errno.EINTR:
ed42e00a5c4e progress: retry ferr.flush() and .write() on EINTR (issue5532)
Yuya Nishihara <yuya@tcha.org>
parents: 32048
diff changeset
    79
                continue
ed42e00a5c4e progress: retry ferr.flush() and .write() on EINTR (issue5532)
Yuya Nishihara <yuya@tcha.org>
parents: 32048
diff changeset
    80
            raise
ed42e00a5c4e progress: retry ferr.flush() and .write() on EINTR (issue5532)
Yuya Nishihara <yuya@tcha.org>
parents: 32048
diff changeset
    81
25497
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
    82
class progbar(object):
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
    83
    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
    84
        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
    85
        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
    86
        self.resetstate()
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
    87
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
    88
    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
    89
        self.topics = []
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
    90
        self.topicstates = {}
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
    91
        self.starttimes = {}
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
    92
        self.startvals = {}
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
    93
        self.printed = False
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
    94
        self.lastprint = time.time() + float(self.ui.config(
33499
0407a51b9d8c codemod: register core configitems using a script
Jun Wu <quark@fb.com>
parents: 33250
diff changeset
    95
            'progress', 'delay'))
25497
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
    96
        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
    97
        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
    98
        self.indetcount = 0
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
    99
        self.refresh = float(self.ui.config(
33499
0407a51b9d8c codemod: register core configitems using a script
Jun Wu <quark@fb.com>
parents: 33250
diff changeset
   100
            'progress', 'refresh'))
25497
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   101
        self.changedelay = max(3 * self.refresh,
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   102
                               float(self.ui.config(
33499
0407a51b9d8c codemod: register core configitems using a script
Jun Wu <quark@fb.com>
parents: 33250
diff changeset
   103
                                   'progress', 'changedelay')))
25497
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   104
        self.order = self.ui.configlist(
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   105
            'progress', 'format',
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   106
            default=['topic', 'bar', 'number', 'estimate'])
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   107
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   108
    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
   109
        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
   110
            return
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   111
        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
   112
        self.printed = True
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   113
        head = ''
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   114
        needprogress = False
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   115
        tail = ''
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   116
        for indicator in self.order:
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   117
            add = ''
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   118
            if indicator == 'topic':
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   119
                add = topic
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   120
            elif indicator == 'number':
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   121
                if total:
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   122
                    add = ('% ' + str(len(str(total))) +
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   123
                           's/%s') % (pos, total)
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   124
                else:
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   125
                    add = str(pos)
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   126
            elif indicator.startswith('item') and item:
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   127
                slice = 'end'
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   128
                if '-' in indicator:
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   129
                    wid = int(indicator.split('-')[1])
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   130
                elif '+' in indicator:
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   131
                    slice = 'beginning'
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   132
                    wid = int(indicator.split('+')[1])
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   133
                else:
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   134
                    wid = 20
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   135
                if slice == 'end':
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   136
                    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
   137
                else:
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   138
                    add = encoding.trim(item, wid)
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   139
                add += (wid - encoding.colwidth(add)) * ' '
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   140
            elif indicator == 'bar':
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   141
                add = ''
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   142
                needprogress = True
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   143
            elif indicator == 'unit' and unit:
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   144
                add = unit
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   145
            elif indicator == 'estimate':
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   146
                add = self.estimate(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
   147
            elif indicator == 'speed':
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   148
                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
   149
            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
   150
                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
   151
            else:
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   152
                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
   153
        if needprogress:
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   154
            used = 0
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   155
            if head:
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   156
                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
   157
            if tail:
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   158
                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
   159
            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
   160
            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
   161
                amt = pos * progwidth // total
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   162
                bar = '=' * (amt - 1)
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   163
                if amt > 0:
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   164
                    bar += '>'
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   165
                bar += ' ' * (progwidth - amt)
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   166
            else:
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   167
                progwidth -= 3
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   168
                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
   169
                # 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
   170
                # 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
   171
                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
   172
                amt -= progwidth
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   173
                bar = (' ' * int(progwidth - abs(amt)) + '<=>' +
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   174
                       ' ' * int(abs(amt)))
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   175
            prog = ''.join(('[', bar , ']'))
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   176
            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
   177
        else:
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   178
            out = spacejoin(head, tail)
32048
c3ef33fd0058 progress: extract stubs to restart ferr.flush() and .write() on EINTR
Yuya Nishihara <yuya@tcha.org>
parents: 30324
diff changeset
   179
        self._writeerr('\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
   180
        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
   181
        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
   182
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   183
    def clear(self):
29089
222b8170d69e progress: stop excessive clearing (issue4801)
Matt Mackall <mpm@selenic.com>
parents: 28171
diff changeset
   184
        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
   185
            return
32048
c3ef33fd0058 progress: extract stubs to restart ferr.flush() and .write() on EINTR
Yuya Nishihara <yuya@tcha.org>
parents: 30324
diff changeset
   186
        self._writeerr('\r%s\r' % (' ' * self.width()))
26407
72bccc1f26b1 progress: force a repaint of a printed progress bar after a clear()
Augie Fackler <augie@google.com>
parents: 25968
diff changeset
   187
        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
   188
            # 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
   189
            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
   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 complete(self):
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   192
        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
   193
            return
33249
391da1416038 configitems: register the 'progress.clear-complete' config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32049
diff changeset
   194
        if self.ui.configbool('progress', '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
   195
            self.clear()
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   196
        else:
32048
c3ef33fd0058 progress: extract stubs to restart ferr.flush() and .write() on EINTR
Yuya Nishihara <yuya@tcha.org>
parents: 30324
diff changeset
   197
            self._writeerr('\n')
c3ef33fd0058 progress: extract stubs to restart ferr.flush() and .write() on EINTR
Yuya Nishihara <yuya@tcha.org>
parents: 30324
diff changeset
   198
        self._flusherr()
c3ef33fd0058 progress: extract stubs to restart ferr.flush() and .write() on EINTR
Yuya Nishihara <yuya@tcha.org>
parents: 30324
diff changeset
   199
c3ef33fd0058 progress: extract stubs to restart ferr.flush() and .write() on EINTR
Yuya Nishihara <yuya@tcha.org>
parents: 30324
diff changeset
   200
    def _flusherr(self):
32049
ed42e00a5c4e progress: retry ferr.flush() and .write() on EINTR (issue5532)
Yuya Nishihara <yuya@tcha.org>
parents: 32048
diff changeset
   201
        _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
   202
32048
c3ef33fd0058 progress: extract stubs to restart ferr.flush() and .write() on EINTR
Yuya Nishihara <yuya@tcha.org>
parents: 30324
diff changeset
   203
    def _writeerr(self, msg):
32049
ed42e00a5c4e progress: retry ferr.flush() and .write() on EINTR (issue5532)
Yuya Nishihara <yuya@tcha.org>
parents: 32048
diff changeset
   204
        _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
   205
25497
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   206
    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
   207
        tw = self.ui.termwidth()
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   208
        return min(int(self.ui.config('progress', 'width', default=tw)), tw)
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   209
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   210
    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
   211
        if total is None:
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   212
            return ''
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   213
        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
   214
        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
   215
        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
   216
        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
   217
            elapsed = now - self.starttimes[topic]
25847
56674fd6dabc progress: mark experimental option
Matt Mackall <mpm@selenic.com>
parents: 25581
diff changeset
   218
            # experimental config: progress.estimate
25497
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   219
            if elapsed > float(
33250
bbc57a7e8823 configitems: register the 'progress.estimate' config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33249
diff changeset
   220
                self.ui.config('progress', 'estimate')):
25497
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   221
                seconds = (elapsed * (target - delta)) // delta + 1
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   222
                return fmtremaining(seconds)
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   223
        return ''
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   224
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   225
    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
   226
        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
   227
        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
   228
        elapsed = now - self.starttimes[topic]
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   229
        if elapsed > float(
33250
bbc57a7e8823 configitems: register the 'progress.estimate' config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33249
diff changeset
   230
            self.ui.config('progress', 'estimate')):
25497
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   231
            return _('%d %s/sec') % (delta / elapsed, unit)
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   232
        return ''
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   233
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   234
    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
   235
        '''Check if conditions are met to print - e.g. changedelay elapsed'''
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   236
        if (self.lasttopic is None # first time we printed
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   237
            # 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
   238
            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
   239
            # it's been long enough we should print anyway
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   240
            or now - self.lastprint >= self.changedelay):
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   241
            return True
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   242
        else:
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   243
            return False
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   244
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   245
    def progress(self, topic, pos, item='', unit='', total=None):
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   246
        now = time.time()
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   247
        self._refreshlock.acquire()
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   248
        try:
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   249
            if pos is None:
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   250
                self.starttimes.pop(topic, None)
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   251
                self.startvals.pop(topic, None)
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   252
                self.topicstates.pop(topic, None)
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   253
                # reset the progress bar if this is the outermost topic
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   254
                if self.topics and self.topics[0] == topic and self.printed:
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   255
                    self.complete()
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   256
                    self.resetstate()
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   257
                # truncate the list of topics assuming all topics within
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   258
                # this one are also closed
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   259
                if topic in self.topics:
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   260
                    self.topics = self.topics[:self.topics.index(topic)]
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   261
                    # reset the last topic to the one we just unwound to,
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   262
                    # so that higher-level topics will be stickier than
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   263
                    # lower-level topics
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   264
                    if self.topics:
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   265
                        self.lasttopic = self.topics[-1]
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   266
                    else:
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   267
                        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
   268
            else:
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   269
                if topic not in self.topics:
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   270
                    self.starttimes[topic] = now
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   271
                    self.startvals[topic] = pos
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   272
                    self.topics.append(topic)
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   273
                self.topicstates[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
   274
                self.curtopic = topic
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   275
                if now - self.lastprint >= self.refresh and self.topics:
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   276
                    if self._oktoprint(now):
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   277
                        self.lastprint = now
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   278
                        self.show(now, topic, *self.topicstates[topic])
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   279
        finally:
93b8b0049932 progress: move most extension code into a 'mercurial.progress' module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   280
            self._refreshlock.release()