sync: merge project updates with status bar

The current sync output displays "Fetching project" and "Checking out
project" messages and progress bar updates independently leading to a
lot of spam.  Lets merge these periodic outputs with the status bar to
get a little bit tighter output in the normal case.  This doesn't solve
all our problems, but gets us closer.

Bug: https://crbug.com/gerrit/11293
Change-Id: Icd627830af4dd934a9355b7ace754b56dc96cfef
Reviewed-on: https://gerrit-review.googlesource.com/c/git-repo/+/244934
Reviewed-by: David Pursehouse <dpursehouse@collab.net>
Tested-by: Mike Frysinger <vapier@google.com>
This commit is contained in:
Mike Frysinger 2019-08-26 15:32:06 -04:00
parent b610b850ac
commit 3538dd224d
2 changed files with 7 additions and 13 deletions

View File

@ -39,7 +39,7 @@ class Progress(object):
self._print_newline = print_newline self._print_newline = print_newline
self._always_print_percentage = always_print_percentage self._always_print_percentage = always_print_percentage
def update(self, inc=1): def update(self, inc=1, msg=''):
self._done += inc self._done += inc
if _NOT_TTY or IsTrace(): if _NOT_TTY or IsTrace():
@ -62,12 +62,13 @@ class Progress(object):
if self._lastp != p or self._always_print_percentage: if self._lastp != p or self._always_print_percentage:
self._lastp = p self._lastp = p
sys.stderr.write('%s\r%s: %3d%% (%d%s/%d%s)%s' % ( sys.stderr.write('%s\r%s: %3d%% (%d%s/%d%s)%s%s%s' % (
CSI_ERASE_LINE, CSI_ERASE_LINE,
self._title, self._title,
p, p,
self._done, self._units, self._done, self._units,
self._total, self._units, self._total, self._units,
' ' if msg else '', msg,
"\n" if self._print_newline else "")) "\n" if self._print_newline else ""))
sys.stderr.flush() sys.stderr.flush()

View File

@ -315,9 +315,6 @@ later is required to fix a server side protocol bug.
# We'll set to true once we've locked the lock. # We'll set to true once we've locked the lock.
did_lock = False did_lock = False
if not opt.quiet:
print('Fetching project %s' % project.name)
# Encapsulate everything in a try/except/finally so that: # Encapsulate everything in a try/except/finally so that:
# - We always set err_event in the case of an exception. # - We always set err_event in the case of an exception.
# - We always make sure we unlock the lock if we locked it. # - We always make sure we unlock the lock if we locked it.
@ -350,7 +347,7 @@ later is required to fix a server side protocol bug.
raise _FetchError() raise _FetchError()
fetched.add(project.gitdir) fetched.add(project.gitdir)
pm.update() pm.update(msg=project.name)
except _FetchError: except _FetchError:
pass pass
except Exception as e: except Exception as e:
@ -371,7 +368,6 @@ later is required to fix a server side protocol bug.
fetched = set() fetched = set()
lock = _threading.Lock() lock = _threading.Lock()
pm = Progress('Fetching projects', len(projects), pm = Progress('Fetching projects', len(projects),
print_newline=not(opt.quiet),
always_print_percentage=opt.quiet) always_print_percentage=opt.quiet)
objdir_project_map = dict() objdir_project_map = dict()
@ -461,9 +457,6 @@ later is required to fix a server side protocol bug.
# We'll set to true once we've locked the lock. # We'll set to true once we've locked the lock.
did_lock = False did_lock = False
if not opt.quiet:
print('Checking out project %s' % project.name)
# Encapsulate everything in a try/except/finally so that: # Encapsulate everything in a try/except/finally so that:
# - We always set err_event in the case of an exception. # - We always set err_event in the case of an exception.
# - We always make sure we unlock the lock if we locked it. # - We always make sure we unlock the lock if we locked it.
@ -474,11 +467,11 @@ later is required to fix a server side protocol bug.
try: try:
try: try:
project.Sync_LocalHalf(syncbuf, force_sync=opt.force_sync) project.Sync_LocalHalf(syncbuf, force_sync=opt.force_sync)
success = syncbuf.Finish()
# Lock around all the rest of the code, since printing, updating a set # Lock around all the rest of the code, since printing, updating a set
# and Progress.update() are not thread safe. # and Progress.update() are not thread safe.
lock.acquire() lock.acquire()
success = syncbuf.Finish()
did_lock = True did_lock = True
if not success: if not success:
@ -487,7 +480,7 @@ later is required to fix a server side protocol bug.
file=sys.stderr) file=sys.stderr)
raise _CheckoutError() raise _CheckoutError()
pm.update() pm.update(msg=project.name)
except _CheckoutError: except _CheckoutError:
pass pass
except Exception as e: except Exception as e:
@ -527,7 +520,7 @@ later is required to fix a server side protocol bug.
syncjobs = 1 syncjobs = 1
lock = _threading.Lock() lock = _threading.Lock()
pm = Progress('Syncing work tree', len(all_projects)) pm = Progress('Checking out projects', len(all_projects))
threads = set() threads = set()
sem = _threading.Semaphore(syncjobs) sem = _threading.Semaphore(syncjobs)