mirror of
https://gerrit.googlesource.com/git-repo
synced 2024-12-21 07:16:21 +00:00
4e05f650e0
The idea for skipping some progress updates was to avoid spending too much time on the progress bar itself. Unfortunately, for large projects (100s if not 1000s) of repos, we get into the situation with large/slow checkouts that we skip showing updates when a repo finishes, but not enough repos finished to increase the percent. Since the progress bar should be relatively fast compared to the actual network & local dick operations, have it show an update whenever the caller requests it. A test with ~1000 repos shows that the progress bar in total adds <100ms. Bug: https://crbug.com/gerrit/11293 Change-Id: I708a0c4bd923c59c7691a5b48ae33eb6fca4cd14 Reviewed-on: https://gerrit-review.googlesource.com/c/git-repo/+/297903 Reviewed-by: Michael Mortensen <mmortensen@google.com> Tested-by: Mike Frysinger <vapier@google.com>
87 lines
2.4 KiB
Python
87 lines
2.4 KiB
Python
# Copyright (C) 2009 The Android Open Source Project
|
|
#
|
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
# you may not use this file except in compliance with the License.
|
|
# You may obtain a copy of the License at
|
|
#
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
# See the License for the specific language governing permissions and
|
|
# limitations under the License.
|
|
|
|
import os
|
|
import sys
|
|
from time import time
|
|
from repo_trace import IsTrace
|
|
|
|
_NOT_TTY = not os.isatty(2)
|
|
|
|
# This will erase all content in the current line (wherever the cursor is).
|
|
# It does not move the cursor, so this is usually followed by \r to move to
|
|
# column 0.
|
|
CSI_ERASE_LINE = '\x1b[2K'
|
|
|
|
|
|
class Progress(object):
|
|
def __init__(self, title, total=0, units='', print_newline=False):
|
|
self._title = title
|
|
self._total = total
|
|
self._done = 0
|
|
self._start = time()
|
|
self._show = False
|
|
self._units = units
|
|
self._print_newline = print_newline
|
|
|
|
def update(self, inc=1, msg=''):
|
|
self._done += inc
|
|
|
|
if _NOT_TTY or IsTrace():
|
|
return
|
|
|
|
if not self._show:
|
|
if 0.5 <= time() - self._start:
|
|
self._show = True
|
|
else:
|
|
return
|
|
|
|
if self._total <= 0:
|
|
sys.stderr.write('%s\r%s: %d,' % (
|
|
CSI_ERASE_LINE,
|
|
self._title,
|
|
self._done))
|
|
sys.stderr.flush()
|
|
else:
|
|
p = (100 * self._done) / self._total
|
|
sys.stderr.write('%s\r%s: %3d%% (%d%s/%d%s)%s%s%s' % (
|
|
CSI_ERASE_LINE,
|
|
self._title,
|
|
p,
|
|
self._done, self._units,
|
|
self._total, self._units,
|
|
' ' if msg else '', msg,
|
|
'\n' if self._print_newline else ''))
|
|
sys.stderr.flush()
|
|
|
|
def end(self):
|
|
if _NOT_TTY or IsTrace() or not self._show:
|
|
return
|
|
|
|
if self._total <= 0:
|
|
sys.stderr.write('%s\r%s: %d, done.\n' % (
|
|
CSI_ERASE_LINE,
|
|
self._title,
|
|
self._done))
|
|
sys.stderr.flush()
|
|
else:
|
|
p = (100 * self._done) / self._total
|
|
sys.stderr.write('%s\r%s: %3d%% (%d%s/%d%s), done.\n' % (
|
|
CSI_ERASE_LINE,
|
|
self._title,
|
|
p,
|
|
self._done, self._units,
|
|
self._total, self._units))
|
|
sys.stderr.flush()
|