progress/sync: include active number of jobs

Provide a bit more info to users that things are actively running.

Bug: https://crbug.com/gerrit/11293
Change-Id: Ie8eeaa8804d1ca71cf5c78ad850fa2d17d26208c
Reviewed-on: https://gerrit-review.googlesource.com/c/git-repo/+/297904
Reviewed-by: Michael Mortensen <mmortensen@google.com>
Tested-by: Mike Frysinger <vapier@google.com>
This commit is contained in:
Mike Frysinger 2021-02-23 17:34:35 -05:00
parent 4e05f650e0
commit fbb95a4342
2 changed files with 35 additions and 12 deletions

View File

@ -34,6 +34,19 @@ class Progress(object):
self._show = False
self._units = units
self._print_newline = print_newline
# Only show the active jobs section if we run more than one in parallel.
self._show_jobs = False
self._active = 0
def start(self, name):
self._active += 1
if not self._show_jobs:
self._show_jobs = self._active > 1
self.update(inc=0, msg='started ' + name)
def finish(self, name):
self.update(msg='finished ' + name)
self._active -= 1
def update(self, inc=1, msg=''):
self._done += inc
@ -55,10 +68,15 @@ class Progress(object):
sys.stderr.flush()
else:
p = (100 * self._done) / self._total
sys.stderr.write('%s\r%s: %3d%% (%d%s/%d%s)%s%s%s' % (
if self._show_jobs:
jobs = '[%d job%s] ' % (self._active, 's' if self._active > 1 else '')
else:
jobs = ''
sys.stderr.write('%s\r%s: %2d%% %s(%d%s/%d%s)%s%s%s' % (
CSI_ERASE_LINE,
self._title,
p,
jobs,
self._done, self._units,
self._total, self._units,
' ' if msg else '', msg,

View File

@ -354,6 +354,8 @@ later is required to fix a server side protocol bug.
# - We always make sure we unlock the lock if we locked it.
start = time.time()
success = False
with lock:
pm.start(project.name)
try:
try:
success = project.Sync_NetworkHalf(
@ -383,7 +385,6 @@ later is required to fix a server side protocol bug.
raise _FetchError()
fetched.add(project.gitdir)
pm.update(msg=project.name)
except _FetchError:
pass
except Exception as e:
@ -392,8 +393,10 @@ later is required to fix a server side protocol bug.
err_event.set()
raise
finally:
if did_lock:
lock.release()
if not did_lock:
lock.acquire()
pm.finish(project.name)
lock.release()
finish = time.time()
self.event_log.AddSync(project, event_log.TASK_SYNC_NETWORK,
start, finish, success)
@ -403,7 +406,7 @@ later is required to fix a server side protocol bug.
def _Fetch(self, projects, opt, err_event):
fetched = set()
lock = _threading.Lock()
pm = Progress('Fetching projects', len(projects))
pm = Progress('Fetching', len(projects))
objdir_project_map = dict()
for project in projects:
@ -493,6 +496,8 @@ later is required to fix a server side protocol bug.
syncbuf = SyncBuffer(self.manifest.manifestProject.config,
detach_head=opt.detach_head)
success = False
with lock:
pm.start(project.name)
try:
try:
project.Sync_LocalHalf(syncbuf, force_sync=opt.force_sync)
@ -508,8 +513,6 @@ later is required to fix a server side protocol bug.
print('error: Cannot checkout %s' % (project.name),
file=sys.stderr)
raise _CheckoutError()
pm.update(msg=project.name)
except _CheckoutError:
pass
except Exception as e:
@ -519,10 +522,12 @@ later is required to fix a server side protocol bug.
err_event.set()
raise
finally:
if did_lock:
if not success:
err_results.append(project.relpath)
lock.release()
if not did_lock:
lock.acquire()
if not success:
err_results.append(project.relpath)
pm.finish(project.name)
lock.release()
finish = time.time()
self.event_log.AddSync(project, event_log.TASK_SYNC_LOCAL,
start, finish, success)
@ -553,7 +558,7 @@ later is required to fix a server side protocol bug.
syncjobs = 1
lock = _threading.Lock()
pm = Progress('Checking out projects', len(all_projects))
pm = Progress('Checking out', len(all_projects))
threads = set()
sem = _threading.Semaphore(syncjobs)